Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em xin lỗi để em gửi lại ạ. Cụ thể các bước e đã làm như sau:
- Bước 1: ở sheet Raw data, em filter theo giá trị cột I, J và R. (I = 0, J = NIL, R > 0)
- Bước 2: copy dữ liệu cột C, D đã filter sang sheet thứ 2 để tính số lần xuất hiện bằng hàm countif.
- Bước 3: sau khi countif xong copy paste value dữ liệu sang sheet thứ 3 để remove duplicate (cái này bình thường em hay copy paste value thẳng trên sheet 2 luôn).
- Bước 4: filter dữ liệu có số lần xuất hiện >=4.
Lúc record macro thì em phát hiện lỗi ở đoạn mã khi mình muốn dùng hàm tính countif dữ liệu. (ví dụ bảng excel chỉ có cột A có dữ liệu và có 10 dòng thì mình muốn chọn từ ô B1-B10 để tính countif cho cột A. Tuy nhiên khi sang file có độ dài khác thì mã macro vẫn đang trỏ đến ô B10 nên không dùng được ạ).
Bạn xem file này, 4 bước của bạn gom lại thành 1 cái Click chuột.
 

File đính kèm

  • Gpe_6-6.xlsb
    416.5 KB · Đọc: 4
Upvote 0
Xin chào mọi người mình gặp vấn đề sau:
Có cách nào dùng marco tạo file excel mới chứa các marco của file cũ không ?
Mình dùng marco tạo file mới nhưng file mới ko chứa marco cũ.
Nếu lại phải tạo marco cho file mới thì rất mất thời gian.
 
Upvote 0
Xin chào mọi người mình gặp vấn đề sau:
Có cách nào dùng marco tạo file excel mới chứa các marco của file cũ không ?
Mình dùng marco tạo file mới nhưng file mới ko chứa marco cũ.
Nếu lại phải tạo marco cho file mới thì rất mất thời gian.
bạn lưu định dạng xlsm.xlsb là code có thể lưu mà.
 
Upvote 0
Em chào các anh chị,
Em mới học VBA nên còn nhiều bỡ ngỡ mong anh chị sửa giúp em câu lệnh này.

Đây là bước em làm trên Excel
Sheets("Market Values").Range("A19:dO19").Copy Destination:=Sheets("MV").Range("A2")
Sheets("Market Values").Range("A31:dO31").Copy Destination:=Sheets("MV").Range("A3")
Sheets("Market Values").Range("A43:dO43").Copy Destination:=Sheets("MV").Range("A4")
Sheets("Market Values").Range("A55:dO55").Copy Destination:=Sheets("MV").Range("A5")
Sheets("Market Values").Range("A67:dO67").Copy Destination:=Sheets("MV").Range("A6")
Sheets("Market Values").Range("A79:dO79").Copy Destination:=Sheets("MV").Range("A7")

Còn đây là code em chạy VBA:
Sub mv()
Dim i as integer
For i = 0 To 5
Sheets("Market Values").Range(Cells(19 + i * 12, 1), Cells(19 + i * 12, 119)).Copy Destination:=Sheets("MV").Cells(i + 2, 1).Paste
Next i
End Sub

Khi em chạy mà nó báo lỗi ko chạy đc ạ. Mong anh chị chỉ lỗi giúp em.
Em cảm ơn anh chị ạ
 
Upvote 0
Em chào các anh chị,
Em mới học VBA nên còn nhiều bỡ ngỡ mong anh chị sửa giúp em câu lệnh này.

Đây là bước em làm trên Excel
Sheets("Market Values").Range("A19:dO19").Copy Destination:=Sheets("MV").Range("A2")
Sheets("Market Values").Range("A31:dO31").Copy Destination:=Sheets("MV").Range("A3")
Sheets("Market Values").Range("A43:dO43").Copy Destination:=Sheets("MV").Range("A4")
Sheets("Market Values").Range("A55:dO55").Copy Destination:=Sheets("MV").Range("A5")
Sheets("Market Values").Range("A67:dO67").Copy Destination:=Sheets("MV").Range("A6")
Sheets("Market Values").Range("A79:dO79").Copy Destination:=Sheets("MV").Range("A7")

Còn đây là code em chạy VBA:
Sub mv()
Dim i as integer
For i = 0 To 5
Sheets("Market Values").Range(Cells(19 + i * 12, 1), Cells(19 + i * 12, 119)).Copy Destination:=Sheets("MV").Cells(i + 2, 1).Paste
Next i
End Sub

Khi em chạy mà nó báo lỗi ko chạy đc ạ. Mong anh chị chỉ lỗi giúp em.
Em cảm ơn anh chị ạ

Nếu vẫn thích dùng COPY thì dùng cái này (copy thì nó được định dạng và công thức (nếu có))

Cách 1 dùng range address, thêm biến ii
Mã:
For i=2 to 7
   ii= 19 + (i-2)*12
   Sheets("Market Values").Range("A" & ii & ":D" & ii).Copy Destination:=Sheets("MV").Range("A" & i)
next i

Cách 2 dùng Cells
Mã:
For i=2 to 7
   Sheets("Market Values").Cells(1,19 + (i-2)*12).Resize(,119).Copy Destination:=Sheets("MV").Cells(i,1)
next i

Cách 3, chỉ gán giá trị (VALUE) cho nhanh
Mã:
For i=2 to 7
   Sheets("MV").Cells(1,i).Resize(,119).Value = Sheets("Market Values").Cells(1,19 + (i-2)*12).Resize(,119).Value
next i

-----------------
Còn lỗi trong công thức của bạn thì (vì bạn biết vba rồi nên tôi chỉ vắn tắt): Kiểm tra lại Cells(....) gắn vào đâu?
 
Upvote 0
Nhờ các pro chỉ dùm kiểu lập trình vba của phần mềm dutoan97 là như thế nào. Mình thấy họ viết các câu lệnh ngay trên sheet. Đây là kiểu lập trình gì vậy. Làm thế nào để chạy các câu lệnh này? Thanks pro.
 

File đính kèm

  • DT972000 - khong bi loi so 9-ok.xls
    1.7 MB · Đọc: 12
Upvote 0
Chào tất cả mọi người !
nhờ mọi người xem giúp mình vì sao UDF function của mình khi gõ vào Office 2007 - 32bit không hiện ra
mình đóng gói UDF trong add-in để có thể dùng nhiều lần function trên file
link ở bài viết này:
 
Upvote 0
Chào tất cả mọi người !
nhờ mọi người xem giúp mình vì sao UDF function của mình khi gõ vào Office 2007 - 32bit không hiện ra
mình đóng gói UDF trong add-in để có thể dùng nhiều lần function trên file
link ở bài viết này:
Thử sửa bên trên thành bên dưới xem sao
Mã:
Function CONTAINER(ContNo As String) As Boolean
Mã:
Public Function CONTAINER(ContNo As String) As Boolean
 
Upvote 0
Những điều kiện cần thiết để hàm UDF hiện ra khi gõ tên nó trên bảng tính:

1. Nó phải nằm trong module căn bản, không phải sheet, không phải project khác.
2. Excel 2007 trở lên (2003 có thể dùng được UDF nhưng không bảo đảm cái tên nó hiện ra)

Người viết bài #2136 có lẽ vi phạm điều kiện 1 ở trên (theo nói thì hàm nằm ở trong add-in)
 
Upvote 0
chào add, mình xin bạn giúp đỡ điều này, như mình dừng vlookup để truy tìm các tên công việc, nhưng có nhiều đầu mục công việc khác nhau, ngắn có dài có, ngắn thì nó sẽ nằm trọn 1 hàng, những dài thì nó phải xuống hàng, vậy làm cách nào để nó tự động thêm 1 hàng bên dưới và xuống hàng ko add
 
Upvote 0
Những điều kiện cần thiết để hàm UDF hiện ra khi gõ tên nó trên bảng tính:

1. Nó phải nằm trong module căn bản, không phải sheet, không phải project khác.
2. Excel 2007 trở lên (2003 có thể dùng được UDF nhưng không bảo đảm cái tên nó hiện ra)

Người viết bài #2136 có lẽ vi phạm điều kiện 1 ở trên (theo nói thì hàm nằm ở trong add-in)
Hi Bác @VetMini
1. tôi không hiểu phải nằm trong module căn bản là sao?? bác giải thích rõ hơn được không.?
bác Alt +F11 xem addin của tôi thì sẽ thấy nó vẫn nằm trong module mà, có phải ở sheet đâu.
2. điều kiện 2 thì tôi đang dùng Office 2007 rồi mà
 
Upvote 0
Thử sửa bên trên thành bên dưới xem sao
Mã:
Function CONTAINER(ContNo As String) As Boolean
Mã:
Public Function CONTAINER(ContNo As String) As Boolean
Nếu module có dòng "Option Private Module" thì các functions và subs của nó dù bạn có Public hay không, cũng sẽ chẳng được rao bán. Bạn có thể vẫn sử dụng được, nó chỉ không rao lên thôi.
 
Upvote 0
@CHAOQUAY , vanmanhvcu

Trong Module có khai báo "Option Private Module"
Hàm không thể được gọi ở Cell của Trang tính. Cách giải quyết:
1. Xóa "Option Private Module" nếu có thể
2. Tạo và Khai báo một hàm tương tự vào module global và gọi hàm ở Private Module như dưới đây.

Các thủ tục trong Module đấy không thể gọi theo cách Global và theo kiểu khai báo Public ở một Module khác, Document, Userform hay Class.
Nên phải sử dụng phương thức của Application là Run.

Phương thức này sẽ là một Callback Function

Call Application.Run("CONTAINER", **kargs)

+ Nếu cùng workbook
A = Application.Run("CONTAINER", **kargs)​
'Khai báo tường minh khi có nhiều Hàm Private CONTAINER trong dự án​
'If <VBProject Component Module> Then​
'Application.Run("ModuleName.CONTAINER", **kargs)​
+ Nếu khác workbook:
If <Workbook Is Open> then 'Ràng buộc xem workbook đã mở chưa.​
A = Application.Run("'" & <Workbook FullName> & "'!CONTAINER", **kargs)​
'Khai báo tường minh​
'If <VBProject Component Module> Then​
'Application.Run("'" & <Workbook FullName> & "'!ModuleName.CONTAINER", **kargs)​
End if​

**kargs nhận các biến đã khai báo của thủ tục CONTAINER(ContNo)

A = Application.Run("'" & <Workbook FullName> & "'!CONTAINER", "Chuỗi")
PHP:
'Vào Module Global'
Function CONTAINERb(ContNo As String) As Boolean
    On Error Goto Ends 'Nếu không có CONTAINER ở Module1 và một số lỗi nếu có'
    CONTAINERb = Application.Run("Module1.CONTAINER", ContNo)
Ends:
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào tất cả anh/chị, em có chút vướng mắc với đoạn code sau. Em nhờ anh/chị sửa giúp em để khi em mở hộp thoại OpenDialog lên nhưng không chọn tới file nào để open mà đóng hộp thoại thì bị lỗi xoá trắng dữ lieu đang có trong ThisWorkbook.Sheets("Tong").
Em cảm ơn!
PHP:
Dim sFil As String
Dim owb As Workbook
Dim myFile As String
Dim xLastRow As Long
    myFile = Application.GetOpenFilename("Excel file (*.xls;*.xlsx),*.xls;*.xlsx", , "Select a excel file", , False)
    sFil = Dir(myFile)
    
    Do While sFil <> ""
        
        Set owb = Workbooks.Open(myFile)
        
        owb.Activate
        
        With Activate
        
            xLastRow = Application.ActiveSheet.Cells.SpecialCells(xlLastCell).Row
            
            xLastcolumn = Application.ActiveSheet.Cells.SpecialCells(xlLastCell).Column
            
            Range(Cells(1, 1), Cells(xLastRow, xLastcolumn)).Copy ThisWorkbook.Sheets("Tong").Range("A1")
        
            owb.Close False
        
            sFil = Dir
        
        End With
        
    Loop
 
Upvote 0
Web KT
Back
Top Bottom