Giúp Lọc Dữ Liệu Trùng & Đưa Chi Tiết Kết Quả Về 1 Ô ! (5 người xem)

Liên hệ QC

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

congkien2610

Thành viên mới
Tham gia
4/4/10
Bài viết
16
Được thích
0
cám ơn mọi người rất nhiều thanks !
 

File đính kèm

Lần chỉnh sửa cuối:
Mình dùng hàm Vlookup nhưng chỉ cho ra 1 kết quả.
Anh chị nào giúp em cách làm này với. và đưa ra kết quả chi tiết trong 1 ô.
Vì 1 loại hàng hóa trong công ty nằm ở rất nhiều vị trí khác nhau.
THANKS rất nhiều !!!
thử dùng công thức này xem
 

File đính kèm

bạn nói rằng:

Thế, nếu có từ 20 vị trí khác nhau, bạn dùng 20 name chắc?
ẹc... ẹc...
Cái này dùng vba mới là chuẩn nhất ---> nối chuổi có điều kiện mà dùng công thức là... Thua!
nếu viết code thì em chào thua
đành phải nhờ đén các bác vậy
 
nếu viết code thì em chào thua
đành phải nhờ đén các bác vậy
Hoàn toàn không khó như bạn nghĩ đâu!
Thuật toán thế này:
- Duyệt các cell ở cột MÃ SỐ
- Nếu thấy cell nào trùng với mã mình đang tìm thì chiếu sang cột CHI TIẾT, lấy giá trị ấy cho vào 1 biến (ví dụ là Temp)
- Lại duyệt tiếp, nếu thấy mã mình đang tìm thì.. lại chiếu sang cột CHI TIẾT, lấy giá trị ấy nối vào Temp
- vân vân... cứ thế đến hết
---------------------------
Thuật toán này quá tầm thường, tôi nghĩ là ai cũng hiểu ấy chứ! Việc còn lại là CHUYỂN GIAO NGÔN NGỮ, sao cho VBA nó "hiểu" được những gì ta muốn nói nãy giờ ---> Cái này chỉ là chuyện nhỏ, học 1 tí bài viết của sư phụ ptm0412: Giới thiệu Cơ bản về vòng lặp For . . . next là có ngay các kiến thức cần thiết!
 
hoàn toàn không khó như bạn nghĩ đâu!
Thuật toán thế này:
- duyệt các cell ở cột mã số
- nếu thấy cell nào trùng với mã mình đang tìm thì chiếu sang cột chi tiết, lấy giá trị ấy cho vào 1 biến (ví dụ là temp)
- lại duyệt tiếp, nếu thấy mã mình đang tìm thì.. Lại chiếu sang cột chi tiết, lấy giá trị ấy nối vào temp
- vân vân... Cứ thế đến hết
---------------------------
thuật toán này quá tầm thường, tôi nghĩ là ai cũng hiểu ấy chứ! Việc còn lại là chuyển giao ngôn ngữ, sao cho vba nó "hiểu" được những gì ta muốn nói nãy giờ ---> cái này chỉ là chuyện nhỏ, học 1 tí bài viết của sư phụ ptm0412: giới thiệu cơ bản về vòng lặp for . . . Next là có ngay các kiến thức cần thiết!
bác nói em nghe thì dễ nhưng để đạt đươch như bacd nói thì chắc em phai theo bác đèn sách 1 thời gian đó
 
quote_icon.png
Nguyên văn bởi ndu96081631
hoàn toàn không khó như bạn nghĩ đâu!
Thuật toán thế này:
- duyệt các cell ở cột mã số
- nếu thấy cell nào trùng với mã mình đang tìm thì chiếu sang cột chi tiết, lấy giá trị ấy cho vào 1 biến (ví dụ là temp)
- lại duyệt tiếp, nếu thấy mã mình đang tìm thì.. Lại chiếu sang cột chi tiết, lấy giá trị ấy nối vào temp
- vân vân... Cứ thế đến hết
---------------------------
thuật toán này quá tầm thường, tôi nghĩ là ai cũng hiểu ấy chứ! Việc còn lại là chuyển giao ngôn ngữ, sao cho vba nó "hiểu" được những gì ta muốn nói nãy giờ ---> cái này chỉ là chuyện nhỏ, học 1 tí bài viết của sư phụ ptm0412: giới thiệu cơ bản về vòng lặp for . . . Next là có ngay các kiến thức cần thiết!


bác nói em nghe thì dễ nhưng để đạt đươch như bacd nói thì chắc em phai theo bác đèn sách 1 thời gian đó
Cốt lõi bây giờ là Bác Ndu giải quyết cho bạn congkien2610 cái yêu cầu đã hỏi trước đi đã nhỉ ?
 
Mình dùng hàm Vlookup nhưng chỉ cho ra 1 kết quả.
Anh chị nào giúp em cách làm này với. và đưa ra kết quả chi tiết trong 1 ô.
Vì 1 loại hàng hóa trong công ty nằm ở rất nhiều vị trí khác nhau.
THANKS rất nhiều !!!
Làm tạm "zì" đi, còn gì khác tính sau
Thân
 

File đính kèm

Cốt lõi bây giờ là Bác Ndu giải quyết cho bạn congkien2610 cái yêu cầu đã hỏi trước đi đã nhỉ ?
Tạm dùng code này đi:
PHP:
Function JoinIf(LValue, LRange As Range, ColIndex As Long, Optional Sep = "") As String
  Dim Clls As Range, , Temp As String
  On Error Resume Next
  If LValue <> "" Then
    For Each Clls In LRange.Resize(, 1)
      If Clls.Value = LValue Then
        Temp = Temp & Sep & Clls(, ColIndex)
      End If
    Next
    JoinIf = Mid(Temp, Len(Sep) + 1, Len(Temp))
  End If
End Function
Đây là code được viết với cấp độ đơn giản nhất (ngày xưa tôi đã từng học)
Cú pháp hàm gõ tại cell D6: (gần giống như VLOOKUP)
PHP:
=JoinIf($B6,Vitri!$B$5:$G$71,6,", ")
--------------------------------------------------------------
Code này có thể cải tiến thêm bằng nhiêu cách:
- Nạp giá trị tìm được vào 1 Array, cuối cùng nối chùng lại bằng hàm Join (sẽ khỏi thông qua hàm MID để xử lý)
- Dùng Find Method ---> sẽ cho tốc độ nhanh hơn!
(Các bạn tự nghiên cứu các cải tiến này nếu có hứng thú)
 

File đính kèm

Lần chỉnh sửa cuối:
Làm tạm "zì" đi, còn gì khác tính sau
Thân
Ái chà... Bác concogia tiến bộ ghê! Viết code rất đúng thuật toán
code của bác:
PHP:
Private Function vitri(vung As Range, dk As String) As String
  Dim kq As String
  Dim cl As Range
   For Each cl In vung
     If cl = dk Then
     kq = kq & ";" & " " & cl.Offset(0, 5)
     End If
   Next
vitri = Right(kq, Len(kq) - 2)
End Function
Em xin mạn phép góp ý thêm mấy chổ:
- Đoạn này: kq = kq & ";" & " " & cl.Offset(0, 5)
- Sao không là: kq = kq & "; " & cl.Offset(0, 5)
và và chi cho nhiều thế
Ngoài ra:
- cl.Offset(0, 5) là không tổng quát ---> Lở file khác không phải Offset qua 5 cột thì sao? ---> Phải có biến ColIndex để người dùng thích dịch sang mấy cột tùy ý
- Khai báo thêm biến về dấu phân cách ---> Lở người khác không thích dùng dấu chấm phẩy thì sao (ai thích cái gì tự điền vào hàm chứ không phải sửa code)
- Và từ lý do đó cũng phải sửa luôn đoạn này Right(kq, Len(kq) - 2)
 
Lần chỉnh sửa cuối:
Ái chà... Bác concogia tiến bộ ghê! Viết code rất đúng thuật toán
code của bác:
PHP:
Private Function vitri(vung As Range, dk As String) As String
  Dim kq As String
  Dim cl As Range
   For Each cl In vung
     If cl = dk Then
     kq = kq & ";" & " " & cl.Offset(0, 5)
     End If
   Next
vitri = Right(kq, Len(kq) - 2)
End Function
Em xin mạn phép góp ý thêm mấy chổ:
- Đoạn này: kq = kq & ";" & " " & cl.Offset(0, 5)
- Sao không là: kq = kq & "; " & cl.Offset(0, 5)
và và chi cho nhiều thế
Ngoài ra:
- cl.Offset(0, 5) là không tổng quát ---> Lở file khác không phải Offset qua 5 cột thì sao? ---> Phải có biến ColIndex để người dùng thích dịch sang mấy cột tùy ý
- Khai báo thêm biến về dấu phân cách ---> Lở người khác không thích dùng dấu chấm phẩy thì sao (ai thích cái gì tự điền vào hàm chứ không phải sửa code)
- Và từ lý do đó cũng phải sửa luôn đoạn này Right(kq, Len(kq) - 2)
- Sao không là: kq = kq & "; " & cl.Offset(0, 5)==> vì tác giả muốn như thế mà, Thầy "nghía" kỹ lại xem nó có " " đấy
Hihihi, thích thì mò mẫn học thôi, cứ mỗi lần Thầy với Thầy Ptm góp ý thì mình lại ..vỡ "za" một tý
Với lại làm đúng yêu cầu, viết mà nó ..chạy là sướng "zồi", còn nâng tầm thì phải có ...thời gian chứ, (còn dành thời gian "vài ve" nữa) phải không Thầy
Mấy hôm nay mình cũng chưa si-pam, Mod thông cảm

 
cốt lõi bây giờ là bác ndu giải quyết cho bạn congkien2610 cái yêu cầu đã hỏi trước đi đã nhỉ ?
thực ra với yêu cầu của tác giả và file đính kèm tôi đã giải quyết cho tác giả ok
nhưng nếu lớn hơn 11 vị trí thì cần fai xem lai
 
- Sao không là: kq = kq & "; " & cl.Offset(0, 5)==> vì tác giả muốn như thế mà, Thầy "nghía" kỹ lại xem nó có " " đấy
Hihihi, thích thì mò mẫn học thôi, cứ mỗi lần Thầy với Thầy Ptm góp ý thì mình lại ..vỡ "za" một tý
Với lại làm đúng yêu cầu, viết mà nó ..chạy là sướng "zồi", còn nâng tầm thì phải có ...thời gian chứ, (còn dành thời gian "vài ve" nữa) phải không Thầy
Mấy hôm nay mình cũng chưa si-pam, Mod thông cảm
Ý em nói là vầy:
Anh ghi kq = kq & ";" & " " & cl.Offset(0, 5)
Ngay chổ tô đỏ có nghĩa là dấu chấm phẩy nối với khoảng trắng, đúng không? Vậy sao không ghi chung vào?
kq = kq & "; " & cl.Offset(0, 5) cũng là dấu chấm phẩy với khoảng trắng vậy! Có gì khác biệt?
Cũng giống như anh viết: "concogia" & " - " & "ndu"
Em ghi luôn vầy: "concogia - ndu"
Được không? Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Trước tiên THANKS tất cả mọi người đã giúp đỡ và trao đổi, mình thử xem... Thanks...Thanks trước đã...
 
Thanks alots.............. nghiên cứu tiếp
 
Lần chỉnh sửa cuối:
Cho mình xin hỏi tí nữa. Vì kiến thức eo hẹp nên các bác thông cảm.
Em muốn gán công thức đó cho một cái tên ngắn gọn thôi.
Ví dụ: Muốn dùng chức năng đó, ta chỉ cần đánh vào:
=kiem(b6)
các bác giúp em tí nữa ....thanks !!!!

Bạn có công thức, hay tổ hợp các hàm bạn muốn sử dụng tại ô B6 chưa?
Copy nó, sau đó nhấn Ctrl+F3 -> Paste vào Refers to:
Tại mục Names in workbook đặt tên là: KIEM -> OK
Sau đó thì cứ sử dụng bình thường như yêu cầu của bạn...
 
Cho mình xin hỏi tí nữa. Vì kiến thức eo hẹp nên các bác thông cảm.
Em muốn gán công thức đó cho một cái tên ngắn gọn thôi.
Ví dụ: Muốn dùng chức năng đó, ta chỉ cần đánh vào:
=kiem(b6)
các bác giúp em tí nữa ....thanks !!!!
Mắc cười quá
Trừ những em bé chưa biết gì thì già trẻ nam nữ lớn bé ai cũng muốn nó ....dài ra một tí, chỉ có mình bạn là muốn nó ngắn lại, nhưng mà lỡ ngắn thì làm cho nó ngắn luôn đi chứ "kiem" cũng chưa ngắn lắm, bạn chép code này vào rồi "quánh" =k(B6)
Ngắn "zì" nó mới "hoành tráng", code này chỉ làm cho bài của bạn thôi nhé
Thân
Private Function k(dk As String) As String
Dim kq As String
Dim cl, vung As Range
Set vung = Sheets("vitri").Range("b5:b100")
For Each cl In vung
If cl = dk Then
kq = kq & "; " & cl.Offset(0, 5)
End If
Next
k = Right(kq, Len(kq) - 2)
End Function
 
Mắc cười quá
Trừ những em bé chưa biết gì thì già trẻ nam nữ lớn bé ai cũng muốn nó ....dài ra một tí, chỉ có mình bạn là muốn nó ngắn lại, nhưng mà lỡ ngắn thì làm cho nó ngắn luôn đi chứ "kiem" cũng chưa ngắn lắm, bạn chép code này vào rồi "quánh" =k(B6)
Ngắn "zì" nó mới "hoành tráng", code này chỉ làm cho bài của bạn thôi nhé
Thân
Private Function k(dk As String) As String
Dim kq As String
Dim cl, vung As Range
Set vung = Sheets("vitri").Range("b5:b100")
For Each cl In vung
If cl = dk Then
kq = kq & "; " & cl.Offset(0, 5)
End If
Next
k = Right(kq, Len(kq) - 2)
End Function
Vẩn còn... hơi.. "dài"
- Đặt con trỏ chuột tại 1 cell
- Bấm nút chạy code ---> Ra kết quả tại ActiveCell
Vậy mới "cực ngắn"... "ngắn" đến không nhìn thây luôn (Công Công)
 
Web KT

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

Back
Top Bottom