Lỗi VBA Vlookup.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Dung Nguyen 25121997

Thành viên mới
Tham gia
4/8/22
Bài viết
7
Được thích
0
Chào mọi người,

Em đang viết code thì bị lỗi "Unable to get Vlookup Property of the WorksheetFunction Class".

Em muốn dùng hàm vlookup để tìm nhiều số VAT invoice có cùng 1 số Bill.

Em dùng hàm Offset đi với Range để thay đổi vùng tìm bằng cách chuyển dòng tới dòng kế tiếp dòng của giá trị hàm vlookup tìm được lần đầu tiên.
Mong các anh chị có thể hướng dẫn ạ.

Em cám ơn nhiều

For k = 0 To lastrow
soVAT = Application.WorksheetFunction.VLookup(bien, Sheets(2).Range("Q2:R1000").Offset(k, 0), 2, False)
If soVAT = "" Then
Sheets(4).Cells(i, "Q") = "Missing VAT"
Else
Sheets(4).Cells(i, "Q") = Sheets(4).Cells(i, "Q") & "," & soVAT
m = Sheets(2).Range("R2:R1000").Find(soVAT). Row
k = m + 1
End If
Next k
 
Chào mọi người,

Em đang viết code thì bị lỗi "Unable to get Vlookup Property of the WorksheetFunction Class".

Em muốn dùng hàm vlookup để tìm nhiều số VAT invoice có cùng 1 số Bill.

Em dùng hàm Offset đi với Range để thay đổi vùng tìm bằng cách chuyển dòng tới dòng kế tiếp dòng của giá trị hàm vlookup tìm được lần đầu tiên.
Mong các anh chị có thể hướng dẫn ạ.

Em cám ơn nhiều

For k = 0 To lastrow
soVAT = Application.WorksheetFunction.VLookup(bien, Sheets(2).Range("Q2:R1000").Offset(k, 0), 2, False)
If soVAT = "" Then
Sheets(4).Cells(i, "Q") = "Missing VAT"
Else
Sheets(4).Cells(i, "Q") = Sheets(4).Cells(i, "Q") & "," & soVAT
m = Sheets(2).Range("R2:R1000").Find(soVAT). Row
k = m + 1
End If
Next k
Ít ít cũng phải có cái file xem mặt mũi cái nơi lấy dữ liệu nó như thế nào thì mới tính được chứ!
 
Em muốn dùng hàm vlookup để tìm nhiều số VAT invoice có cùng 1 số Bill.
Em dùng hàm Offset đi với Range để thay đổi vùng tìm bằng cách chuyển dòng tới dòng kế tiếp dòng của giá trị hàm vlookup tìm được lần đầu tiên.
Đây là lĩnh vực của Find và FindNext Method nhé. Đưa vlookup vô làm chi cho rườm rà.
Bạn làm theo gợi ý, nếu không xong thì post file mẫu lên nhé.
 
Chào mọi người,

Em đang viết code thì bị lỗi "Unable to get Vlookup Property of the WorksheetFunction Class".

Em muốn dùng hàm vlookup để tìm nhiều số VAT invoice có cùng 1 số Bill.

Em dùng hàm Offset đi với Range để thay đổi vùng tìm bằng cách chuyển dòng tới dòng kế tiếp dòng của giá trị hàm vlookup tìm được lần đầu tiên.
Mong các anh chị có thể hướng dẫn ạ.

Em cám ơn nhiều

For k = 0 To lastrow
soVAT = Application.WorksheetFunction.VLookup(bien, Sheets(2).Range("Q2:R1000").Offset(k, 0), 2, False)
If soVAT = "" Then
Sheets(4).Cells(i, "Q") = "Missing VAT"
Else
Sheets(4).Cells(i, "Q") = Sheets(4).Cells(i, "Q") & "," & soVAT
m = Sheets(2).Range("R2:R1000").Find(soVAT). Row
k = m + 1
End If
Next k
Bạn nhầm ở chỗ này: VLookup(bien, Sheets(2).Range("Q2:R1000").Offset(k, 0), 2, False)
Lẽ ra phải là: VLookup(bien, Sheets(2).Range("Q2:R1000"), 2, False).Offset(k, 0)
 
Đây là lĩnh vực của Find và FindNext Method nhé. Đưa vlookup vô làm chi cho rườm rà.
Bạn làm theo gợi ý, nếu không xong thì post file mẫu lên nhé.
Dạ em xin gửi mẫu á, e có tìm hiểu find và findnext nhưng không hiểu lắm cách áp dụng sao để tìm số VAT từ số Bill ạ(@$%@(@$%@
Bài đã được tự động gộp:

Bạn nhầm ở chỗ này: VLookup(bien, Sheets(2).Range("Q2:R1000").Offset(k, 0), 2, False)
Lẽ ra phải là: VLookup(bien, Sheets(2).Range("Q2:R1000"), 2, False).Offset(k, 0)
Em có thử sửa nhưng ra "Object required ạ"
 

File đính kèm

  • Sales Incentives Template.xlsb
    38.6 KB · Đọc: 2
Dùng thử code này nhé:
PHP:
Sub Tim_so_VAT()
Dim i&, lr&, rng
Dim dic As Object, st As String, key, s, vat As String, ngay As String
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Invoice Data")
    lr = .Cells(Rows.Count, "Q").End(xlUp).Row
    rng = .Range("Q2:S" & lr).Value
    For i = 1 To UBound(rng)
        If rng(i, 1) <> "" Then
            st = rng(i, 2) & ";" & IIf(rng(i, 3) <> "", Left(rng(i, 3), 11), "No date")
            If Not dic.exists(rng(i, 1)) Then
                dic.Add rng(i, 1), st
            Else
                dic(rng(i, 1)) = dic(rng(i, 1)) & ";" & st
            End If
        End If
    Next
End With
With Sheets("Sales incentive template")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    For i = 8 To lr
        If Not IsEmpty(.Cells(i, "E")) Then
            For Each key In dic.keys
                If .Cells(i, "E").Value = key Then
                    s = Split(dic(key), ";"): vat = "": ngay = ""
                    For j = 0 To UBound(s)
                        If j Mod 2 = 0 Then
                            vat = IIf(vat = "", "", vat & ";") & s(j)
                        Else
                            ngay = IIf(ngay = "", "", ngay & ";") & s(j)
                        End If
                    Next
                    .Cells(i, "Q").Value = vat
                    .Cells(i, "R").Value = ngay
                End If
            Next
        End If
        If .Cells(i, "Q").Value = "" Then .Cells(i, "Q").Value = "Not VAT found"
    Next
End With
End Sub
 

File đính kèm

  • Sales Incentives Template.xlsb
    39.6 KB · Đọc: 7
Dạ em cám ơn anh nhiều, code chạy được nhưng để em nghiệm lại cách chạy tại nó hơi pro so với trình của em ạ. @$@!^%ám
Một lần nữa xin cám ơn anh nhiều ạ.
Dùng thử code này nhé:
PHP:
Sub Tim_so_VAT()
Dim i&, lr&, rng
Dim dic As Object, st As String, key, s, vat As String, ngay As String
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Invoice Data")
    lr = .Cells(Rows.Count, "Q").End(xlUp).Row
    rng = .Range("Q2:S" & lr).Value
    For i = 1 To UBound(rng)
        If rng(i, 1) <> "" Then
            st = rng(i, 2) & ";" & IIf(rng(i, 3) <> "", Left(rng(i, 3), 11), "No date")
            If Not dic.exists(rng(i, 1)) Then
                dic.Add rng(i, 1), st
            Else
                dic(rng(i, 1)) = dic(rng(i, 1)) & ";" & st
            End If
        End If
    Next
End With
With Sheets("Sales incentive template")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    For i = 8 To lr
        If Not IsEmpty(.Cells(i, "E")) Then
            For Each key In dic.keys
                If .Cells(i, "E").Value = key Then
                    s = Split(dic(key), ";"): vat = "": ngay = ""
                    For j = 0 To UBound(s)
                        If j Mod 2 = 0 Then
                            vat = IIf(vat = "", "", vat & ";") & s(j)
                        Else
                            ngay = IIf(ngay = "", "", ngay & ";") & s(j)
                        End If
                    Next
                    .Cells(i, "Q").Value = vat
                    .Cells(i, "R").Value = ngay
                End If
            Next
        End If
        If .Cells(i, "Q").Value = "" Then .Cells(i, "Q").Value = "Not VAT found"
    Next
End With
End Sub
 
Dùng thử code này nhé:
PHP:
Sub Tim_so_VAT()
Dim i&, lr&, rng
Dim dic As Object, st As String, key, s, vat As String, ngay As String
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Invoice Data")
    lr = .Cells(Rows.Count, "Q").End(xlUp).Row
    rng = .Range("Q2:S" & lr).Value
    For i = 1 To UBound(rng)
        If rng(i, 1) <> "" Then
            st = rng(i, 2) & ";" & IIf(rng(i, 3) <> "", Left(rng(i, 3), 11), "No date")
            If Not dic.exists(rng(i, 1)) Then
                dic.Add rng(i, 1), st
            Else
                dic(rng(i, 1)) = dic(rng(i, 1)) & ";" & st
            End If
        End If
    Next
End With
With Sheets("Sales incentive template")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    For i = 8 To lr
        If Not IsEmpty(.Cells(i, "E")) Then
            For Each key In dic.keys
                If .Cells(i, "E").Value = key Then
                    s = Split(dic(key), ";"): vat = "": ngay = ""
                    For j = 0 To UBound(s)
                        If j Mod 2 = 0 Then
                            vat = IIf(vat = "", "", vat & ";") & s(j)
                        Else
                            ngay = IIf(ngay = "", "", ngay & ";") & s(j)
                        End If
                    Next
                    .Cells(i, "Q").Value = vat
                    .Cells(i, "R").Value = ngay
                End If
            Next
        End If
        If .Cells(i, "Q").Value = "" Then .Cells(i, "Q").Value = "Not VAT found"
    Next
End With
End Sub
If .Cells(i, "E").Value = key Then
s = Split(dic(key), ";"): vat = "": ngay = ""
For j = 0 To UBound(s)
If j Mod 2 = 0 Then
vat = IIf(vat = "", "", vat & ";") & s(j)
Else
ngay = IIf(ngay = "", "", ngay & ";") & s(j)
End If
anh có thể giải thích giúp em phần này tại sao dùng như vậy được ko ạ. :<
 
If .Cells(i, "E").Value = key Then
s = Split(dic(key), ";"): vat = "": ngay = ""
For j = 0 To UBound(s)
If j Mod 2 = 0 Then
vat = IIf(vat = "", "", vat & ";") & s(j)
Else
ngay = IIf(ngay = "", "", ngay & ";") & s(j)
End If
anh có thể giải thích giúp em phần này tại sao dùng như vậy được ko ạ. :<
Vậy là bạn đã hiểu phần 1 (phần tạo dictionary)?
Sau khi loop qua cột Q bên sheet Invoice, các thành phần của dic là:
key: 643IN2306550-T, item: "00000089;Mar/13/2023"
...
key:"220210300565-C", item: "00000017;Jan/31/2023;00000018,"""
...
Việc tiếp theo bên sheet Sales là loop qua từng B/L trong cột E, sau đó so sánh với từng key bên dic và lấy ra item của nó:
VD: E8 = "220210300565-C", tìm bên dic thì lấy ra item: "00000017;Jan/31/2023;00000018;"
mục đích là tách invoice 17;18 (vị trí 1,3 trong chuỗi) dán vào cột Q, tách ngày (vị trí chẵn) dán vào cột R
s = Split(dic(key), ";") là tách chuỗi ra với s(0)=000017, s(1)=Jan/31/2023,s(2)=0000018,...
như vậy s(0),s(2),... với tham số chẵn là số VAT.

If j Mod 2 = 0 Then
vat = IIf(vat = "", "", vat & ";") & s(j)

là tạo chuỗi string vat nối nhau bằng ";"

Hy vọng bạn đã nắm đươc vấn đề và phương pháp tiếp cận.
 
Vậy là bạn đã hiểu phần 1 (phần tạo dictionary)?
Sau khi loop qua cột Q bên sheet Invoice, các thành phần của dic là:
key: 643IN2306550-T, item: "00000089;Mar/13/2023"
...
key:"220210300565-C", item: "00000017;Jan/31/2023;00000018,"""
...
Việc tiếp theo bên sheet Sales là loop qua từng B/L trong cột E, sau đó so sánh với từng key bên dic và lấy ra item của nó:
VD: E8 = "220210300565-C", tìm bên dic thì lấy ra item: "00000017;Jan/31/2023;00000018;"
mục đích là tách invoice 17;18 (vị trí 1,3 trong chuỗi) dán vào cột Q, tách ngày (vị trí chẵn) dán vào cột R
s = Split(dic(key), ";") là tách chuỗi ra với s(0)=000017, s(1)=Jan/31/2023,s(2)=0000018,...
như vậy s(0),s(2),... với tham số chẵn là số VAT.

If j Mod 2 = 0 Then
vat = IIf(vat = "", "", vat & ";") & s(j)

là tạo chuỗi string vat nối nhau bằng ";"

Hy vọng bạn đã nắm đươc vấn đề và phương pháp tiếp cận.
Dạ em cám ơn giải thích của anh ạ. Khi nhận code của anh em cũng lên mạng tìm tòi thử cách vận dụng của dictionary. Em cũng thử vận dụng Dictionary vào một cách chạy khác để tìm số VAT nhưng buồn là nó ko chạy được ra anh ạ.

Lần này em vận dụng dic thay thế vlookup để liệt kê số Invoice. Nếu BL có 2 số Invoice thì kết quả sẽ ra 2 dòng vs chung thông tin nhưng 2 số Invoice khác nhau.

Nếu được thì mong anh có thể chỉ giúp em với, em cám ơn ạ.
 

File đính kèm

  • Test (2).xlsm
    201.9 KB · Đọc: 2
Em cũng thử vận dụng Dictionary vào một cách chạy khác để tìm số VAT nhưng buồn là nó ko chạy được ra anh ạ.
Không chạy được cụ thể là thế nào?
Bây giờ bạn bỏ hết các dữ liệu không liên quan ra, giữ lại các code đang dùng.
Điền tay kết quả mong muốn vào, để mình xem nhé.
Khi làm việc với dic, nếu chưa quen thì bạn nên in các keys và items của nó ra cho dễ hình dung. VD:
PHP:
With Sheets("ZLV Accountant Dashboard")
...
.Range("W5").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(Array(dic.keys, dic.items))
...
In dic ra từ ô W5 trở xuống là keys, X5 trở xuống là items. Nhìn vô đó mới dễ hình dung.
 

File đính kèm

  • Test (2).xlsm
    201.7 KB · Đọc: 3
Không chạy được cụ thể là thế nào?
Bây giờ bạn bỏ hết các dữ liệu không liên quan ra, giữ lại các code đang dùng.
Điền tay kết quả mong muốn vào, để mình xem nhé.
Khi làm việc với dic, nếu chưa quen thì bạn nên in các keys và items của nó ra cho dễ hình dung. VD:
PHP:
With Sheets("ZLV Accountant Dashboard")
...
.Range("W5").Resize(dic.Count, 2).Value = WorksheetFunction.Transpose(Array(dic.keys, dic.items))
...
In dic ra từ ô W5 trở xuống là keys, X5 trở xuống là items. Nhìn vô đó mới dễ hình dung.
Hi anh,
Cuối tuần em có ngồi xem lại thì đã chạy được rồi ạ.
Cám ơn anh đã chỉ dẫn ạ *-+
 
Web KT
Back
Top Bottom