Xin giúp e về tìm kiếm lấy về nhiều giá trị (1 người xem)

Liên hệ QC

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

Với dữ liệu hơn 4000 dòng, nên nghĩ đến công cụ Pivot Table với một chút chỉnh trang cho dữ liệu.
Xem file kèm.

Thân
Xin chào Phan Thế Hiệp,

Bạn có thể recode 1 đoạn video chỉ giúp Oanh Thơ cách tạo Pivot Table như file kèm được không ạ?

Cảm ơn bạn đã giúp đỡ.
 

File đính kèm

Chào cả nhà,
Chủ đề các bạn trao đổi hay và bổ ích quá. Mình đang vướng phải vấn đề như các bạn nhưng vấn đề của mình ở đây là muốn tìm kiếm và trả về nhiều kết quả, liệt kê trên một dòng (có thể ngăn cách bởi dấu phẩy (,) hoặc dấu (-)...
Một vấn đề nữa là nếu như dữ liệu của mình lớn (giả sử như trên 40.000 dòng dữ liệu thì các bạn có thể giúp tìm nhanh được ko ah?
Mình có gửi Ví dụ. Mong mọi người giải quyết giùm ạ.
THANKS CẢ NHÀ
 

File đính kèm

Chào cả nhà,
Chủ đề các bạn trao đổi hay và bổ ích quá. Mình đang vướng phải vấn đề như các bạn nhưng vấn đề của mình ở đây là muốn tìm kiếm và trả về nhiều kết quả, liệt kê trên một dòng (có thể ngăn cách bởi dấu phẩy (,) hoặc dấu (-)...
Một vấn đề nữa là nếu như dữ liệu của mình lớn (giả sử như trên 40.000 dòng dữ liệu thì các bạn có thể giúp tìm nhanh được ko ah?
Mình có gửi Ví dụ. Mong mọi người giải quyết giùm ạ.
Cảm ơn CẢ NHÀ
Nếu bạn sử dụng Excel 365, đã tham gia Office insider thì có thể dùng công thức sau tại ô E5:
=TEXTJOIN(",",TRUE,UNIQUE(IF($A$3:$A$14=D5,$B$3:$B$14,"")))
(bấm enter)
Nếu bạn không sử dụng bản excel này thì có thể dùng cột phụ hoặc vba.
 
. . . .vấn đề của mình là muốn tìm kiếm và trả về nhiều kết quả, liệt kê trên một dòng (có thể ngăn cách bởi dấu phẩy (,) hoặc dấu (-)...
Một vấn đề nữa là nếu như dữ liệu của mình lớn (giả sử như trên 40.000 dòng dữ liệu thì các bạn có thể giúp tìm nhanh được ko ah?
Mình có gửi Ví dụ. Mong mọi người giải quyết giùm ạ.
Bạn thử tốc độ với hàm tự tạo này:
PHP:
Function CKQ(CSDL As Range, Ma)
Dim J As Long:                         Dim Arr()

Arr() = CSDL.Value
For J = 1 To UBound(Arr())
    If Arr(J, 1) = Ma Then CKQ = CKQ & ";" & Arr(J, 2)
Next J
If Len(CKQ) Then CKQ = Mid(CKQ, 2, Len(CKQ))
End Function

Cách xài: Tại ô {e5] bạn thiết lập công thức =CKQ(A$2:B14, D5)
Nếu kết quả không sai thì tìm cách chép xuống phía dưới
 
Lần chỉnh sửa cuối:
Bạn ơi, thế nếu như dữ liệu của mình ví dụ như là A2:C5 hoặc A:E và dữ liệu trả về cột C hoặc cột E, F... thì như nào bạn???
Mình vừa chạy thử code của bạn, Rất hay ạ nhưng nếu thử với dữ liệu lớn thì chậm mất nhiều thời gian ạ. Có thể khắc phục được nhược điểm nay ko ạ, Thêm nữa nếu tìm giá trị ở cột thứ 3,4 thì ko được. Mình xin đưa ví dụ với số lượng dữ liệu nhiều hơn và giá trị cần tìm kiếm là cột thứ 3,4. (sheet Du lieu 2)
Thanks bạn và mọi người
 

File đính kèm

. . . (1)nhưng nếu thử với dữ liệu lớn thì chậm mất nhiều thời gian ạ. Có thể khắc phục được nhược điểm nay ko ạ,
(2) Thêm nữa nếu tìm giá trị ở cột thứ 3,4 thì ko được. Mình xin đưa ví dụ với số lượng dữ liệu nhiều hơn và giá trị cần tìm kiếm là cột thứ 3,4. (sheet Du lieu 2)
(1) Có thể được, nhưng mình chưa có khả năng!
(2.0) Cột thứ 3 là những con số; Vậy có cọng lại không (để cho ra đáp án là 1 tổng) hay chép nối?
(2.1) Cột thứ tư là cột chỉ ngày-tháng; Chắc cột này là chép nối đuôi nhau
Nhưng như vậy kết quả sẽ quá dài dòng
Vả lại bạn iêu cầu tìm không nhiều những mã khách hàng: Nên chăng ta xoay iêu cầu lại, nhỉ:

Số tiềnNgàySố tiềnNgàySố tiềnNgàySố tiềnNgàySố tiềnNgàySố tiềnNgàySố tiềnNgày
002285015269003359005363016847003132005153
198000​
1/1/2000​
975000​
2/1/2000​
. . .. . . .
 
Mình vừa chạy thử code của bạn, Rất hay ạ nhưng nếu thử với dữ liệu lớn thì chậm mất nhiều thời gian ạ. Có thể khắc phục được nhược điểm nay ko ạ, Thêm nữa nếu tìm giá trị ở cột thứ 3,4 thì ko được. Mình xin đưa ví dụ với số lượng dữ liệu nhiều hơn và giá trị cần tìm kiếm là cột thứ 3,4. (sheet Du lieu 2)
Cảm ơn bạn và mọi người
Chạy thử code
Mã:
Sub ThanhToan()
  Dim sArr(), aMa(), Res(), iKey$, tmp$
  Dim i&, iR&, sRow&
  With Sheets("Du Lieu 2")
    i = .Range("E" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A2:E" & i).Value
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aMa = .Range("G5:G" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(aMa)
    ReDim Res(1 To sRow, 1 To 2)
    For i = 1 To sRow
      iKey = aMa(i, 1)
      If Not .exists(iKey) Then .Add iKey, i
    Next i
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If .exists(iKey) Then
        iR = .Item(iKey)
        Res(iR, 1) = Res(iR, 1) + sArr(i, 4)
        Res(iR, 2) = Res(iR, 2) & ", " & Format(sArr(i, 5), "dd/mm/yyyy")
      End If
    Next i
  End With
  sRow = UBound(Res)
  For i = 1 To sRow
    tmp = Res(i, 2)
    If tmp <> Empty Then
      Res(i, 2) = Mid(tmp, 3, Len(tmp))
      If Len(Res(i, 2)) = 10 Then Res(i, 2) = "'" & Res(i, 2)
    End If
  Next i
  With Sheets("Du Lieu 2")
    .Range("H5").Resize(sRow, 2).Value = Res
  End With
End Sub
 
Chạy thử code
Mã:
Sub ThanhToan()
  Dim sArr(), aMa(), Res(), iKey$, tmp$
  Dim i&, iR&, sRow&
  With Sheets("Du Lieu 2")
    i = .Range("E" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A2:E" & i).Value
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aMa = .Range("G5:G" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(aMa)
    ReDim Res(1 To sRow, 1 To 2)
    For i = 1 To sRow
      iKey = aMa(i, 1)
      If Not .exists(iKey) Then .Add iKey, i
    Next i
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If .exists(iKey) Then
        iR = .Item(iKey)
        Res(iR, 1) = Res(iR, 1) + sArr(i, 4)
        Res(iR, 2) = Res(iR, 2) & ", " & Format(sArr(i, 5), "dd/mm/yyyy")
      End If
    Next i
  End With
  sRow = UBound(Res)
  For i = 1 To sRow
    tmp = Res(i, 2)
    If tmp <> Empty Then
      Res(i, 2) = Mid(tmp, 3, Len(tmp))
      If Len(Res(i, 2)) = 10 Then Res(i, 2) = "'" & Res(i, 2)
    End If
  Next i
  With Sheets("Du Lieu 2")
    .Range("H5").Resize(sRow, 2).Value = Res
  End With
End Sub
Vang. Hay quá ạ. Nhưng mình chưa rõ lắm về các code.. Bác có thể giải thích mã các dòng lệnh đc ko ạ; :-) thanks bác
 
Vang. Hay quá ạ. Nhưng mình chưa rõ lắm về các code.. Bác có thể giải thích mã các dòng lệnh đc ko ạ; :) Cảm ơn bác
Bác ơi, với dòng dữ liệu tra cứu ít như dưới đây thì Ok ạ!
1577110391217.png
Tuy nhiên nếu dòng tra cứu dữ liệu nhiều như sau, thì sẽ báo lỗi như dưới này ạ:
1577110610309.png
báo lỗi như này ạ!
1577110449308.png
Bác nghiên cứu xử lý giúp em với ạ.
Nếu em muốn chuyển mục danh sách tim kiếm, tra cứu sang sheet khác thì như nào ạ.
Cảm ơn bác nhiều ah
Bài đã được tự động gộp:

Bác ơi, với dòng dữ liệu tra cứu ít như dưới đây thì Ok ạ!
1577110391217.png
Tuy nhiên nếu dòng tra cứu dữ liệu nhiều như sau, thì sẽ báo lỗi như dưới này ạ:
1577110610309.png
báo lỗi như này ạ!
1577110449308.png
Bác nghiên cứu xử lý giúp em với ạ.
Nếu em muốn chuyển mục danh sách tim kiếm, tra cứu sang sheet khác thì như nào ạ.
Cảm ơn bác nhiều ah
EM quên chưa post Ví dụ lên. Em xin up lên. Mong bác nghiên cứu giải cứu em với ah
 

File đính kèm

Bác ơi, với dòng dữ liệu tra cứu ít như dưới đây thì Ok ạ!

Tuy nhiên nếu dòng tra cứu dữ liệu nhiều như sau, thì sẽ báo lỗi như dưới này ạ:

báo lỗi như này ạ!

Bác nghiên cứu xử lý giúp em với ạ.
Nếu em muốn chuyển mục danh sách tim kiếm, tra cứu sang sheet khác thì như nào ạ.
Cảm ơn bác nhiều ah
Bài đã được tự động gộp:


EM quên chưa post Ví dụ lên. Em xin up lên. Mong bác nghiên cứu giải cứu em với ah
Có một số dòng của cột số tiền là ký tự "-" không phải số 0
Xem ghi chú trong code
Mã:
Sub ThanhToan()
  Dim sArr(), aMa(), Res(), iKey$, tmp$
  Dim i&, iR&, sRow&
  With Sheets("Du Lieu 2") 'Sheet Du lieu
    i = .Range("E" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A2:E" & i).Value
  End With
  With Sheets("Du Lieu 2") 'Sheet ket qua
    i = .Range("G" & Rows.Count).End(xlUp).Row 'Cot "G" la cot Ma
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aMa = .Range("G5:G" & i).Value 'Cot "G" la cot Ma, "5" là dong dau
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(aMa)
    ReDim Res(1 To sRow, 1 To 2)
    For i = 1 To sRow
      iKey = aMa(i, 1)
      If Not .exists(iKey) Then .Add iKey, i
    Next i
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If .exists(iKey) Then
        iR = .Item(iKey)
        If IsNumeric(sArr(i, 4)) Then Res(iR, 1) = Res(iR, 1) + sArr(i, 4)
        Res(iR, 2) = Res(iR, 2) & ", " & Format(sArr(i, 5), "dd/mm/yyyy")
      End If
    Next i
  End With
  sRow = UBound(Res)
  For i = 1 To sRow
    tmp = Res(i, 2)
    If tmp <> Empty Then
      Res(i, 2) = Mid(tmp, 3, Len(tmp))
      If Len(Res(i, 2)) = 10 Then Res(i, 2) = "'" & Res(i, 2)
    End If
  Next i
  With Sheets("Du Lieu 2") 'Sheet ket qua
    .Range("H5").Resize(sRow, 2).Value = Res '"H5" la o dau cua ket qua
  End With
End Sub
 
Có một số dòng của cột số tiền là ký tự "-" không phải số 0
Xem ghi chú trong code
Mã:
Sub ThanhToan()
  Dim sArr(), aMa(), Res(), iKey$, tmp$
  Dim i&, iR&, sRow&
  With Sheets("Du Lieu 2") 'Sheet Du lieu
    i = .Range("E" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A2:E" & i).Value
  End With
  With Sheets("Du Lieu 2") 'Sheet ket qua
    i = .Range("G" & Rows.Count).End(xlUp).Row 'Cot "G" la cot Ma
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aMa = .Range("G5:G" & i).Value 'Cot "G" la cot Ma, "5" là dong dau
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(aMa)
    ReDim Res(1 To sRow, 1 To 2)
    For i = 1 To sRow
      iKey = aMa(i, 1)
      If Not .exists(iKey) Then .Add iKey, i
    Next i
    sRow = UBound(sArr)
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If .exists(iKey) Then
        iR = .Item(iKey)
        If IsNumeric(sArr(i, 4)) Then Res(iR, 1) = Res(iR, 1) + sArr(i, 4)
        Res(iR, 2) = Res(iR, 2) & ", " & Format(sArr(i, 5), "dd/mm/yyyy")
      End If
    Next i
  End With
  sRow = UBound(Res)
  For i = 1 To sRow
    tmp = Res(i, 2)
    If tmp <> Empty Then
      Res(i, 2) = Mid(tmp, 3, Len(tmp))
      If Len(Res(i, 2)) = 10 Then Res(i, 2) = "'" & Res(i, 2)
    End If
  Next i
  With Sheets("Du Lieu 2") 'Sheet ket qua
    .Range("H5").Resize(sRow, 2).Value = Res '"H5" la o dau cua ket qua
  End With
End Sub
Dạ! Cảm ơn bạn nhiều :) :) ah...
 
Web KT

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

Back
Top Bottom