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:
Giúp làm ngắn đoạn code này

Nhờ các bạn trên diễn đàn giúp mình làm ngắn đoạn code này và khoa học hơn với.
mục đích của đoạn code này là kiểm tra tất cả các cột trong query "QR01_TKH_Import" có S=0 thì Hide những cột L tương ứng!
Mã:
Private Sub PO_AfterUpdate()
On Error GoTo loi
    If (DLookup("S01", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L01.Properties("ColumnHidden") = True
    Else
        L01.Properties("ColumnHidden") = False
    End If
    If (DLookup("S02", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L02.Properties("ColumnHidden") = True
    Else
        L02.Properties("ColumnHidden") = False
    End If
    If (DLookup("S03", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L03.Properties("ColumnHidden") = True
    Else
        L03.Properties("ColumnHidden") = False
    End If
    If (DLookup("S04", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L04.Properties("ColumnHidden") = True
    Else
        L04.Properties("ColumnHidden") = False
    End If
    If (DLookup("S05", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L05.Properties("ColumnHidden") = True
    Else
        L05.Properties("ColumnHidden") = True
    End If
    If (DLookup("S06", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L06.Properties("ColumnHidden") = True
    Else
        L06.Properties("ColumnHidden") = True
    End If
    If (DLookup("S07", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L07.Properties("ColumnHidden") = True
    Else
        L07.Properties("ColumnHidden") = True
    End If
    If (DLookup("S08", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L08.Properties("ColumnHidden") = True
    Else
        L08.Properties("ColumnHidden") = True
    End If
    If (DLookup("S09", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L09.Properties("ColumnHidden") = True
    Else
        L09.Properties("ColumnHidden") = True
    End If
    If (DLookup("S10", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L10.Properties("ColumnHidden") = True
    Else
        L10.Properties("ColumnHidden") = True
    End If
    If (DLookup("S11", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L11.Properties("ColumnHidden") = True
    Else
        L11.Properties("ColumnHidden") = True
    End If
    If (DLookup("S12", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L12.Properties("ColumnHidden") = True
    Else
        L12.Properties("ColumnHidden") = True
    End If
    If (DLookup("S13", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L13.Properties("ColumnHidden") = True
    Else
        L13.Properties("ColumnHidden") = True
    End If
    If (DLookup("S14", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L14.Properties("ColumnHidden") = True
    Else
        L14.Properties("ColumnHidden") = True
    End If
    If (DLookup("S15", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L15.Properties("ColumnHidden") = True
    Else
        L15.Properties("ColumnHidden") = True
    End If
    If (DLookup("S16", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L16.Properties("ColumnHidden") = True
    Else
        L16.Properties("ColumnHidden") = True
    End If
    If (DLookup("S17", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L17.Properties("ColumnHidden") = True
    Else
        L17.Properties("ColumnHidden") = True
    End If
    If (DLookup("S18", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L18.Properties("ColumnHidden") = True
    Else
        L18.Properties("ColumnHidden") = True
    End If
    If (DLookup("S19", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L19.Properties("ColumnHidden") = True
    Else
        L19.Properties("ColumnHidden") = True
    End If
    If (DLookup("S20", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L20.Properties("ColumnHidden") = True
    Else
        L20.Properties("ColumnHidden") = True
    End If
    If (DLookup("S21", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L21.Properties("ColumnHidden") = True
    Else
        L21.Properties("ColumnHidden") = True
    End If
    If (DLookup("S22", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L22.Properties("ColumnHidden") = True
    Else
        L22.Properties("ColumnHidden") = True
    End If
    If (DLookup("S23", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L23.Properties("ColumnHidden") = True
    Else
        L23.Properties("ColumnHidden") = True
    End If
    If (DLookup("S24", "QR01_TKH_Import", "POT='" & POT & "'") = 0) Then
        L24.Properties("ColumnHidden") = True
    Else
        L24.Properties("ColumnHidden") = True
    End If
    If (DLookup("S25", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L25.Properties("ColumnHidden") = True
    Else
        L25.Properties("ColumnHidden") = True
    End If
    If (DLookup("S26", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L26.Properties("ColumnHidden") = True
    Else
        L26.Properties("ColumnHidden") = True
    End If
    If (DLookup("S27", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L27.Properties("ColumnHidden") = True
    Else
        L27.Properties("ColumnHidden") = True
    End If
    If (DLookup("S28", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L28.Properties("ColumnHidden") = True
    Else
        L28.Properties("ColumnHidden") = True
    End If
    If (DLookup("S29", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L29.Properties("ColumnHidden") = True
    Else
        L29.Properties("ColumnHidden") = True
    End If
    If (DLookup("S30", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L30.Properties("ColumnHidden") = True
    Else
        L30.Properties("ColumnHidden") = True
    End If
    If (DLookup("S31", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L31.Properties("ColumnHidden") = True
    Else
        L31.Properties("ColumnHidden") = True
    End If
    If (DLookup("S32", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L32.Properties("ColumnHidden") = True
    Else
        L32.Properties("ColumnHidden") = True
    End If
    If (DLookup("S33", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L33.Properties("ColumnHidden") = True
    Else
        L33.Properties("ColumnHidden") = True
    End If
    If (DLookup("S34", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L34.Properties("ColumnHidden") = True
    Else
        L34.Properties("ColumnHidden") = True
    End If
    If (DLookup("S35", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L35.Properties("ColumnHidden") = True
    Else
        L35.Properties("ColumnHidden") = True
    End If
    If (DLookup("S36", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L36.Properties("ColumnHidden") = True
    Else
        L36.Properties("ColumnHidden") = True
    End If
    If (DLookup("S37", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L37.Properties("ColumnHidden") = True
    Else
        L37.Properties("ColumnHidden") = True
    End If
    If (DLookup("S38", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L38.Properties("ColumnHidden") = True
    Else
        L38.Properties("ColumnHidden") = True
    End If
    If (DLookup("S39", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L39.Properties("ColumnHidden") = True
    Else
        L39.Properties("ColumnHidden") = True
    End If
    Exit Sub
loi:
    MsgBox Err.Description
End Sub

Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như bạn dùng cho ACCESS thì phải. Bạn thử với cái này xem:

[GPECODE=vb]Private Sub PO_AfterUpdate()
On Error GoTo loi
Dim i As Long, n As String
For i = 1 To 39
n = Format(i, "00")
Fields("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "POT='" & PO & "'") = 0)
Next
Exit Sub
loi:
MsgBox Err.Description
End Sub
[/GPECODE]


===============================================

Không biết code bạn viết có gì đặc biệt không, nhưng từ L05 trở đi thì tất cả các điều kiện cho ra giá trị là TRUE mà không phải là TRUE và FALSE.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình dùng access bạn ơi!

code của bạn bị lổi rồi!
Fields("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "POT='" & PO & "'") = 0)
nhờ bạn xem lại!
 
Upvote 0
Mình dùng access bạn ơi!

code của bạn bị lổi rồi!
Fields("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "POT='" & PO & "'") = 0)
nhờ bạn xem lại!

Trước hết, code của bạn có chạy bị lỗi không? Tôi chỉ căn cứ code của bạn mà rút gọn thôi.

Hay bạn thử gửi cái file đó lên xem sao. Tôi thấy thực tế sẽ dễ dàng thực hiện hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin nói lại ý đồ của mình là khi mình nhập PO thì tự động nó sẽ dò trong query có số lượng hay không nếu bằng không thì hide cột L tương ứng và cột S tương ứng trong hai sub form!
 

File đính kèm

  • Data.rar
    102.2 KB · Đọc: 56
Upvote 0
Mình xin nói lại ý đồ của mình là khi mình nhập PO thì tự động nó sẽ dò trong query có số lượng hay không nếu bằng không thì hide cột L tương ứng và cột S tương ứng trong hai sub form!

Bạn gửi file lên tôi mới biết được mình phải làm gì. Bây giờ bạn thử chép đoạn code vào trong form bạn xem sao!

Mã:
Private Sub PO_AfterUpdate()
    On Error GoTo loi
    Dim i As Long, n As String
    For i = 1 To 39
        n = Format(i, "00")
        Controls("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "PO='" & PO & "'") = 0)
    Next
    Exit Sub
loi:
    MsgBox Err.Description
End Sub
 
Upvote 0
Chân thành cảm ơn sự nhiệt tình của bạn!

tiện cho mình hỏi mình muôn hide luôn những cột S* trong form sub _TKH_Import có số liệu =0 được không?
 
Upvote 0
Chân thành cảm ơn sự nhiệt tình của bạn!

tiện cho mình hỏi mình muôn hide luôn những cột S* trong form sub _TKH_Import có số liệu =0 được không?

Được chứ bạn! Bạn chép code này để thay thế cho code trước bạn nhé!

Mã:
Option Compare Database


Private Sub PO_AfterUpdate()
    On Error GoTo loi
    Dim i As Long, n As String
    For i = 1 To 39
        n = Format(i, "00")
        If (DLookup("S" & n, "QR01_TKH_Import", "PO='" & PO & "'") = 0) Then
            Controls("L" & n).Properties("ColumnHidden") = True
            Form_F01_TKH_Import.Controls("S" & n).Properties("ColumnHidden") = True
        Else
            Controls("L" & n).Properties("ColumnHidden") = False
            Form_F01_TKH_Import.Controls("S" & n).Properties("ColumnHidden") = False
        End If
    Next
    Exit Sub
loi:
    MsgBox Err.Description
End Sub

Hoặc muốn ngắn gọn hơn, bạn thêm một biến Boolean vào:

Mã:
Private Sub PO_AfterUpdate()
    On Error GoTo loi
    Dim i As Long, n As String, IsTest As Boolean
    For i = 1 To 39
        n = Format(i, "00")
        IsTest = (DLookup("S" & n, "QR01_TKH_Import", "PO='" & PO & "'") = 0)
        Controls("L" & n).Properties("ColumnHidden") = IsTest
        Form_F01_TKH_Import.Controls("S" & n).Properties("ColumnHidden") = IsTest
    Next
    Exit Sub
loi:
    MsgBox Err.Description
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
* Bạn thử record macro Hàm if() ---> sẽ suy ra cách viết trong vba ( cụ thể ở đây bạn thiếu dấu "")
* Sau khi sửa được câu lệnh if, bạn sẽ gặp lỗi khi gán giá trị xuống sheet bằng câu lệnh :....=MyArr , vì trong mảng của bạn chứa 2 kiểu : 1 kiểu là range.value và 1 kiểu là range.formulaR1C1 sao mà được

Vâng cám ơn Bác, vậy muốn gán Ô để chứa công thức IF đó thì E phải làm như thế nào ạ..? Cụ thể trong bài của E, mỗi lần ghi 1 dòng mới thì ô cuối cùng tự động gán 1 công thức if vào..!
 
Upvote 0
Cho mình hỏi thêm vấn đề như thế này với:
Đoạn code sau mình muốn gán biến "myrange" của mình bằng vùng A2:A20
Set myrange = .Worksheets("sheet1").[2:1 , 20:1]
cho hỏi là cú pháp có sai không vây?
 
Upvote 0
Trời đất. Có vậy mà cũng hỏi. Test thử thì biết liền chứ gì.

Nếu hông biết test thì về học cách dùng Immediate Window cho nhuyễn rồi hãy tiếp tục học code.
 
Upvote 0
Ui đang tập viết code nhưng chưa viết xong. Nhớ mang máng không biết đúng không? thế lại phải tự test ah?
Thế cho mình hỏi nữa là câu lệnh thoát khỏi vòng lập ngay lập tức là gì vây? mình đang dùng vòng for each....
 
Lần chỉnh sửa cuối:
Upvote 0
Ui đang tập viết code nhưng chưa viết xong. Nhớ mang máng ko biết đúng không? thế lại phải tự test ah?

Chứ chẳng lẽ cái gì cũng nhờ
Test thế này:
Mã:
Sub Test
  Dim [B]myrange[/B] as Range
  [B][COLOR=#ff0000]Set myrange = .Worksheets("sheet1").[2:1 , 20:1] [/COLOR] [COLOR=#000000]'<--- Code này của bạn nha (tôi không biết)[/COLOR]
  myrange.Select[/B]
End Sub
Chạy thử, nếu nó chẳng báo lỗi gì và Select 1 vùng nào đó thì cái của bạn ĐÚNG. Bằng ngược lại thì... LÀM LẠI
Thế thôi
 
Upvote 0
Chứ chẳng lẽ cái gì cũng nhờ
Test thế này:
Mã:
Sub Test
  Dim [B]myrange[/B] as Range
  [B][COLOR=#ff0000]Set myrange = .Worksheets("sheet1").[2:1 , 20:1] [/COLOR] [COLOR=#000000]'<--- Code này của bạn nha (tôi không biết)[/COLOR]
  myrange.Select[/B]
End Sub
Chạy thử, nếu nó chẳng báo lỗi gì và Select 1 vùng nào đó thì cái của bạn ĐÚNG. Bằng ngược lại thì... LÀM LẠI
Thế thôi
Đấy giải thích như anh mới dễ làm chứ. Giờ em đã hiểu rùi chỉ cần cho nó vào một thủ tục chỉ có câu lệch đó chạy không thấy báo lỗi gì là được phải không anh. Cảm ơn anh nhé.
Giúp em luôn câu lệnh thoát khỏi luôn các vòng lập với?
 
Upvote 0
Upvote 0
Vâng cám ơn Bác, vậy muốn gán Ô để chứa công thức IF đó thì E phải làm như thế nào ạ..? Cụ thể trong bài của E, mỗi lần ghi 1 dòng mới thì ô cuối cùng tự động gán 1 công thức if vào..!
Có nhất thiết phải kèm theo hàm If trong vba không ? lý do:
-- Chữ giỏi sẽ bị lỗi font ( <--- bạn phải dùng thêm vài ký tự unicode để giải quyết việc này)
--- nếu viết code để gán công thức vào excel --> thì ta viết luôn công thức vào excel cho xong
Bạn thử cách này xem:
* Công thức cho F2 :
PHP:
=IF(AND(C2="",D2="",E2=""),"",(C2+D2+E2)/3)
* Công thức cho G2 tại sheet DL :
PHP:
=IF(F2="","",IF(F2>8,"Giỏi",IF(AND(F2<=8,F2>5),"TB","Kém")))
--> bạn kéo công thức này xuống hết !

* Khi đó code có thể dùng như sau :
PHP:
Sub ghiDL()    
  Sheets("Nhap").Range("C4:C8").Copy    
  Sheets("DL").Range("A65536").End(3).Offset(1).PasteSpecial Transpose:=True    
  Application.CutCopyMode = False
End Sub
 
Upvote 0
Trợ giúp Marco/VBA

Sheet 1 Mình có cột A và B có chứa dữ liệu
Bên cạnh đó mình có nút bấm marco.
Mình đã ghi marco cho nút bấm để copy dữ liệu cột A và B trong cùng 1 hàng vào ô A2 và B2
Nhưng như vậy mình phải tạo nhiều marco cho mỗi 1 nút bấm
Có cách nào mà mình chỉ cần tạo 1 sub mà khi bấm nút thì dữ liệu tự điền vào ô A2 và B2 không?
Mong mọi người trợ giúp, thanks
Mình gửi file đính kèm
( Bấm nút Brazil thì dữ liệu Brazil&tid=q vào ô A2 , Brazil&tid=c vào ô B2 , tương tự với các nút bấm khác cũng vậy )
 

File đính kèm

  • VBA.Marco.xlsm
    16.5 KB · Đọc: 21
Upvote 0
Có nhất thiết phải kèm theo hàm If trong vba không ? lý do:
-- Chữ giỏi sẽ bị lỗi font ( <--- bạn phải dùng thêm vài ký tự unicode để giải quyết việc này)
--- nếu viết code để gán công thức vào excel --> thì ta viết luôn công thức vào excel cho xong
Bạn thử cách này xem:
* Công thức cho F2 :
PHP:
=IF(AND(C2="",D2="",E2=""),"",(C2+D2+E2)/3)
* Công thức cho G2 tại sheet DL :
PHP:
=IF(F2="","",IF(F2>8,"Giỏi",IF(AND(F2<=8,F2>5),"TB","Kém")))
--> bạn kéo công thức này xuống hết !

* Khi đó code có thể dùng như sau :
PHP:
Sub ghiDL()    
  Sheets("Nhap").Range("C4:C8").Copy    
  Sheets("DL").Range("A65536").End(3).Offset(1).PasteSpecial Transpose:=True    
  Application.CutCopyMode = False
End Sub

Oài làm như Bác chỉ thì E cũng đã biết rồi ạ..

Vấn đề của E là cần Bác giúp E gán lệnh IF vào mỗi lần ghi dữ liệu mới vào sheet "Dulieu" thôi ạ (lỗi font cũng không vấn đề gì) CÓ ĐƯỢC KHÔNG Ạ???
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom