Chia sẻ_ Hàm Glookup_ Tìm kiếm dữ liệu giao nhau giữa cột và hàng

Liên hệ QC

NHG

Thành viên hoạt động
Tham gia
15/1/07
Bài viết
148
Được thích
126
Hi các bạn
Chắc nhiều bạn đã gặp tình huống tìm giá trị giao nhau giữa hàng và cột
Glookup.jpg
Có nhiều cách giải quyết, nhưng để tiện trong công việc mình đã tạo ra hàm Glookup để việc tìm kiếm đỡ nhọc hơn
Glookup(Giá trị cần tìm; Bảng cần tìm)
Mình đưa file ví dụ lên để các bạn tham khảo, nếu có thể tối ưu code chạy tốt hơn thì càng tốt :)
 

File đính kèm

  • Glookup.xlsm
    19.8 KB · Đọc: 27
Lần chỉnh sửa cuối:
Rỗi việc, thêm 1 tham khảo cho các bạn chập chững vô VBA:
PHP:
Function gpeVLOOKUP(MaNV As String, Cot As String, CSDL As Range)
Dim J As Long, W As Integer
Dim Arr():                                 Dim Tmp As String

Arr() = CSDL.Value
For J = 1 To UBound(Arr())
    If Arr(J, 1) = MaNV Then
        W = Switch(Cot = Arr(1, 3), 3, Cot = Arr(1, 4), 4, Cot = Arr(1, 5), 5, Cot = Arr(1, 6), 6, Cot = Arr(1, 7), 7, Cot = Arr(1, 8), 8)
        gpeVLOOKUP = Arr(J, W):             Exit Function
    End If
Next J
End Function
 
Upvote 0
Rỗi việc, thêm 1 tham khảo cho các bạn chập chững vô VBA:
PHP:
Function gpeVLOOKUP(MaNV As String, Cot As String, CSDL As Range)
Dim J As Long, W As Integer
Dim Arr():                                 Dim Tmp As String

Arr() = CSDL.Value
For J = 1 To UBound(Arr())
    If Arr(J, 1) = MaNV Then
        W = Switch(Cot = Arr(1, 3), 3, Cot = Arr(1, 4), 4, Cot = Arr(1, 5), 5, Cot = Arr(1, 6), 6, Cot = Arr(1, 7), 7, Cot = Arr(1, 8), 8)
        gpeVLOOKUP = Arr(J, W):             Exit Function
    End If
Next J
End Function

Oái,
cac-giai-doan-phat-trien-cua-tre-3.jpg
Trước cái hình đầu (ngồi) còn lẫy với lật nữa, hiiiii
Hình cuối là mới biết đứng, còn chưa đi chập chững. :D
Con hẹn tới SN GPE mình là con chập chững nha bác.
 
Upvote 0
Rỗi việc, thêm 1 tham khảo cho các bạn chập chững vô VBA:
PHP:
Function gpeVLOOKUP(MaNV As String, Cot As String, CSDL As Range)
Dim J As Long, W As Integer
Dim Arr():                                 Dim Tmp As String

Arr() = CSDL.Value
For J = 1 To UBound(Arr())
    If Arr(J, 1) = MaNV Then
        W = Switch(Cot = Arr(1, 3), 3, Cot = Arr(1, 4), 4, Cot = Arr(1, 5), 5, Cot = Arr(1, 6), 6, Cot = Arr(1, 7), 7, Cot = Arr(1, 8), 8)
        gpeVLOOKUP = Arr(J, W):             Exit Function
    End If
Next J
End Function
Đoạn code ni chỉ chạy trong 1 khoảng các cột ngắn thôi SA)DQ ạ. Nếu mình nới rộng dữ liệu thêm vài cột nữa là nó không chạy được...
 
Upvote 0
Mình cũng đã dùng cái này rồi bạn, nhưng với các bạn chưa quen dùng hàm kết hợp, thì việc kết hợp vlookup và match quá phức tạp, mình muốn một công thức đơn giản hơn.
"việc kết hợp vlookup và match quá phức tạp" và thế là bạn dẫn mọi người đến với VBA ! Yêu thế không biết. (*%:heart:
 
Upvote 0
Tách giá trị dò tìm dòng và cột riêng, Góp vui, hahaha ...

PHP:
Function PLookup(ByVal tenR As String, ByVal tenC As String, ByVal mang As Range) As Variant
Dim Dong As Long, Cot As Long, sArr As Variant
 
 sArr = mang.Value
 For Dong = 2 To UBound(sArr, 1)
    If sArr(Dong, 1) = tenR Then
        For Cot = 2 To UBound(sArr, 2)
            If sArr(1, Cot) = tenC Then
                PLookup = sArr(Dong, Cot)
                Exit Function
            End If
        Next Cot
    End If
Next Dong

End Function
 
Upvote 0
Đoạn code ni chỉ chạy trong 1 khoảng các cột ngắn thôi SA)DQ ạ. Nếu mình nới rộng dữ liệu thêm vài cột nữa là nó không chạy được...
Thì bạn nới cái này (số cột) thì phải nới cái kia (hàm SWITCH()) chớ bộ nới 1 bên ai mà chịu!
Mình có lần đã thử hàm Switch() này trên trăm tham biến cũng vô tư!
 
Upvote 0
Tách giá trị dò tìm dòng và cột riêng, Góp vui, hahaha ...

PHP:
Function PLookup(ByVal tenR As String, ByVal tenC As String, ByVal mang As Range) As Variant
Dim Dong As Long, Cot As Long, sArr As Variant

sArr = mang.Value
For Dong = 2 To UBound(sArr, 1)
    If sArr(Dong, 1) = tenR Then
        For Cot = 2 To UBound(sArr, 2)
            If sArr(1, Cot) = tenC Then
                PLookup = sArr(Dong, Cot)
                Exit Function
            End If
        Next Cot
    End If
Next Dong

End Function

tenR là tên dòng; còn tenC là tên cột hả bác?
 
Upvote 0
Thật ra, một mảng dữ liệu nhỏ thì không nhất thiết cần VBA. Tuy nhiên, đối với những dữ liệu lớn, phức tạp thì phải cần đến VBA thôi.
Về mức độ phức tạp thì có thể thế này:
Cột mã NV đang là không trùng; Nhưng nếu có trùng nhau (nhiều dòng của 1 mã NV) thì VBA cũng sẽ thể hiện hết các dòng trùng của mã NV đó (bỡi 1 UDF mảng)
. . . . .
 
Upvote 0
Bạn thử dùng công thức này xem sao
Mã:
=VLOOKUP($F2,OFFSET('số liệu mỗi tháng'!$A$2:$A$3000,,MATCH($E$1,'số liệu mỗi tháng'!$B$1:$BK$1,0),,2),2,0)
bác cho hỏi là nếu xóa cột A đi thì công thức sẽ đổi lại ntn ah,e xóa và thử lại =VLOOKUP($F2,OFFSET('số liệu mỗi tháng'!$A$1:$A$3000,,MATCH($E$1,'số liệu mỗi tháng'!$A$1:$BJ$1,0),,2),2,0) thì không đúng ah,phần này e muốn bác giúp e giải thích để học hỏi thêm ah
1590227963742.png
 
Upvote 0
Web KT

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

Back
Top Bottom