Sau khi sử dụng hàm Unique (mới tìm hiểu VBA nhờ giúp đỡ)

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

quen_tat_ca

Thành viên mới
Tham gia
7/9/24
Bài viết
4
Được thích
0
Mình sử dụng hàm Unique để loại bỏ các số trùng nhau và dán vào cột C, nhưng dùng theo cách 1 thì nó bị dư ra các cột không có giá trị ( không biết nói sao cho dễ hiểu, các bác xem file gửi kèm sẽ hiểu rỏ), còn dùng cách 2 thì nó dán thiếu dữ liệu. Nhờ các bác ch3 dùm. Xin cám ơn trước các bác.
 

File đính kèm

  • Unique.xlsm
    16.5 KB · Đọc: 14
Mình sử dụng hàm Unique để loại bỏ các số trùng nhau và dán vào cột C, nhưng dùng theo cách 1 thì nó bị dư ra các cột không có giá trị ( không biết nói sao cho dễ hiểu, các bác xem file gửi kèm sẽ hiểu rỏ), còn dùng cách 2 thì nó dán thiếu dữ liệu. Nhờ các bác ch3 dùm. Xin cám ơn trước các bác.
Code này nhờ chat GPT
Mã:
Sub cach2()
    Dim lr As Long
    Dim UniqueValues As Variant
    Dim i As Long
    lr = Sheet1.Range("A3").End(xlDown).Row
    
    ' L?y các giá tr? duy nh?t
    UniqueValues = Application.WorksheetFunction.Unique(Sheet1.Range("A3:A" & lr))
    
    ' Xóa d? li?u cu
    Sheet2.Range("E3:E1000").ClearContents
    
    ' Dán các giá tr? duy nh?t, b? qua #N/A
    For i = 1 To UBound(UniqueValues)
        If Not IsError(UniqueValues(i, 1)) Then
            Sheet2.Range("E" & i + 2).Value = UniqueValues(i, 1)
        End If
    Next i
End Sub
 
Upvote 0
Mình sử dụng hàm Unique để loại bỏ các số trùng nhau và dán vào cột C, nhưng dùng theo cách 1 thì nó bị dư ra các cột không có giá trị ( không biết nói sao cho dễ hiểu, các bác xem file gửi kèm sẽ hiểu rỏ), còn dùng cách 2 thì nó dán thiếu dữ liệu. Nhờ các bác ch3 dùm. Xin cám ơn trước các bác.
Tham khảo hàm Unique của anh @ndu96081631
 
Upvote 0
Mình sử dụng hàm Unique để loại bỏ các số trùng nhau và dán vào cột C, nhưng dùng theo cách 1 thì nó bị dư ra các cột không có giá trị ( không biết nói sao cho dễ hiểu, các bác xem file gửi kèm sẽ hiểu rỏ), còn dùng cách 2 thì nó dán thiếu dữ liệu. Nhờ các bác ch3 dùm. Xin cám ơn trước các bác.
Thử đoạn M Code này xem sao ?
Mã:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    DanhSach = List.Sort(List.RemoveNulls(List.Distinct(Source[Column1])))
in
    DanhSach
 

File đính kèm

  • Untitled.png
    Untitled.png
    18.4 KB · Đọc: 2
Upvote 0
Cách 1 tưởng dư nhưng thật ra vẫn thiếu:

- Sheet1 dữ liệu đến dòng 92, nhưng ô A48 bỏ trống, nên dùng End(xlDown) chỉ tới dòng 47. Do đó cách 1 xét thiếu các giá trị từ 49 đến 92.
- Sheet2 lấy kết quả của cách 1, giá trị duy nhất từ 3 đến 47 của sheet1 chỉ có 13 giá trị, nhưng gán tới tận dòng 47 nên từ dòng 16 trở xuống là NA vì dư so với kết quả

Cách 2: Không phải là thiếu. Kết quả cũng 13 giá trị nhưng chỉ gán xuống 1 ô E3 nên chỉ nhận 1 giá trị đầu tiên. Nên biết rằng hàm Unique của sheet, chỉ chạy trên sheet mới có chuyện SPILL, còn khi chạy trong VBA nó là 1 mảng, phải gán xuống 1 vùng đúng kích thước của mảng.

Cách đúng về lý thuyết được 17 kết quả:

Mã:
Sub CachDung()
Dim lr As Long, Arr()
lr = Sheet1.Range("A10000").End(xlUp).Row
Arr = Application.WorksheetFunction.Unique(Sheet1.Range("A3:A" & lr))
Sheet2.Range("G3").Resize(UBound(Arr, 1), 1).Value = Arr
End Sub

Tuy nhiên hàm Unique xem ô trống cũng là 1 giá trị nên kết quả sẽ có ô trống nằm giữa. Vậy thì thêm 1 dòng lệnh sort là xong:
Mã:
Sheet2.Range("G3").Resize(UBound(Arr, 1), 1).Sort Key1:=Range("G3"), Order1:=xlAscending


Có lẽ đặt câu hỏi cho GPT có bao gồm việc xuất hiện lỗi NA nên lòi ra vòng lặp kiểm tra Error, thực chất là không cần. Dù vậy, GPT không ngó dữ liệu nên vẫn dùng xldown và bị thiếu y như cách 1 (chỉ được 13 kết quả). Cách đúng sẽ được 17.
 
Upvote 0
Ca này hơi căng.
Mới tìm hiểu VBA mà đi vào chỗ này thì hơi khó học tiếp. Mà bảo họ học lại từ đầu thì họ nghĩ rằng mình đã biết một phần rồi, tại sao phải học lại?
Cái mà hộ cố tình chối là cái phần họ đã học qua không bao gồm phần căn bản.
 
Upvote 0
Ca này hơi căng.
Mới tìm hiểu VBA mà đi vào chỗ này thì hơi khó học tiếp. Mà bảo họ học lại từ đầu thì họ nghĩ rằng mình đã biết một phần rồi, tại sao phải học lại?
Cái mà hộ cố tình chối là cái phần họ đã học qua không bao gồm phần căn bản.
Chết 1 nỗi là thiếu mà vẫn tưởng dư (cách 1). Chứng tỏ là không tự kiểm tra được kết quả, chỉ thấy NA là hoảng lên.
Tác giả bài 2 cũng thế, thấy NA tưởng lỗi NA do code sinh ra nên câu hỏi đặt ra cho GPT tập trung vào sửa lỗi.
Còn GPT thì hỏi gì trả lời nấy thôi, nó có đọc được dữ liệu đâu mà biết dữ liệu chẳng có ô lỗi nào, lại còn có 1 ô trống.
 
Upvote 0
Ca này hơi căng.
Mới tìm hiểu VBA mà đi vào chỗ này thì hơi khó học tiếp. Mà bảo họ học lại từ đầu thì họ nghĩ rằng mình đã biết một phần rồi, tại sao phải học lại?
Cái mà hộ cố tình chối là cái phần họ đã học qua không bao gồm phần căn bản.
Coi như bài #5 là 1 chút xíu căn bản, nếu nhớ được thì tốt:
1. Application.WorksheetFunction với hàm mảng chạy trên sheet khác hoàn toàn với chạy trên VBA
2. Nắm rõ dữ liệu của chính mình, ít nhất là có quan sát.
3. Bình tĩnh kiểm tra kết quả và không phát hoảng.
4. Chiêu trò loại bỏ ô trống bằng cách sort, cộng thêm câu lệnh sort.
5. Cách lấy số dòng của mảng bằng UBound
6. Cách gán kết quả mảng đúng kích thước bằng cách Resize.

Dù chuyên mục căn bản có cả trăm điều nhưng biết dần dần cũng tốt, miễn là chịu hỏi.
 
Upvote 0
Web KT

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

Back
Top Bottom