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:
Bạn xem file & chúc buổi sáng tốt lành!
Chào Bác. Giả sử trong một trang tính đó. Tồn tại cùng một mã hàng nhưng khác số lượng và ngày nhập, phương thức find chỉ hiển thị được 1 ạ. Có cách nào để nó hiển thị trên listbox hết không ?
 
Upvote 0
Mã:
Private Sub txtBOOK_Change()
Dim Rws As Long
Dim Rng As Range, sRng As Range
With TONGHOP
    Rws = .Range("B" & Rows.Count).End(xlUp).Row
    Set Rng = .[F2].Resize(Rws)
    Set sRng = Rng.Find(Me!txtBOOK.Value, , xlValues, xlWhole)
    If sRng Is Nothing Then
   .Range("f" & Rws) = Me!txtBOOK.Text
    Else
        MsgBox "So book vua nhap da co!": Exit Sub
        End If
  End With
End Sub

Chào ACE GPE

Mình có cái code này, nó sẽ báo trùng dữ liệu khi ta nhập vào textbox.

Giờ mình muốn viết nó sang mảng thì làm sao vậy mọi người! chỉ giúp mình với (dữ liệu nằm cột F)
 
Upvote 0
Giả sử trong một trang tính đó. Tồn tại cùng một mã hàng nhưng khác số lượng và ngày nhập, với phương thức find có cách nào để nó hiển thị trên listbox hết không ?
PHP:
Private Sub CommandButton1_Click()
Dim Sh As Worksheet, Rng As Range, sRng As Range
Dim Rws As Long, W As Integer, Col As Byte
Dim MyAdd As String
ReDim Arr(1 To 35, 1 To 6)
Arr(1, 1) = "STT":                             Arr(1, 2) = "Ngày Tháng"
Arr(1, 3) = "Mã Hàng":                     Arr(1, 4) = "Sô Luong"
Arr(1, 5) = "Kê Sô":                           Arr(1, 6) = "Trang tính"
W = 1
For Each Sh In ThisWorkbook.Worksheets
    If Left(Sh.Name, 3) = "Kho" Then
        Rws = Sh.[B1].CurrentRegion.Rows.Count
        Set Rng = Sh.[B1].Resize(Rws)
        Set sRng = Rng.Find(Me!Txt_MH.Text, , xlFormulas, xlWhole)
        If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
                W = W + 1:                          Arr(W, 1) = W - 1
                Arr(W, 6) = Sh.Name
                For Col = 1 To 4
                    Arr(W, Col + 1) = Sh.Cells(sRng.Row, Col).Value
                Next Col
3               Set sRng = Rng.FindNext(sRng)   '<=|    '
            Loop While sRng.Address <> MyAdd
        End If
    End If
Next Sh
Me!lbDS.List = Arr()
End Sub
 
Upvote 0
PHP:
Private Sub CommandButton1_Click()
Dim Sh As Worksheet, Rng As Range, sRng As Range
Dim Rws As Long, W As Integer, Col As Byte
Dim MyAdd As String
ReDim Arr(1 To 35, 1 To 6)
Arr(1, 1) = "STT":                             Arr(1, 2) = "Ngày Tháng"
Arr(1, 3) = "Mã Hàng":                     Arr(1, 4) = "Sô Luong"
Arr(1, 5) = "Kê Sô":                           Arr(1, 6) = "Trang tính"
W = 1
For Each Sh In ThisWorkbook.Worksheets
    If Left(Sh.Name, 3) = "Kho" Then
        Rws = Sh.[B1].CurrentRegion.Rows.Count
        Set Rng = Sh.[B1].Resize(Rws)
        Set sRng = Rng.Find(Me!Txt_MH.Text, , xlFormulas, xlWhole)
        If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
                W = W + 1:                          Arr(W, 1) = W - 1
                Arr(W, 6) = Sh.Name
                For Col = 1 To 4
                    Arr(W, Col + 1) = Sh.Cells(sRng.Row, Col).Value
                Next Col
3               Set sRng = Rng.FindNext(sRng)   '<=|    '
            Loop While sRng.Address <> MyAdd
        End If
    End If
Next Sh
Me!lbDS.List = Arr()
End Sub
Cám ơn bác. nhân tiện Bác cho e hỏi thêm chỗ này :
3 Set sRng = Rng.FindNext(sRng) '<=| ' Loop While sRng.Address <> MyAdd
thấy khi Set sRng = findNext rồi thì điều kiện đúng, vậy sao nó vẫn Do được các vòng tiếp theo nhỉ.?
 
Upvote 0
Cám ơn bác. nhân tiện Bác cho e hỏi thêm chỗ này :
3 Set sRng = Rng.FindNext(sRng) '<=| ' Loop While sRng.Address <> MyAdd
thấy khi Set sRng = findNext rồi thì điều kiện đúng, vậy sao nó vẫn Do được các vòng tiếp theo nhỉ.?
Thì nó cũng giống như:
k = k + 1
Debug.Print k
------------------------
Debug.Print k
k = k + 1

Điều kiện đúng ở While cuối dòng sẽ lặp 1 lần cuối
 
Upvote 0
CHO MÌNH HỎI CODE NÀY SAI Ở ĐÂU Ạ? SAO NÓ K CHẠY!

Mã:
Private Sub txtBOOK_Change()
Dim vung(), dongcuoi As Long
Dim i As Long
    dongcuoi = Range("f" & Rows.Count).End(xlUp).Row
    vung = Range("a2:w" & dongcuoi).Value
  
    For i = LBound(vung, 1) To UBound(vung, 1) Step 1
    If vung(i, 6) = Me!txtBOOK.Value Then
    MsgBox "trung": Exit For
    End If
    Next i
End Sub
 
Upvote 0
Cám ơn bác. nhân tiện Bác cho e hỏi thêm chỗ này :
3 Set sRng = Rng.FindNext(sRng) '<=| ' Loop While sRng.Address <> MyAdd
thấy khi Set sRng = findNext rồi thì điều kiện đúng, vậy sao nó vẫn Do được các vòng tiếp theo nhỉ.?
hiểu
While = trong khi
trong khi điều kiện còn ĐÚNG thì tiếp tục LẶP
 
Upvote 0
Chắc nó là cái này
https://www.seagullscientific.com/label-software/barcode-label-design-and-printing/

Tôi thì nghĩ , người dùng nên chịu khó bấm in đi, sao tự động với VBA có nhanh hơn không, số lượng in nhiều không?
Bên mình scan vào excel đối chiếu có phải đúng thứ mình cần ko sau đó sẽ chia số lượng ra theo đơn hàng. Thường là chia làm 2 hoặc 3. Một ngày scan khoảng 1k lần
 
Upvote 0
Upvote 0
Các anh chị có thể cho em hỏi là sao cho em hỏi là tại sao code vlookup của em nó cứ bắt update file mới chạy nhỉ mọi người
Code như sao :

Cells("CS1"). FormulaR2C1 = Vlookup(Q2, '[data.xlxs]12.14.18$A:$L',2,0)

Trong khi đó file data vẫn nằm cố định ở chỗ cũ, em đã thử thêm vào đường dẫn link nhưng kết quả lại ra toàn #N/A
 
Upvote 0
Các thầy cùng mn cho e hỏi.
Có sự kiện nào trên From giống before_close không ạ.
Nghĩa là nếu đóng from thì file sẽ đóng luôn và tự động lưu file ạ.
Do gán nút lên From thì cài nút đc, nhưng nó lại còn có nút tắt trên góc phải nữa. Nên k biết làm sao
 
Upvote 0
Các thầy cùng mn cho e hỏi.
Có sự kiện nào trên From giống before_close không ạ.
Nghĩa là nếu đóng from thì file sẽ đóng luôn và tự động lưu file ạ.
Do gán nút lên From thì cài nút đc, nhưng nó lại còn có nút tắt trên góc phải nữa. Nên k biết làm sao
Đừng viết tắt như: r, qá, mn, e, đc, k.

Viết cho bạn bè quen biết cùng trang lứa thế nào cũng được, nhưng viết như thế trên diễn đàn đủ loại người, lứa tuổi, không quen biết là không tôn trọng người ta.

Có nhiều kiểu đóng, hủy Form. Cho dù đóng bằng cách nào thì code UserForm_QueryClose, nếu có, sẽ được thực hiện.

Vậy hãy tạo code cho UserForm_QueryClose. Trong code thì kiểm tra, cái gì là thủ phạm đóng, hủy Form. Rồi tùy vào thủ phạm và dụng ý của mình để có các cách xử lý khác nhau.

- CloseMode = vbFormControlMenu = 0: người dùng đã đóng Form bằng cách nhấn X ở góc phải phía trên, hoặc phải chuột trên thanh tiêu đề rồi chọn menu Close, hoặc nhấn tổ hợp Alt + F4. Lúc đó code QueryClose sẽ được thực hiện với CloseMode = vbFormControlMenu = 0

- CloseMode = vbFormCode = 1: Unload đã được gọi ở đâu đó, vd. trong CommandButton1_Click. Lúc đó code QueryClose sẽ được thực hiện với CloseMode = vbFormCode = 1

- CloseMode = vbAppWindows = 2: người dùng đóng Windows. Nếu người dùng đóng Windows thì Windows sẽ đóng các ứng dụng đang chạy trong đó có cả Excel, vì thế Form cũng bị đóng, tức code QueryClose sẽ được thực hiện với CloseMode = vbAppWindows = 2

- CloseMode = vbAppTaskManager = 3: người dùng kích hoạt Task Manager và thông qua nó đóng Excel, vì thế Form cũng bị đóng, tức code QueryClose sẽ được thực hiện với CloseMode = vbAppTaskManager = 3

Tự thử nghiệm với parameter Cancel. Đây là giá trị trả về. Tức có thể thiết lập Cancel = True, hoặc Cancel = False. Không thiết lập thì giống như thiết lập Cancel = False, vì Cancel = False được truyền vào UserForm_QueryClose
 
Upvote 0
Các thấy và mọi người giúp em với
Em có 1 đoạn vba
Giờ em muốn ô a1 =1 thì chạy lệnh vba được
Còn nếu a1 # 1 thì. Hiên thông báo
 
Upvote 0
Các anh cho e hỏi là cách nào xài if với #N/A không ạ, em đã thử format sang text, past value nhưng cứ khi dùng code
If Cells(i, "Cột") =" #N/A"
thì nó cứ bảo lỗi typemissmatch ạ
 
Upvote 0
Các anh cho e hỏi là cách nào xài if với #N/A không ạ, em đã thử format sang text, past value nhưng cứ khi dùng code
If Cells(i, "Cột") =" #N/A"
thì nó cứ bảo lỗi typemissmatch ạ

Đã VBA lại còn ứng dụng công thức nữa (vì #N/A thường là do công thức hàm excel trả về)
Nếu vẫn thích thế, thì để kiểm #N/A trong VBA thì xem gợi ý sau sẽ hiểu (bài này sưu tầm từ internet làm ví dụ)
Mã:
Public Function checkCells(Rg As Range) As Boolean
    Dim result As Boolean, r
    result = False
    For Each r In Rg
        If Application.WorksheetFunction.IsNA(r) Then
            result = True
            Exit For
        End If
    Next
    checkCells = result
End Function
 
Upvote 0
Cho em hỏi trong VBA có hàm nào giúp làm tròn giây thành 0 không, Ví dụ 12/7/2018 8:03:41 PM em muốn làm tròn thành 12/7/2018 8:03:00 PM (Tất cả số giây từ 1 đến 59s đều làm tròn về 0)
 
Upvote 0
Web KT

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

Back
Top Bottom