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:
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String
 
    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
         
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
         
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
        
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
        
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
Với control mình nghĩ bạn phải tạo trước khi sử dụng (mà thứ nào chắc cũng cùng nguyên tắc nhỉ!? )
Từ khóa google: Programmatically add ComboBox in VBA (Excel)

-----------
 
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
        
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
        
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
Muốn vẫn để gì thì cứ nêu mục đích cần đạt được sau đó có file mẫu. Còn hàm thì vẫn truyền tham số Combobox bình thường, trong code bạn viết không có chổ nào thể hiện hàm cả ngoại trừ Function và End Function.
 
Upvote 0
Những câu hỏi của bạn thực ra liên quan đến VBA rất ít. Chúng thực ra là hỏi cách sử dụng Form và Controls. Nên đem qua thớt ấy mà hỏi.
 
Upvote 0
Chào anh chị! làm thế nào để khi kết thúc 1 đoạn code con chỏ di chuyển đến dòng cuối cùng có dữ liệu ở excel
sub GPE ()
code.......

select dòng cuối cùng
end sub
 
Upvote 0
Những câu hỏi của bạn thực ra liên quan đến VBA rất ít. Chúng thực ra là hỏi cách sử dụng Form và Controls. Nên đem qua thớt ấy mà hỏi.
Cảm ơn ae trong diễn đàn, mình mới khởi đầu về VBA nên mong các bạn thông cảm. Đoạn code trên chỉ đơn giản là mình có nhiều cái ComboBox sử dụng chung một đoạn code, chỉ khác nhau về địa chỉ là ComboBox 1, ComboBox 2,... để đỡ phải viết lại đoạn code đã viết ở ComboBox 1 thì sang ComboBox 2 mình muốn gọi nó ra. Ví dụ:
Mã:
Sub TimtenCQ ()
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cboTenCQ1 '(chỉ khác mỗi cái tên này)
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
        
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
        
    End With
End Sub
Ở ComboBox 2 mình phải gọi Sub trên như thế nào để không phải viết lại Code mà nó có thể thay thế cboTenCQ1 thành cboTenCQ2.
 
Upvote 0
Rows(dòng cuối).Select

Code tìm dòng cuối ở đây nhiều hơn quân Nguyên, không cần nhắc lại.
---------------
Sub Dongcuoi ()
Dim Lr as Long
Lr = Range("A65000").End(xlUp).Row
Rows(Lr + 1).Select
end sub

File khác được rồi, nhưng file này lại không chuyển màn hình đến chỉ mỗi con chỏ là sao anh nhỉ
 

File đính kèm

Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.

Tại sao phải thành hàm? Sub dùng chung không được à?
 
Upvote 0
Chào các bạn trong diễn đàn, mình muốn chuyển đoạn Code sau thành Hàm để sử dụng chung, nhưng chưa biết cách khai báo biến với đối tượng là Combobox, CheckBox và OptionButtun. Mong các cạn chỉ mình cách khai báo biến với nhé.
Mã:
Function TimtenCQ(cbo As MSForms.ComboBox)
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cbo
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
       
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
       
    End With
End Function
Khi mình gọi tên hàm trên thì code báo lỗi "Method of data member not found" (ở dòng này With uf_Nhaplieu.cbo)
Với những đối tượng là Combobox, CheckBox và OptionButtun mình phải khai báo biến như thế nào nhỉ ?
Tôi sẽ giúp nếu có file, còn nhìn code không có dữ liệu để test nên thôi vậy.
 
Upvote 0
Cảm ơn ae trong diễn đàn, mình mới khởi đầu về VBA nên mong các bạn thông cảm. Đoạn code trên chỉ đơn giản là mình có nhiều cái ComboBox sử dụng chung một đoạn code, chỉ khác nhau về địa chỉ là ComboBox 1, ComboBox 2,... để đỡ phải viết lại đoạn code đã viết ở ComboBox 1 thì sang ComboBox 2 mình muốn gọi nó ra. Ví dụ:
Mã:
Sub TimtenCQ ()
Dim i As Integer, j As Integer
Dim k As String

    With uf_Nhaplieu.cboTenCQ1 '(chỉ khác mỗi cái tên này)
        .DropDown
        i = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets("CQ").Range("I:I"))
        k = "*" & UCase(.Text) & "*"
        .List = ThisWorkbook.Sheets("CQ").Range("I1:I" & i).Value
      
            For j = .ListCount - 1 To 1 Step -1
            If Not UCase(.List(j)) Like k Then
                .RemoveItem (j)
            End If
            Next j
      
    End With
End Sub
Ở ComboBox 2 mình phải gọi Sub trên như thế nào để không phải viết lại Code mà nó có thể thay thế cboTenCQ1 thành cboTenCQ2.

Đại loại nó thế này:

Mã:
Public function CreateCbo() as ComboBox
End function

Public sub WorkWithCbo(combox as ComboBox)
End sub

'Working:
Sub dosomthing()
Dim cbox as ComboBox= CreateCbo()
call WorkWithCbo(cbox)

end sub
 
Upvote 0
Cho em hỏi! Function không hoạt động được ở sheet ạ mà phải cho sang modules mới chạy được..
Mã:
Function MacBeTong(str As String) As Long
    Dim Tmp, J As Long, i As Long, DK As Boolean, LenTex As Long, Num As Long
    DK = False
    Tmp = Split(str, " ")
    For J = 0 To UBound(Tmp)
        LenText = Len(Tmp(J))
        If LenText > 0 Then
            For i = 1 To LenText
                If IsNumeric(Mid(Tmp(J), i, 1)) Then
                    DK = True
                    Num = Num & Mid(Tmp(J), i, 1)
                End If
            Next i
            If DK = True Then
                MacBeTong = Num
                Exit Function
            End If
        End If
    Next J
    End Function
 
Upvote 0
Bạn biết cách làm chỉ mình với


Mã:
Public Sub TimtenCQ(frm As MSForms.Userform, cboName As String)
Dim i As Integer, j As Integer
Dim k As String

    With frm.Controls(cboName)
        .DropDown
        ......

Gọi Sub trong Userform:

Mã:
Private Sub ComboBox1_Change()
Call TimTenCQ(Me, Me.ComboBox1.Name)

Hoặc:

Call TimTenCQ(Me, "ComboBox1")

End Sub
 
Upvote 0
Đại loại nó thế này:

Mã:
Public function CreateCbo() as ComboBox
End function

Public sub WorkWithCbo(combox as ComboBox)
End sub

'Working:
Sub dosomthing()
Dim cbox as ComboBox= CreateCbo()
call WorkWithCbo(cbox)

end sub
Mã:
Public Sub TimtenCQ(frm As MSForms.Userform, cboName As String)
Dim i As Integer, j As Integer
Dim k As String

    With frm.Controls(cboName)
        .DropDown
        ......

Gọi Sub trong Userform:

Mã:
Private Sub ComboBox1_Change()
Call TimTenCQ(Me, Me.ComboBox1.Name)

Hoặc:

Call TimTenCQ(Me, "ComboBox1")

End Sub
cảm ơn bạn, thật tuyệt, mình làm được rồi. Với đối tượng là Checkbox hoặc OptionButtun thì phải khai như thế nào vậy bạn. Chỉ giúp mình luôn được không.
 
Upvote 0
cảm ơn bạn, thật tuyệt, mình làm được rồi. Với đối tượng là Checkbox hoặc OptionButtun thì phải khai như thế nào vậy bạn. Chỉ giúp mình luôn được không.

Thì cứ thay tên control bất kỳ nào cũng được miễn là cái Sub/ Function thực hiện các phương thức thuộc tính phù hợp với control đó thôi.
Vd: Call TimTenCQ (Me, “txtTen”)
 
Upvote 0
Thì cứ thay tên control bất kỳ nào cũng được miễn là cái Sub/ Function thực hiện các phương thức thuộc tính phù hợp với control đó thôi.
Vd: Call TimTenCQ (Me, “txtTen”)
Tìm thì phỉ trả về chứ. Đó là tại sao "hàm" mà không phải là "sub"

...
'Working:
Sub dosomthing()
deploy (sử dụng), không phải "working"

Cho em hỏi! Function không hoạt động được ở sheet ạ mà phải cho sang modules mới chạy được..
...
Bao giờ quý vị mới chịu học cách đặt câu hỏi cho rõ ràng nhỉ?

"không hoạt động được ở sheet" có nghĩa là gì? code của sheet không gọi được nó? nó là code của sheet? code nào gọi nó?

Mỗi module là một không gian ký danh (namespace) riêng. Code nằm trong module thường thì được mặc định không gian, trừ phi chúng trùng tên nhau. Code nằm trong sheet thì không được mặc định. Muốn gọi sub/function nằm trong sheet nào thì phải gọi đúng tên với tiền tố là ký danh không gian của nó. Ví dụ function abc nằm trong sheet1 thì ngoài sheet1 muón gọi nó phải gọi sheet1.abc
 
Upvote 0
Tìm thì phỉ trả về chứ. Đó là tại sao "hàm" mà không phải là "sub"


deploy (sử dụng), không phải "working"


Bao giờ quý vị mới chịu học cách đặt câu hỏi cho rõ ràng nhỉ?

"không hoạt động được ở sheet" có nghĩa là gì? code của sheet không gọi được nó? nó là code của sheet? code nào gọi nó?

Mỗi module là một không gian ký danh (namespace) riêng. Code nằm trong module thường thì được mặc định không gian, trừ phi chúng trùng tên nhau. Code nằm trong sheet thì không được mặc định. Muốn gọi sub/function nằm trong sheet nào thì phải gọi đúng tên với tiền tố là ký danh không gian của nó. Ví dụ function abc nằm trong sheet1 thì ngoài sheet1 muón gọi nó phải gọi sheet1.abc
function nằm ở sheet riêng, em chưa biết cách làm, anh vào xem dùm em với ạ
 

File đính kèm

  • Book2.xlsm
    Book2.xlsm
    80.4 KB · Đọc: 10
  • Untitled.png
    Untitled.png
    12.8 KB · Đọc: 11
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom