hỏi code VBA tạo danh sách duy nhất

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Chào các anh, các chị

Vấn đề lọc danh sách duy nhất bằng công thức em đã đọc được nhiều trên diễn đàn.
Với tinh thần "cố gắng xóa mù VBA" Các cao thủ giúp em đoạn code sau
--------------------------
Tại sheet1 ta có một name là DS

Chạy macro

Kết quả danh sách duy nhất từ DS sẽ được tạo tại ô B2 Sheet("AR")


Xin đuợc chỉ bảo

ST
 
Chưa thấy, DS đâu? Bạn gửi file lên được không? Có thể tham khảo bài này Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Sẽ chỉ bảo, nhưng là cách tạo ra code đó, như sau:

Chào các anh, các chị.
Với tinh thần "cố gắng xóa mù VBA" Các cao thủ giúp em đoạn code sau
Tại sheet1 ta có một name là DS
Chạy macro
Kết quả danh sách duy nhất từ DS sẽ được tạo tại ô B2 Sheet("AR")
Xin đuợc chỉ bảo ST
Bạn biết dùng AdvancedFilter, chắc vậy (Nếu không bạn cần thao tác thành thục phương thức này trên menu Data;
Một khi bạn đã thành thục như lua cháo, rồi thì mở bộ thu macro lên & thao tác, để phương thức đó tạo cho bạn danh sách duy nhất;
Sau đó bạn đưa macro thu được lên topic này, nếu bạn chưa hiểu chổ nào trong đó!

Chức bạn thành công mĩ mãn!
 
Upvote 0
Hiện nay mình chỉ biết có cách đó là tạm ổn. Vì nó áp dụng cho mảng ảo nên biết đâu. Bạn thử cho 1 ví dụ xem sao nào? Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ giúp viết code tạo danh sách duy nhất

Các cao thủ xem file và xin được chỉ giáo
------------------
 

File đính kèm

Upvote 0
Các cao thủ xem file và xin được chỉ giáo
------------------
Cũng như bạn ChanhTQ@ đã nói, code không phải là vấn đề nếu bạn thành thạo Advanced Filter (cách dùng bằng tay)
Nếu thành thạo rồi thì:
- Record macro quá trình này
- Xem và "dọn dẹp" lại code cho gọn
Chỉ vậy thôi
Như file của bạn thì code chỉ ngắn gọn thế này thôi:
PHP:
Sub UniqueData()
  Dim Rng As Range
  Set Rng = Range("DS")
  Rng.AdvancedFilter 2, , [B2], True
  With Range([B2], [B65536].End(xlUp))
    .Offset(2).Sort [B4], 1
  End With
End Sub
Tuy nhiên bạn lưu ý:
- Dử liệu gốc của bạn có dòng rổng nên khi lọc ra sẽ không được như ý
- Muốn dùng Advanced Filter thì name DS phải tính luôn tiêu đề
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thêm 1 chiêu nữa dùng UDF (hàm có sẳn, chỉ cần gõ là ra)
PHP:
Function Unique(Vung As Range, STT As Long) As String
   Dim i As Long, K As Long
   Dim Temp As String
   For i = 1 To Vung.Cells.Count
    If Vung(i) <> "" Then
      If i = Application.WorksheetFunction.Match(Vung(i), Vung, 0) Then
        K = K + 1
      End If
      If K = STT Then Temp = Vung(i): Exit For
    End If
   Next i
   Unique = Temp
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu lọc 1 CT nào đó : và tổng Nợ thì
Nhập CT cần lọc vào Ô A2
PHP:
 Set Rng = Sheets("Sheet1").[A5].CurrentRegion
    Rng.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("A1:B2"), CopyToRange:=Range("A4:B4")
 

File đính kèm

Upvote 0
Cũng như bạn ChanhTQ@ đã nói, code không phải là vấn đề nếu bạn thành thạo Advanced Filter (cách dùng bằng tay)
Nếu thành thạo rồi thì:
- Record macro quá trình này
- Xem và "dọn dẹp" lại code cho gọn
Chỉ vậy thôi
Như file của bạn thì code chỉ ngắn gọn thế này thôi:
PHP:
Sub UniqueData()
  Dim Rng As Range
  Set Rng = Range("DS")
  Rng.AdvancedFilter 2, , [B2], True
  With Range([B2], [B65536].End(xlUp))
    .Offset(2).Sort [B4], 1
  End With
End Sub
Tuy nhiên bạn lưu ý:
- Dử liệu gốc của bạn có dòng rổng nên khi lọc ra sẽ không được như ý
- Muốn dùng Advanced Filter thì name DS phải tính luôn tiêu đề

Cách làm gần giống, cho em góp vui nhé :

PHP:
Function DanhSach(MangDL As Range, Optional MangMa As Range) As String
    On Error Resume Next
    Application.Volatile (False)
    Dim i As Long
    If MangDL.Rows.Count < 1 Then Exit Function
    If MangMa.Rows.Count = 0 Then DanhSach = MangDL(1): Exit Function
    For i = 1 To MangDL.Rows.Count
        If MangDL(i) <> "" Then
        If IsError(WorksheetFunction.Match(MangDL(i), MangMa, 0)) = True Then
            DanhSach = MangDL(i)
            Exit For
    End If: End If: Next
End Function


To ST_Lu! : Em có thể tham khảo từ đây

Thân!
 

File đính kèm

Upvote 0
Nếu lọc danh sách các công ty :
PHP:
Sheets("Sheet1").[A5].CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("C1:C2"), CopyToRange:=Range("A4")
 

File đính kèm

Upvote 0
Em đã dùng UDF để tạo DS duy nhất, nhưng trong quá trình làm phát hiện
------------
Có một công ty là DANKO không thấy chạy sang danh sách duy nhất

----------
Các bác xem file và chỉ giúp UDF đó có vấn đề gì mà bị lỗi vậy?
 

File đính kèm

Upvote 0
He he
Em chuyển sang dùng UDF của anh Bắp thì không bị lỗi, nó tìm được cả DANKO, tổng tiền 2 sheet là bằng nhau..

----------
He he
 

File đính kèm

Upvote 0
Cái dòng số 6 bạn nhập công thức này mới đúng. =unique(DS,ROWS($3:4)) Chúc vui. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Cách làm gần giống, cho em góp vui nhé :

PHP:
Function DanhSach(MangDL As Range, Optional MangMa As Range) As String
    On Error Resume Next
    Application.Volatile (False)
    Dim i As Long
    If MangDL.Rows.Count < 1 Then Exit Function
    If MangMa.Rows.Count = 0 Then DanhSach = MangDL(1): Exit Function
    For i = 1 To MangDL.Rows.Count
        If MangDL(i) <> "" Then
        If IsError(WorksheetFunction.Match(MangDL(i), MangMa, 0)) = True Then
            DanhSach = MangDL(i)
            Exit For
    End If: End If: Next
End Function
To ST_Lu! : Em có thể tham khảo từ đây

Thân!
Hi Mr Okebab!
Tôi vẩn đang có ý nghĩ tạo hàm Unique này thành 1 hàm mãng, Với cú pháp:
rồi Ctrl + Shift + Enter
Nghĩa là khi dùng người ta sẽ quét 1 vùng trống, rồi gõ hàm trên thanh Formula, sau đó Ctrl + Shift + Enter là ra hết 1 lượt
Nói thật tôi đã dợt sơ qua về Array nhưng vẩn còn thấy "đuối" quá (chưa lảnh ngộ 1 cách sâu sắc)... Vì vậy nhân topic này xin Mr Okebab làm giúp 1 hàm mãng như tôi đã trình bày ở trên (ở cấp độ đơn giãn nhất)
Cãm ơn trước!
-------------------------
Ah... Sorry! Tôi thấy đường link mà bạn đưa lên rồi ---> Đúng cái tôi cần về mãng
Cãm ơn nha!
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã dùng UDF để tạo DS duy nhất, nhưng trong quá trình làm phát hiện
------------
Có một công ty là DANKO không thấy chạy sang danh sách duy nhất

----------
Các bác xem file và chỉ giúp UDF đó có vấn đề gì mà bị lỗi vậy?
Lý do là bạn đã đã tự ý bỏ qua VỊ TRÍ
Đáng lý ra tại cell đầu tiên bạn phải gõ:
rồi kéo fill xuống
Đàng này bạn "nhảy cóc" tùm lum nên thiếu mất 1 vài Item là đương nhiên rồi
Thêm nữa: File này nhiều dử liệu, lại dùng SUMPRODUCT với nhiều điều kiện nên nặng quá... Có lẽ nên cải tiến lại (nhất là về phần dử liệu nhập ---> Theo tôi nên sort trước và dùng name động)
 
Upvote 0
AT đã viết:
Thêm nữa: File này nhiều dử liệu, lại dùng SUMPRODUCT với nhiều điều kiện nên nặng quá... Có lẽ nên cải tiến lại (nhất là về phần dử liệu nhập ---> Theo tôi nên sort trước và dùng name động)

Cám ơn Anh
Em khổ công như này là vì phần mềm kế toán bên công ty em " chuối quá" công nợ ai đi bố trí theo cột(tên công A1, kỳ nợ 1,2,3...Tên công ty A2, kỳ nợ 1,2,3...) cứ như vậy vài trăm công ty
Em đành phải Export ra Excell (đó chính là file mà anh nói là file nhập ý). Và tính tuổi nợ của từng công ty theo cột nằm ngang.
Em muốn mỗi lần em clear content file gốc đi, paste file mới vào là dữ liệu tự động tính toán tại Sheet AR

Em hiểu là dùng Sumproduct làm cho tốc độ tính toán chậm đi rất nhiều.
Cách làm (về công thức) của em chịu ảnh hưởng rất nhiều của anh AT. Nhưng còn lâu mới đạt tới tầm đó

Em đang tự hỏi liệu mình có thể thay Sumproduct bằng một Macro nào đó. Và nó không nhỉ?

Cám ơn ANh
 
Lần chỉnh sửa cuối:
Upvote 0
Em khổ công như này là vì phần mềm kế toán bên công ty em " chuối quá" công nợ ai đi bố trí theo cột(tên công A1, kỳ nợ 1,2,3...Tên công ty A2, kỳ nợ 1,2,3...) cứ như vậy vài trăm công ty
Em đành phải Export ra Excell (đó chính là file mà anh nói là file nhập ý). Và tính tuổi nợ của từng công ty theo cột nằm ngang.

Em đang tự hỏi liệu mình có thể thay Sumproduct bằng một Macro nào đó. Và nó không nhỉ?
Đã dùng VBA thì có thể bỏ qua dùng Sumproduct, đến giờ mà em cũng chưa làm xong phần ấy hả, thấy post hỏi nhiều nội dung.
Em đang dùng PM nào vậy, trước khi -> report bao giờ cũng có 1 dbf hay table nào tạo ra, vậy hãy tìm thử. Không có CSDL nào mà bố trí như vậy cả.
 
Upvote 0
Eureka anh ạ

Em mới vào làm thôi. Nên phần mềm còn phải tìm tòi nhiều.
Cái mà em nói đó là Report. Cái đó có cũng như không, vì nhìn vào đó đau cả mắt mới thấy thằng nào đang nợ lâu ngày...

Ví dụ: hôm qua em export ra được hơn 200 row công nợ, nhưng sáng nay export ra được có 150 row công nợ. Chẳng nhé trong một ngày mà có đến 50 mục thanh toán sao?.... he he kiểm tra lại thì không phải.
Hỏi bác viết phần mềm thì bác đó nói là đang nâng cấp.

Em đã lò mò vào và Export ra được CSDL, đó chính là File mà em gửi lên ở # 13, 14 tại Sheet 1.

Nhưng CSDL vẫn còn một sự bố trí chưa phù hợp đó là
- Nó bố trí theo trình tự thời gian do vậy khi làm Excel nó có lỗi sau
+ Ví dụ Công ty A1 vừa nợ 100đ, sau đó chưa có công ty nào nợ thêm, Công ty A1 thanh toán
thì trong cơ sở DL sẽ tạo cho một dòng trống ngay dưới Tên công ty A1 và ngâm hiều dòng này là dòng thanh toán, còn dòng nào không trống sẽ là dòng ghi nợ.
Ví dụ: Tại Sheet 1 : Dòng trên Ê116 là tên công ty, Cells (E117) là dòng rỗng, ổ bên phải D117 số tiền phải hiểu âm là -8630.


Hic; em đang làm cái này cốt yếu để xem tuổi nợ thôi anh ạ:

ThuNghi đã viết:
đến giờ mà em cũng chưa làm xong phần ấy hả,

He he, em mới học anh ơi.
Cám ơn anh nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom