Các câu hỏi về hàm dò tìm dữ liệu (Lookup, Vlookup, Hlookup...)

Liên hệ QC

Closed poll

  • 1

    Votes: 1 100.0%
  • 2

    Votes: 0 0.0%

  • Total voters
    1
  • Poll closed .
Status
Không mở trả lời sau này.
VLOOKUP dùng 2 tham chiếu, làm sao?

Chào các bạn,
Tôi có một thắc mắc về cách sử dụng hàm VLOOKUP khi cần phải dùng đến cả 2 tham chiếu. Ví dụ:
---- A ---------- B ----------- C ---------
1 Hàng Ngày bán Số lượng
2 Áo 10/11 12
3 Áo 12/11 5
4 Quần 13/11 7
........

Và tôi muốn tra Vlookup trong ngày 10/11, món hàng Áo bán được mấy cái. Ở đây tôi buộc phải dùng một mẹo nhỏ để tra, tôi thêm 1 cột nữa là kết hợp giữa "Hàng" và "Ngày bán":

---- A ---------- B ----------- C --------------- D ----
1 Hàng Ngày bán Mapping Số lượng
2 Áo 10/11 "=A2&Day(B2)" 12
3 Áo 12/11 "=A3&Day(B3)" 5
4 Quần 13/11 "=A4&Day(B4)" 7
........

Sau đó VLOOKUP thì dùng cột mapping này để tra cứu.

Tôi có gửi file đính kèm. Vậy có ai biết cách dùng như thế nào mà không cần phải thêm một cột mapping như thế k, xin chỉ giáo.
Cảm ơn.
 

File đính kèm

  • VlookupUse2Reference.xls
    13.5 KB · Đọc: 457
Lần chỉnh sửa cuối:
=sumproduct(($b$2:$b$4=c10)*($a$2:$a$4=d10)*($d$2:$d$4))
 
Có cách nào dùng Vlookup để tìm giá trị của cột nhưng khác dòng ko?
Mong các bạn chỉ giáo!

file làm ví dụ
 

File đính kèm

  • 123.rar
    40.7 KB · Đọc: 548
Chỉnh sửa lần cuối bởi điều hành viên:
Có chứ. Bạn kết hợp sử dụng hàm Index, Match, Quotient... là được
 
Dear CPH,
-----------
Mình đã xem file minh hoạ của bạn. Bạn đang dùng hàm VLOOKUP là rất thích hợp. Tuy nhiên để LOOKUP được bạn đang phải dùng cột phụ, hơn nữa giá trị tìm kiếm là diễn giải khoản mục thì rất không hợp lý.
Theo mình với mỗi khoản mục trong bảng Dongiachitiet bạn gán thêm một mã đơn giá. Sau đó trên bảng Duthau, bạn sử dụng mã này. Bây giờ dùng VLOOKUP để lấy ra đơn giá tương ứng dựa vào mã đơn giá hiện hành.
Chúc bạn thành công!
 
Nhấn Alt+F11 để vào VBA. Nhấn tiếp Insert/Module rrồi thêm đoạn code dưới đây:
Mã:
Option Explicit
Public Function traDGCT(MaHieu, CongViec)
Dim row1 As Integer
Dim baseSheet As Worksheet
Set baseSheet = Sheets("Don gia chi tiet")
row1 = WorksheetFunction.Match(MaHieu, Range("rngMahieu"), 0)
Do
    If baseSheet.Cells(row1, "D") = CongViec Then
        Exit Do
    End If
    row1 = row1 + 1
Loop Until Not IsEmpty(baseSheet.Cells(row1, "B"))
traDGCT = baseSheet.Cells(row1, "I")
End Function
Trở về MS Excel, tại ô F8 trong sheet Du thau bạn đánh công thức:
Mã:
=traDGCT(B8,C8)
Dựa vào đoạn code trên bạn có thể tính được tổng cộng chi phí "Nhân công, Máy thi công..." mà không cần đến phần mềm Dự toán.
 
Chào các bạn!
Rất cảm ơn các bạn đã tham gia góp ý giúp đỡ tôi giả quyết vấn đề.
Nhưng tôi thấy nếu dùng theo cách của bạn Đào Việt Cường thì có vẻ hơi khó vì nếu tôi cần tra phần Vật liệu, nhân công, máy...
Theo doạn code của bạn NVSON thì có vẻ đáp ứng được yêu cầu nhưng nó lại không chạy.
Bạn NVSON có thể xem giúp lại giúp tôi đc ko?
Thanks alot!
 
CPH đã viết:
Chào các bạn!
.....
Theo doạn code của bạn NVSON thì có vẻ đáp ứng được yêu cầu nhưng nó lại không chạy.
Bạn NVSON có thể xem giúp lại giúp tôi đc ko?
Thanks alot!
Mình thấy nó chạy ổn đấy chứ!
 

File đính kèm

  • 123_VBA.rar
    47 KB · Đọc: 392
Cảm ơn bạn NVSON rất nhiều!
down của bạn về thì ok nhưng tôi copy đoạn code thì lại ko chạy!
 
nvson đã viết:
Nhấn Alt+F11 để vào VBA. Nhấn tiếp Insert/Module rrồi thêm đoạn code dưới đây:
Mã:
Option Explicit
Public Function traDGCT(MaHieu, CongViec)
Dim row1 As Integer
Dim baseSheet As Worksheet
Set baseSheet = Sheets("Don gia chi tiet")
row1 = WorksheetFunction.Match(MaHieu, Range("rngMahieu"), 0)
Do
    If baseSheet.Cells(row1, "D") = CongViec Then
        Exit Do
    End If
    row1 = row1 + 1
Loop Until Not IsEmpty(baseSheet.Cells(row1, "B"))
traDGCT = baseSheet.Cells(row1, "I")
End Function
Trở về MS Excel, tại ô F8 trong sheet Du thau bạn đánh công thức:
Mã:
=traDGCT(B8,C8)
Dựa vào đoạn code trên bạn có thể tính được tổng cộng chi phí "Nhân công, Máy thi công..." mà không cần đến phần mềm Dự toán.
Àh tôi đã hiểu vì sao doạn code ko chạy,
vì bạn ko hướng dẫn tôi đặt define name rngMaHieu cho cột B sheet dongiachitiet.
Nhưng cách này chỉ có thể áp dụng để tìm đơn giá được thôi vì:
- Đơn giá thì công việc nào cũng có
- Nhưng nếu tìm Nhân công, máy thi công, .... thì không jphải công việc nào cũng có.
Mong bạn chỉ giáo thêm.
 
Mình quên không bảo bạn tạo Name trong sheet Don gia chi tiet.
Bạn thay đổi code này nhé.
Mã:
Option Explicit
Public Function traDGCT(MaHieu, CongViec)
Dim Tontai As Boolean
Dim row1 As Integer
Dim baseSheet As Worksheet
Set baseSheet = Sheets("Don gia chi tiet")
row1 = WorksheetFunction.Match(MaHieu, Range("rngMahieu"), 0)
Tontai = False
Do
    If LCase(baseSheet.Cells(row1, "D")) = LCase(CongViec) Then
        Tontai = True
        Exit Do
    End If
    row1 = row1 + 1
Loop Until Not IsEmpty(baseSheet.Cells(row1, "B"))
If Tontai Then
    traDGCT = baseSheet.Cells(row1, "I")
Else
    MsgBox "Ban kiem tra lai:  " & MaHieu & "  hoac  " & CongViec
    traDGCT = ""
End If
End Function
Dựa vào hàm trên bạn lập thêm một hàm nữa là có thể tính được tổng cộng của bất kỳ công tác nào đó.
 
Dear all,
-------
Các bạn xem file đính kèm dưới đây. Không biết file có đáp ứng đúng yêu cầu của bạn CHP không?
 

File đính kèm

  • Dutoan.zip
    21.7 KB · Đọc: 287
Thêm 1 đoạn Code nữa cho bạn lựa chọn.
Mã:
Option Explicit
Public Function traDGCT(MaHieu, CongViec)
Dim i As Integer, row1 As Integer, row2 As Integer
Dim rngVungi As Range, rngTien As Range
Dim baseSheet As Worksheet
Set baseSheet = Sheets("Don gia chi tiet")
row1 = WorksheetFunction.Match(MaHieu, baseSheet.Range("B:B"), 0)
row2 = baseSheet.Cells(row1, "B").End(xlDown).Row - 1
'D la cot thanh phan hao phi
Set rngVungi = baseSheet.Range("D" & row1, "D" & row2)
'I la cot tien, ban co the tra cot don gia cung duoc
Set rngTien = baseSheet.Range("I" & row1, "I" & row2)
i = WorksheetFunction.Match(CongViec, rngVungi, 0)
traDGCT = rngTien.Cells(i, 1)
End Function
 
Đào Việt Cường đã viết:
-------
Các bạn xem file đính kèm dưới đây. Không biết file có đáp ứng đúng yêu cầu của bạn CHP không?
To Đào Việt Cường!
Kiểu này hiện nay tôi cũng đang sử dụng, nhưng mất rất nhiều thời gian vì có những gói thầu chúng tôi phải làm hàng trăm đầu việc (cá biệt có gói > 1000 công việc) nếu ngồi link từng công việc thì... )*&^) .
To NVSON!
VBA của bạn rất hay, có thể giải quyết được vấn đề nhưng cái VBA cũ thì ko thể tìm đc những cái TT (tạm tính).
Cái VBA mới thì hình như lại ko chay đc, không biết có thiếu cái jì ko nữa!
 
To NVSON !
Tôi đã làm đc rồi, cảm ơn bạn rất nhiều.
Nếu tôi tìm đơn giá thì tôi dùng cái VBA cũ của ban, nếu tìm vật tư, nhân công, máy..... thì tôi dùng cái VBA mới,
Một lần nữa cảm ơn bạn rất nhiều!

ah` NVSON có thể hướng dẫn tôi chuyển cái VBA thành add-in đc ko?
 
Chỉnh sửa lần cuối bởi điều hành viên:
CPH đã viết:
Nếu tôi tìm đơn giá thì tôi dùng cái VBA cũ của ban, nếu tìm vật tư, nhân công, máy..... thì tôi dùng cái VBA mới,
Tôi lại nhầm rồi.
2 cái này tìm giá trị hàng ngang như nhau, ko áp dụng để tìm đơn giá được vì đơn giá phải là ở hàng Giá trị dự toán xây lắp sau thuế.
Nhưng thôi đc rồi để tôi cho thêm 1 cột rồi tra mã từ cột này vậy.
Cảm ơn NVSON rất nhiều!
 
Mình giải quyết vấn để tổng quát, có nghĩa là nó sẽ tìm ô thoả mãn cả hai điều kiện của bạn, trước hết phải thoả mãn mã hiệu, sau đó mới tìm công việc nào đó có trong mã hiệu đó (ở bất kỳ hàng nào).
 
Dùng Vlookup trong VBA

Cells(3 + i, 5).Formula = "=VLookup((Cells(3 + i, 2).Value,gianhap,3,0)"
DG = Cells(3 + i, 5)
tìm trong gianhap lấy côt 3 theo Cells(3 + i, 2).Value (tenhang)
Các bạn chỉ giúp sao nó cứ báo lỗi, thêm hộ mấy dấu " và &

 
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom