Code cho Hàm VLookup cho nhiều cột làm sao đây

Liên hệ QC

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
346
Được thích
40
Em nhờ Anh chị chút ạ.
Code cho các hàm tại vùng F : H tại Sheet So Giao dich là thế nào ạ. Em có tìm hiểu một số bài nhưng thấy khó quá. Em cảm ơn ạ.
 

File đính kèm

Em nhờ Anh chị chút ạ.
Code cho các hàm tại vùng F : H tại Sheet So Giao dich là thế nào ạ. Em có tìm hiểu một số bài nhưng thấy khó quá. Em cảm ơn ạ.
Bạn thử code này

Mã:
Code trong Module

Option Explicit
Public Chk As Boolean, Dic As Object, aResult()
Sub Vlookup()
Dim wks As Worksheet, SrcRng As Range, sArray
  Dim LR As Long, i As Long, n As Long, tmp
  On Error Resume Next
  Set wks = Sheets("Ma")
  Set SrcRng = wks.Range("B2:E7")
  sArray = SrcRng.Value
  ReDim aResult(1 To UBound(sArray, 1), 1 To UBound(sArray, 2))
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(sArray, 1)
    If CStr(sArray(i, 1)) <> "" Then
      tmp = sArray(i, 1)
      If Not Dic.exists(tmp) Then
        LR = LR + 1
        Dic.Add tmp, LR
        aResult(LR, 1) = tmp
        aResult(LR, 2) = sArray(i, 2) 'Loai hang
        aResult(LR, 3) = sArray(i, 3) 'Cong ty cap
        aResult(LR, 4) = sArray(i, 4) 'Hang cong ty
      End If
    End If
  Next
End Sub

Code trong sheet So giao dich
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, result()

    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Set Change = Intersect(Range("B4:B600000"), Target)
    If Not Change Is Nothing Then
        If Dic Is Nothing Then Vlookup
        result = Change.Resize(Change.Rows.Count + 1).Value
        ReDim Preserve result(1 To UBound(result), 1 To 3)
 
        For i = 1 To UBound(result) - 1
            If Len(result(i, 1)) Then
                tmp = result(i, 1)
                If Dic.exists(tmp) Then
                    result(i, 1) = aResult(Dic.Item(tmp), 2) 'Loai hang
                    result(i, 2) = aResult(Dic.Item(tmp), 3) 'Cong ty cap
                    result(i, 3) = aResult(Dic.Item(tmp), 4) 'Hang cong ty
                Else
                    result(i, 1) = "Ch" & ChrW(432) & "a có mã"
                    result(i, 2) = "Ch" & ChrW(432) & "a có mã"
                    result(i, 3) = "Ch" & ChrW(432) & "a có mã"
                End If
            End If
        Next i
        Change.Offset(0, 4).Resize(, 3).Value = result
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Bạn thử code này

Mã:
Code trong Module

Option Explicit
Public Chk As Boolean, Dic As Object, aResult()
Sub Vlookup()
Dim wks As Worksheet, SrcRng As Range, sArray
  Dim LR As Long, i As Long, n As Long, tmp
  On Error Resume Next
  Set wks = Sheets("Ma")
  Set SrcRng = wks.Range("B2:E7")
  sArray = SrcRng.Value
  ReDim aResult(1 To UBound(sArray, 1), 1 To UBound(sArray, 2))
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(sArray, 1)
    If CStr(sArray(i, 1)) <> "" Then
      tmp = sArray(i, 1)
      If Not Dic.exists(tmp) Then
        LR = LR + 1
        Dic.Add tmp, LR
        aResult(LR, 1) = tmp
        aResult(LR, 2) = sArray(i, 2) 'Loai hang
        aResult(LR, 3) = sArray(i, 3) 'Cong ty cap
        aResult(LR, 4) = sArray(i, 4) 'Hang cong ty
      End If
    End If
  Next
End Sub

Code trong sheet So giao dich
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, result()

    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Set Change = Intersect(Range("B4:B600000"), Target)
    If Not Change Is Nothing Then
        If Dic Is Nothing Then Vlookup
        result = Change.Resize(Change.Rows.Count + 1).Value
        ReDim Preserve result(1 To UBound(result), 1 To 3)

        For i = 1 To UBound(result) - 1
            If Len(result(i, 1)) Then
                tmp = result(i, 1)
                If Dic.exists(tmp) Then
                    result(i, 1) = aResult(Dic.Item(tmp), 2) 'Loai hang
                    result(i, 2) = aResult(Dic.Item(tmp), 3) 'Cong ty cap
                    result(i, 3) = aResult(Dic.Item(tmp), 4) 'Hang cong ty
                Else
                    result(i, 1) = "Ch" & ChrW(432) & "a có mã"
                    result(i, 2) = "Ch" & ChrW(432) & "a có mã"
                    result(i, 3) = "Ch" & ChrW(432) & "a có mã"
                End If
            End If
        Next i
        Change.Offset(0, 4).Resize(, 3).Value = result
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
Anh ơi, Code chỉ chạy khi có biến động mã tại Cột B tai Sheet So giao dịch. Khi em xóa vùng kết quả đi và tạo một Nút bấm Button với Macro Vlookup thì nó không nhảy. Có cách gì tạo bao cáo bằng cách bấm nút thay vì chỉ khi có biến động mã mới chạy không ạ. E cảm ơn ạ.
 
Upvote 0
Anh ơi, Code chỉ chạy khi có biến động mã tại Cột B tai Sheet So giao dịch. Khi em xóa vùng kết quả đi và tạo một Nút bấm Button với Macro Vlookup thì nó không nhảy. Có cách gì tạo bao cáo bằng cách bấm nút thay vì chỉ khi có biến động mã mới chạy không ạ. E cảm ơn ạ.
Bạn thử sub này

Mã:
Public Sub Test()
Dim sArr(), dArr(), tArr(), I As Long, J As Long, R As Long, Col As Long, Rws As Long
With Sheets("Ma")
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 4).Value
End With
R = UBound(sArr)
With CreateObject("Scripting.Dictionary")
    For I = 1 To R
        .Add sArr(I, 1), I
    Next I
    With Sheets("So giao dich")
        tArr = .Range("B4", .Range("B4").End(xlDown)).Value
        R = UBound(tArr)
        Col = 3
        ReDim dArr(1 To R, 1 To Col)
    End With
    For I = 1 To R
        If .Exists(tArr(I, 1)) Then
            Rws = .Item(tArr(I, 1))
            For J = 1 To Col
                dArr(I, J) = sArr(Rws, J + 1)
          Next J
         End If
    Next I
End With
Sheets("So giao dich").Range("F4").Resize(R, Col) = dArr
End Sub
 
Upvote 0
Bạn thử sub này

Mã:
Public Sub Test()
Dim sArr(), dArr(), tArr(), I As Long, J As Long, R As Long, Col As Long, Rws As Long
With Sheets("Ma")
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 4).Value
End With
R = UBound(sArr)
With CreateObject("Scripting.Dictionary")
    For I = 1 To R
        .Add sArr(I, 1), I
    Next I
    With Sheets("So giao dich")
        tArr = .Range("B4", .Range("B4").End(xlDown)).Value
        R = UBound(tArr)
        Col = 3
        ReDim dArr(1 To R, 1 To Col)
    End With
    For I = 1 To R
        If .Exists(tArr(I, 1)) Then
            Rws = .Item(tArr(I, 1))
            For J = 1 To Col
                dArr(I, J) = sArr(Rws, J + 1)
          Next J
         End If
    Next I
End With
Sheets("So giao dich").Range("F4").Resize(R, Col) = dArr
End Sub
Nó chạy được rồi anh ạ. A giỏi quá. Anh cho em hỏi thêm chút ạ, nếu nó tìm mà không có mã thì nó hiện ra "Cần nhập mã vào" mà không để trống ạ (Chú ý cột mã hàng cột B của Sheet So giao dich phải là khác rỗng, nếu trống thì không hiện ạ). Em cảm ơn Anh.
 
Upvote 0
Nó chạy được rồi anh ạ. A giỏi quá. Anh cho em hỏi thêm chút ạ, nếu nó tìm mà không có mã thì nó hiện ra "Cần nhập mã vào" mà không để trống ạ (Chú ý cột mã hàng cột B của Sheet So giao dich phải là khác rỗng, nếu trống thì không hiện ạ). Em cảm ơn Anh.
Bạn thử lại

Mã:
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
    Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4)
End With
With Sheet1
    SoGiaoDich = .Range(.[B4], .[B65000].End(3))
    ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
    Set Dic = CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Ma)
    Item = CStr(Ma(i, 1))
        If Not Dic.exists(Item) Then
            Dic.Add CStr(Ma(i, 1)), i
        End If
    Next i
    For i = 1 To UBound(SoGiaoDich)
    Item = CStr(SoGiaoDich(i, 1))
        If Dic.exists(Item) Then
            KQ(i, 1) = Ma(Dic.Item(Item), 2)
            KQ(i, 2) = Ma(Dic.Item(Item), 3)
            KQ(i, 3) = Ma(Dic.Item(Item), 4)
            Else
            KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
        End If
    Next i
    .[F4:H65000].ClearContents
    .[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub
 

File đính kèm

Upvote 0
Bạn thử lại

Mã:
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
    Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4)
End With
With Sheet1
    SoGiaoDich = .Range(.[B4], .[B65000].End(3))
    ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
    Set Dic = CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Ma)
    Item = CStr(Ma(i, 1))
        If Not Dic.exists(Item) Then
            Dic.Add CStr(Ma(i, 1)), i
        End If
    Next i
    For i = 1 To UBound(SoGiaoDich)
    Item = CStr(SoGiaoDich(i, 1))
        If Dic.exists(Item) Then
            KQ(i, 1) = Ma(Dic.Item(Item), 2)
            KQ(i, 2) = Ma(Dic.Item(Item), 3)
            KQ(i, 3) = Ma(Dic.Item(Item), 4)
            Else
            KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
        End If
    Next i
    .[F4:H65000].ClearContents
    .[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub


Em thử nó chạy được rồi anh ạ. A là người nhiệt tình quá, thấy hỏi gì cũng được a chỉ giáo. Chúc anh luôn gặp nhiều may mắn nhé. Có gì lại làm phiền anh và mọi người tiếp ạ !
 
Upvote 0
Bạn thử lại

Mã:
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
    Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4)
End With
With Sheet1
    SoGiaoDich = .Range(.[B4], .[B65000].End(3))
    ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
    Set Dic = CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Ma)
    Item = CStr(Ma(i, 1))
        If Not Dic.exists(Item) Then
            Dic.Add CStr(Ma(i, 1)), i
        End If
    Next i
    For i = 1 To UBound(SoGiaoDich)
    Item = CStr(SoGiaoDich(i, 1))
        If Dic.exists(Item) Then
            KQ(i, 1) = Ma(Dic.Item(Item), 2)
            KQ(i, 2) = Ma(Dic.Item(Item), 3)
            KQ(i, 3) = Ma(Dic.Item(Item), 4)
            Else
            KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
        End If
    Next i
    .[F4:H65000].ClearContents
    .[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub
Anh ơi, em hỏi anh chút ạ. Đoạn nào trong Code để nó hiểu rằng Việc Vlookup sẽ thực hiện từ Cột F mà không phải thực hiện từ Cột D, E ạ. Em cảm ơn ạ
 
Upvote 0
Anh ơi, em hỏi anh chút ạ. Đoạn nào trong Code để nó hiểu rằng Việc Vlookup sẽ thực hiện từ Cột F mà không phải thực hiện từ Cột D, E ạ. Em cảm ơn ạ
Bạn nên gửi file để biết chỉnh và hướng dẫn nhé
Mã:
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
    Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4) 'bat dau từ b2 Resize(, 4) => tới cột E'
End With
With Sheet1
    SoGiaoDich = .Range(.[B4], .[B65000].End(3))
    ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
    Set Dic = CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Ma)
    Item = CStr(Ma(i, 1))
        If Not Dic.exists(Item) Then
            Dic.Add CStr(Ma(i, 1)), i
        End If
    Next i
    For i = 1 To UBound(SoGiaoDich)
    Item = CStr(SoGiaoDich(i, 1))
        If Dic.exists(Item) Then
            KQ(i, 1) = Ma(Dic.Item(Item), 2) 'Từ mã hàng tới Loại hàng'
            KQ(i, 2) = Ma(Dic.Item(Item), 3) ''Từ mã hàng tới cong ty cấp''
            KQ(i, 3) = Ma(Dic.Item(Item), 4) 'Từ mã hàng tới Hạng công ty'
            Else
            KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
        End If
    Next i
    .[F4:H65000].ClearContents
    .[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
B

Bạn nên gửi file để biết chỉnh và hướng dẫn nhé
Mã:
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
    Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4) 'bat dau từ b2 Resize(, 4) => tới cột E'
End With
With Sheet1
    SoGiaoDich = .Range(.[B4], .[B65000].End(3))
    ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
    Set Dic = CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Ma)
    Item = CStr(Ma(i, 1))
        If Not Dic.exists(Item) Then
            Dic.Add CStr(Ma(i, 1)), i
        End If
    Next i
    For i = 1 To UBound(SoGiaoDich)
    Item = CStr(SoGiaoDich(i, 1))
        If Dic.exists(Item) Then
            KQ(i, 1) = Ma(Dic.Item(Item), 2) 'Từ mã hàng tới Loại hàng'
            KQ(i, 2) = Ma(Dic.Item(Item), 3) ''Từ mã hàng tới cong ty cấp''
            KQ(i, 3) = Ma(Dic.Item(Item), 4) 'Từ mã hàng tới Hạng công ty'
            Else
            KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
            KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
        End If
    Next i
    .[F4:H65000].ClearContents
    .[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub
Ý em hỏi là tại Sheet 1 ạ: Đoạn nào thể hiện nó sẽ thực hiện VLookup trả kết quả từ F4 đến H mà không phải từ C, D, hoặc E ạ.
 
Upvote 0
Ý em hỏi là tại Sheet 1 ạ: Đoạn nào thể hiện nó sẽ thực hiện VLookup trả kết quả từ F4 đến H mà không phải từ C, D, hoặc E ạ.
Là muốn trả kết quả về C,D,E thay vì kết quả code đang trả về F,G,H hay sao? nếu đúng thì chỉ chỉnh dòng này

Mã:
Sửa dòng này
    .[F4:H65000].ClearContents
    .[F4].Resize(i - 1, 3) = KQ
Thành
    .[C4:E65000].ClearContents
    .[C4].Resize(i - 1, 3) = KQ
 
Upvote 0
Em nhờ Anh chị chút ạ.
Code cho các hàm tại vùng F : H tại Sheet So Giao dich là thế nào ạ. Em có tìm hiểu một số bài nhưng thấy khó quá. Em cảm ơn ạ.
1 cách:
PHP:
Sub hoahuongduong1986()
    Dim i As Long
    For i = Range("B" & Rows.Count).End(3).Row To 4 Step -1
        Range(Cells(i, "F"), Cells(i, "H")).FormulaArray = "=VLOOKUP(B" & i & ",Ma!$B:$E,{2,3,4},0)"
        With Range("F4:H" & Range("B" & Rows.Count).End(3).Row)
            .Value = .Value
            .Replace "#N/A", "Không có "
        End With
    Next
End Sub
 
Upvote 0
1 cách:
PHP:
Sub hoahuongduong1986()
    Dim i As Long
    For i = Range("B" & Rows.Count).End(3).Row To 4 Step -1
        Range(Cells(i, "F"), Cells(i, "H")).FormulaArray = "=VLOOKUP(B" & i & ",Ma!$B:$E,{2,3,4},0)"
        With Range("F4:H" & Range("B" & Rows.Count).End(3).Row)
            .Value = .Value
            .Replace "#N/A", "Không có "
        End With
    Next
End Sub
Cảm ơn nhiều ạ !
 
Upvote 0
Web KT

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

Back
Top Bottom