Xin được giúp đỡ: Hàm Vlookup trả về nhiều giá trị (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tuongidea

Thành viên mới
Tham gia
22/8/17
Bài viết
29
Được thích
4
Giới tính
Nam
Dear!
1. Mình cần sử dụng hàm Vlookup nâng cao hoặc tương đương để bảng kết quả trả về nhiều giá trị được tham chiếu trong dữ liệu nguồn.
2. Để mọi người dễ hiểu, mình đã làm một file cell ví dụ kèm theo, có ghi chú rõ ràng trong file cell.
3. Nhờ mọi người viết hàm hộ mình.
Cám ơn mọi người.
 

File đính kèm

Mình có tìm được trên mạng hàm này có thể áp dụng vào vấn đề của mình, nhưng vấn đề mình không hiểu được hàm vì mình thấy hàm if & hàm index dùng có 2 đối số trong khi bình thường là 3 đối số.
Vì vậy mình không thể biến hóa được để áp dụng vào vấn đề của mình.
Nhờ các cao thủ giúp đỡ.
Hàm: =IF(COUNTIF($A$1:$A$1000,$G$1)>=ROWS($1:2),INDEX($F$1:$F$1000,SMALL(IF($A$1:$A$1000=$G$1,ROW($1:$1000)),ROW(2:2))),"")
 
Hai tham số thì có nghĩa là nó lấy cả hàng hoặc cả cột thay vì một ô.
Mỗi một cái "công dụng" thì số lượng dòng kết quả là khác nhau---> Bố trí không gian chứa kết quả cũng là cả một vấn đề lớn rồi.
Mình sắp sếp lại không gian chứa kết quả rồi nhờ cầu đặt hàm được không ạ ?
 
"Bang dữ liệu chuẩn" của bạn nó vốn đã không chuẩn rồi thì có mọc cánh cũng không bay được. Ít nhất phải sửa lại cột B, không để các ô trống vô duyên đó nữa.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử xài hàm mảng tự tạo này xem sao
 

File đính kèm

Bạn thử xài hàm mảng tự tạo này xem sao
Trước hết cám ơn bạn rất nhiều, sau mình muốn bày tỏ vài điều:
1. Tại bảng kê chi tiết, sau khi hoàn thiện mình cần chèn thêm các cột ở giữa, dùng mảng tự tạo này không chèn được thêm cột bên bảng kê chi tiết.
2. Bố cục các sheet, sau khi hoàn thiện mình cần bố trí dữ liệu nguồn ở riêng 1 sheet, và sẽ có nhiều sheet bảng kê chi tiết được sinh ra, mảng tự tạo này đòi hỏi cả 2 bảng nằm trong 1 sheet.
3. Tại bảng dữ liệu chuẩn, hàm mới giới hạn nhập số liệu từ hàng 17 (R17) trở về, bắt đầu từ R18 trở đi sẽ không trong phạm vi xuất kết quả.
Nhờ bạn chỉnh dùm mình với ạ. Nếu bạn có thể cho mình xin hàm mảng và chỉ cho mình cách sử dụng hàm thì mình sẽ càng biết ơn hơn nữa.
Cám ơn bạn nhiều.
 

File đính kèm

Trước hết cám ơn bạn rất nhiều, sau mình muốn bày tỏ vài điều:
1. Tại bảng kê chi tiết, sau khi hoàn thiện mình cần chèn thêm các cột ở giữa, dùng mảng tự tạo này không chèn được thêm cột bên bảng kê chi tiết.
2. Bố cục các sheet, sau khi hoàn thiện mình cần bố trí dữ liệu nguồn ở riêng 1 sheet, và sẽ có nhiều sheet bảng kê chi tiết được sinh ra, mảng tự tạo này đòi hỏi cả 2 bảng nằm trong 1 sheet.
3. Tại bảng dữ liệu chuẩn, hàm mới giới hạn nhập số liệu từ hàng 17 (R17) trở về, bắt đầu từ R18 trở đi sẽ không trong phạm vi xuất kết quả.
Nhờ bạn chỉnh dùm mình với ạ. Nếu bạn có thể cho mình xin hàm mảng và chỉ cho mình cách sử dụng hàm thì mình sẽ càng biết ơn hơn nữa.
Cám ơn bạn nhiều.
Góp ý cho bạn:

1/ Muốn làm cái gì đó thì nên cụ thể, rõ ràng, ví dụ: bảng kê chi tiết là bảng nào của sheet nào? Trong khi đó File của bạn ghi BẢNG DỮ LIỆU CHUẨN?
1. Tại bảng kê chi tiết: Nên thiết kế thống nhất chứ không nên chèn cột lung tung (hàm hoặc code nó không hiểu ý của mình đâu).
2. Việc bố trí dữ liệu nguồn ở riêng 1 sheet là đúng, nhưng nên thiết kế sử dụng chỉ 1 sheet duy nhất (không nên làm nhiều sheet bảng kê chi tiết phát sinh ra để làm gì?).
 
Lần chỉnh sửa cuối:
. . . , sau mình muốn bày tỏ vài điều:
1.
2.
3. Tại bảng dữ liệu chuẩn, hàm mới giới hạn nhập số liệu từ hàng 17 (R17) trở về, bắt đầu từ R18 trở đi sẽ không trong phạm vi xuất kết quả.
Nhờ bạn chỉnh dùm mình với ạ.

(1) & (2) Chắc fải chuyển sang xài macro; Bạn khẳng định cấu trúc file #1 chuẩn thì mình sẽ làm thử vô đó
(3) Xài hàm này
PHP:
Function CD(Rng As Range, CDg As String)
 Dim J As Long, W As Integer, Col As Byte, Rws As Long, TT As Boolean    '*'
 ReDim Arr(1 To 9, 1 To 3) As String
 
 Rws = [C65500].End(xlUp).Row      '**'
 For J = 9 To Rws                  '*'
    If Cells(J, "B").Value = CDg Then
        W = W + 1:                          TT = True
        For Col = 1 To 3
            Arr(W, Col) = Cells(J, 2 + Col).Value
        Next Col
    ElseIf Cells(J, 2).Value = "" And TT Then
        W = W + 1
        For Col = 1 To 3
            Arr(W, Col) = Cells(J, 2 + Col).Value
        Next Col
    ElseIf (Cells(J, 2).Value <> "" And TT) Or J > Rws Then   '*'
        Exit For
    End If
 Next J
 CD = Arr()
End Function
 
.
 
Lần chỉnh sửa cuối:
Góp ý cho bạn:

1/
1.
2. Việc ...
-------------------------------------------------------------------------------------------
Xin được giải thích cho góp ý của bạn be09, và Reply bạn Hoang2013
Trước tiên cám ơn 2 bạn nhiều ạ.
- ý (1/) : Mình xin gửi các bạn file Chuẩn mới. Về cơ bản file này tuy chưa đầy đủ, nhưng cách bố trí không gian đã đúng định hướng.
- ý (1.) : Tại bảng kê chi tiết, chỉ có thể đưa ra bảng kê bố trí không gian tương đối 80%, vì mình làm thuê cho chủ đầu tư, mỗi chủ đầu tư yêu cầu một mẫu riêng, nên đều phải bổ xung thêm các dòng và cột ở bảng kê chi tiếtdữ liệu nguồn.
- ý (2.): Mình bắt buộc phải bố trí dữ liệu nguồn ở một sheet riêng, vì mỗi một công trình có số lượng và độ rộng của dự án khác nhau, dao động từ 3 đến 8 sheet bảng kê chi tiết, nhưng dữ liệu nguồn thì chỉ cần 1 sheet.
- Việc tạo một sheet nguồn riêng còn có lợi cho việc bổ xung những mã, những cấu hình mới mà hiện tại chưa được sinh ra. Đồng thời giúp quản lý số liệu đầu vào dễ dàng hơn đối với mình.
Cám ơn các bạn nhiều.
Thân ái!
 

File đính kèm

Lần chỉnh sửa cuối:
Bài này nên làm bỡi VBA;
Đã vậy thì fải:

1./ Tên trang tính nên là tiếng Việt không dấu; Như 'CTiet' hay 'DuLieu' là được rồi.

2./ So với file bài đầu thì file sau khác xa;
Như vậy theo mình hiểu thì:
(.) Nhập mã hiệu vô cột [C:c] của 'CTiet', thì các thông số cần lấy sẽ được nạp vô các cột S, V, Y & AB từ trang 'DuLieu'?
 
Bài này nên làm bỡi VBA;
Đã vậy thì fải:

1./ Tên trang tính nên là tiếng Việt không dấu; Như 'CTiet' hay 'DuLieu' là được rồi.

2./ So với file bài đầu thì file sau khác xa;
Như vậy theo mình hiểu thì:
(.) Nhập mã hiệu vô cột [C:c] của 'CTiet', thì các thông số cần lấy sẽ được nạp vô các cột S, V, Y & AB từ trang 'DuLieu'?
Dạ vâng, bạn hiểu đúng vấn đề rồi đấy ạ.
 
Vậy thì đây là nội dung macro sự kiện tại trang 'CTiet':
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Rws As Long, Dg As Long, Hg As Long, Col As Byte
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, Rg0 As Range

 Rws = [s65500].End(xlUp).Row + 99
 If Not Intersect(Target, Range("C19:C" & Rws)) Is Nothing Then
    Set Sh = ThisWorkbook.Worksheets("DuLieu")
    Dg = Sh.[B65500].End(xlUp).Offset(9).Row            'Dòng Cuói Có Du Liêu  '
    Set Rng = Sh.[B2].Resize(Dg)
    Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Nothing", , "GPE.COM Xin Chào!"
    Else
        If sRng.Offset(1).Value <> "" Then
            For Col = 1 To 4
                Cells(Target.Row, 3 * (Col + 5) + 1).Value = sRng.Offset(, Col).Value
            Next Col
        Else
            Hg = sRng.End(xlDown).Row - sRng.Row        'Xác Dinh Só Dòng Tróng  '
            If Hg > 9 Then Hg = 9
            For Col = 1 To 4
                Cells(Target.Row, 3 * (Col + 5) + 1).Resize(Hg).Value = _
                    sRng.Offset(, Col).Resize(Hg).Value
            Next Col
        End If
    End If
 End If
End Sub

Những mong bạn thành công mĩ mãn!
 
Mình cám ơn bạn nhiều.
Cũng chúc bạn thành đạt trong cuộc sống.
 
Thành đạt cái nổi gì 1 khi đã hưu;

Giờ sức khỏe là trên hết!
 
Thành đạt cái nổi gì 1 khi đã hưu;

Giờ sức khỏe là trên hết!
Dạ vâng, có sức khỏe là có tất cả.
Vậy thì phải gọi bằng bác rồi ạ.
Chúc bác sức khỏe và niềm vui, để đơm hoa cho đời.
Có gì khó khăn thì chúng cháu nhờ bác giúp ạ.
 
Dạ vâng, có sức khỏe là có tất cả.
Vậy thì phải gọi bằng bác rồi ạ.
Chúc bác sức khỏe và niềm vui, để đơm hoa cho đời.
Có gì khó khăn thì chúng cháu nhờ bác giúp ạ.
Dù hưu rồi, nhưng đem 1 xị rượu tới là anh ấy giúp tới sáng.
 
Vậy thì đây là nội dung macro sự kiện tại trang 'CTiet':
Những mong bạn thành công mĩ mãn!
Cháu chào bác.
Cháu chúc bác ngày mới vui vẻ.
Có một vấn đề cháu muốn nhờ bác ạ: Sau khi cháu copy đoạn code vào bảng cell và cho chạy thì hiện lên bảng báo "Nothing" ạ
Vì vậy cháu nhờ bác thương cho chót, sửa giúp nốt cháu, cháu có gửi kèm file cell đã add code.
Cháu cám ơn bác nhiều.
 

File đính kèm

Bạn fải nhập vô cột [c:c] của trang 'CTiet' 1 trong những mã có trong cột [B:b] của trang còn lại
Nếu nhập ngoài danh sách thì nó báo không tìm thấy là fải rồi!

Còn muốn nhớ, những mã công dụng để nhập cho có thì thử vài cách, trong đó có cách tạo 1 ô Validation đâu đó trên trang tính để nhớ thôi.
Còn về căn cơ thì mã công dụng cần đầu tư nghiêm cứu thêm để dễ nhớ cho người sử dụng.
 
Lần chỉnh sửa cuối:
Bạn fải nhập vô cột [c:c] của trang 'CTiet' 1 trong những mã có trong cột [B:b] của trang còn lại
Nếu nhập ngoài danh sách thì nó báo kgo6ng tìm thấy là fải rồi!
Dạ vâng!
Cháu đã làm được rồi, tại vì cháu cứ nhập mã hiệu ở ô [A,a].
Ngốc quá, lẽ ra phải nghĩ đến cột [B,b] rồi mới đúng.
Bác cho cháu hỏi thêm 4 vấn đề nữa ạ:
1. Cháu muốn tìm hiểu qua về Code ( chỉ học đủ để chỉnh sửa khi xin được code ) thì nên dùng tài liệu nào dễ hiểu cho một người mới như cháu ạ ?
2. Hiện tại nếu cháu bổ xung thêm 1 cột ở 'DuLieu' thì giá trị ở 'CTiet' sẽ dịch đi 3 cột. Vậy bây giờ cháu vẫn muốn bổ xung thêm 1 cột ở 'DuLieu' nhưng giá trị ở 'CTiet' sẽ không bị dịch đi mà chỉ xuất hiện ở bên cạnh tham chiếu tương ứng. Thì nên thay đổi thế nào trong Code ạ.
3. Hiện tại bên 'DuLieu' đang chỉ có một cột mã hiệu là [B,b] tương ứng với [C,c] ở bên 'CTiet'. Vậy bây giờ cháu muốn bổ xung thêm 1 cột mã hiệu bên 'DuLieu' ( cột [A,A] chẳng hạn ) và 1 cột tương ứng với bên 'CTiet'. Thì nên thay đổi Code ntn ạ?
4. Hiện tại cháu biết tạo code đơn giản bằng cách cho chạy ghi chép lại lệnh trong file cell, nhưng khi cho chạy code thì cả lệnh cũng hiện lên. Bác cho cháu hỏi làm thế nào để xóa lệnh đi, mà chỉ hiện lên giá tị thực giống như gõ tay ạ ( cháu thử dùng paste special nhưng như thế sẽ không chạy được marco )
Cháu cám ơn bác nhiều.
 
Lần chỉnh sửa cuối:
1.
2. Hiện tại nếu cháu bổ xung thêm 1 cột ở 'DuLieu' thì giá trị ở 'CTiet' sẽ dịch đi 3 cột. Vậy bây giờ cháu vẫn muốn bổ xung thêm 1 cột ở 'DuLieu' nhưng giá trị ở 'CTiet' sẽ không bị dịch đi mà chỉ xuất hiện ở bên cạnh tham chiếu tương ứng. Thì nên thay đổi thế nào trong Code ạ.
3. Hiện tại bên 'DuLieu' đang chỉ có một cột mã hiệu là [B,b] tương ứng với [C,c] ở bên 'CTiet'. Vậy bây giờ cháu muốn bổ xung thêm 1 cột mã hiệu bên 'DuLieu' ( cột [A,A] chẳng hạn ) và 1 cột tương ứng với bên 'CTiet'. Thì nên thay đổi Code ntn ạ?
1./ Tìm quyễn cơ bản (cơ sở) về VBA đã fát hành trên diễn đàn
2./ Bạn cần nói rõ là thêm 1 cột vô trước hay ngay sau cột có tiêu đề là 'Công Dụng'?
& chuyện này được nhiên fải chỉnh các thông số chứa trong các tham biến.
3./. . . & 1 cột tương ứng bên 'CTiet' là cột ở vị trí nào.
 
.
 
Lần chỉnh sửa cuối:
1./ Tìm quyễn cơ bản (cơ sở) về VBA đã fát hành trên diễn đàn
2./ Bạn cần nói rõ là thêm 1 cột vô trước hay ngay sau cột có tiêu đề là 'Công Dụng'?
& chuyện này được nhiên fải chỉnh các thông số chứa trong các tham biến.
3./. . . & 1 cột tương ứng bên 'CTiet' là cột ở vị trí nào.
Dạ Cháu sửa luôn trên file cell cho dễ hiểu ạ.
1. Cháu đã bổ xung thêm cột, và tạo thêm 1 cột mã mới ( cũ 1 nữa => tổng là 2 => cần thêm một CODE nữa trong cùng sheet )
2. Các cột màu vàng là các cột liên hệ với nhau bằng CODE riêng ạ.
Cháu cám ơn nhiều ạ.
 

File đính kèm

Bạn viết vậy chắc chỉ có mình bạn hiểu mà thôi!

Bạn cần ghi rằng, khi nhập cái gì vô cột nào (C hay D hay cả hai) của trang 'CTiet' thì cột nào của trang 'CTiet' này sẽ fải lấy số liệu từ cột nào của trang tính còn lại kia;
 
Mình thấy bài này rất hay, để mình thử viết hàm xem sao rồi lên báo bạn
 
Bạn viết vậy chắc chỉ có mình bạn hiểu mà thôi!

Bạn cần ghi rằng, khi nhập cái gì vô cột nào (C hay D hay cả hai) của trang 'CTiet' thì cột nào của trang 'CTiet' này sẽ fải lấy số liệu từ cột nào của trang tính còn lại kia;
Mình xin nhận góp ý của bạn.
Mình xin được bổ xung thông tin vào sheet ghichu trong file mới này ( giống hệt file trước, chỉ thêm ghi chú )
Cám ơn bạn nhiều.
 

File đính kèm

Bạn xem file cuối này nha & chúc vui suốt ngày!
 

File đính kèm

Những cột mà bạn bôi vàng đó có số liệu đâu mà mần & kiểm tra tính đúng đắn;

Sẵn đây nhắc bạn luôn:
(*) Không ai bôi màu toàn 1 cột như trong file của bạn; Điều này sẽ tốn bộ nhớ & chứng tỏ bạn vô trách nhiêm với dữ liệu của mình.
(*) Xem lại trang tính 'Ghi Chu' cái cách mà người khác mô tả công viêc.
Nên mô ta sao để người khác hiểu, chứ không fải mô tả những cái mình hiểu.
 
Những cột mà bạn bôi vàng đó có số liệu đâu mà mần & kiểm tra tính đúng đắn;

Sẵn đây nhắc bạn luôn:
(*) Không ai bôi màu toàn 1 cột như trong file của bạn; Điều này sẽ tốn bộ nhớ & chứng tỏ bạn vô trách nhiêm với dữ liệu của mình.
(*) Xem lại trang tính 'Ghi Chu' cái cách mà người khác mô tả công viêc.
Nên mô ta sao để người khác hiểu, chứ không fải mô tả những cái mình hiểu.
Dạ vâng, mình xin nhận góp ý của bạn.
Cái cột màu vàng mình sơ xuất không không điền dữ liệu vào, mình xin được gửi lại.
Cái phần mô tả ý, không phải do mình làm ẩu đâu ạ. Do là mình có vấn đề về cách diễn đạt trong mọi thứ ( như kiểu khả năng truyền đạt kém ấy ), điều này mình cũng đang sửa đổi chính mình.
Cám ơn bạn đã góp ý. :)
-* Những cột bôi vàng có liên hệ với nhau khép kín, không liên quan đến những cột còn lại ( có thể dùng một mã code 2 khác độc lập với mã code 1đã có )*-
 

File đính kèm

Bạn copy cái này đè lên toạn bộ cái cũ mà xài nè:
PHP:
Const Rw As Long = 9999
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Rws As Long, Dg As Long, Hg As Long, Col As Byte
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, Rg0 As Range

 Rws = Rw + 99
 Set Sh = ThisWorkbook.Worksheets("DuLieu")             '*'
 Dg = Sh.[G9999].End(xlUp).Offset(9).Row                'Dòng Cuói Có Du Liêu  '
 If Not Intersect(Target, Range("C19:C" & Rws)) Is Nothing Then
    Set Rng = Sh.[B2].Resize(Dg)
    Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Nothing", , "GPE.COM Xin Chào!"
    Else
        If sRng.Offset(1).Value <> "" Then
            Cells(Target.Row, "T").Value = Sh.Cells(sRng.Row, "G").Value
            For Col = 9 To 11   '*'
                Cells(Target.Row, 3 * Col - 3).Value = Sh.Cells(sRng.Row, Col).Value
            Next Col
        Else
            Hg = sRng.End(xlDown).Row - sRng.Row        'Xác Dinh Só Dòng Tróng  '
            If Hg > 9 Then Hg = 9
            Cells(Target.Row, "T").Resize(9).ClearContents
            Cells(Target.Row, "T").Resize(Hg).Value = Sh.Cells(sRng.Row, "G").Resize(Hg).Value
            For Col = 9 To 11
                Cells(Target.Row, 3 * Col - 3).Resize(9).ClearContents
                Cells(Target.Row, 3 * Col - 3).Resize(Hg).Value = _
                    Sh.Cells(sRng.Row, Col).Resize(Hg).Value
            Next Col
        End If
    End If
 ElseIf Not Intersect(Target, Range("d19:d" & Rws)) Is Nothing Then
    Set Rng = Sh.[C2].Resize(Dg)
    Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        MsgBox "Nothing", , "GPE.COM Xin Chào!"
    Else
        Hg = Target.Row
        Cells(Hg, "L").Value = sRng.Offset(, 1).Value
        Cells(Hg, "O").Value = sRng.Offset(, 2).Value
        Cells(Hg, "Q").Value = sRng.Offset(, 3).Value
    End If
 Else
    Set Sh = Nothing
 End If
End Sub
 
Bạn copy cái này đè lên toạn bộ cái cũ mà xài nè:
Mình cám ơn bạn nhiều.
Còn sót dữ liệu tại cột H màu vàng sheet 'DuLieu' chưa được chuyển sang cột V màu vàng sheet 'CTiet".
Bạn bổ xung giúp mình nốt cột này ạ.
Lần nữa cám ơn bạn.
 

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

Back
Top Bottom