[Nhờ giúp] Tạo list danh sách thỏa mãn nhiều điều kiện

  • Thread starter Thread starter Blad01
  • Ngày gửi Ngày gửi
Liên hệ QC

Blad01

Thành viên thường trực
Tham gia
6/10/07
Bài viết
350
Được thích
28
Xin chào !
Mong mọi người giúp đỡ các tạo list danh sách thỏa mãn các điều kiện sau:
- List danh sách được lấy từ Sheet 'B3'!B8:B18 (có thể Insert thêm dòng).
- List danh sách không được lấy dữ liệu trùng và khoảng trắng.
- List danh sách tự động sắp xếp từ tháng nhỏ đến lớn.
- List danh sách tự động cập nhật thêm dữ liệu mới từ cột Thời gian (cột B:B Sheet B3).
Ưu tiên sử dụng chức năng Data Validation, nếu không thể được mới dùng tới VBA.
Chân thành cảm ơn !
 

File đính kèm

VBA là hợp lý. Chạy code nó tạo Data Validation cho bạn...

Lưu ý: Khi chạy code nó sẽ tạo ra danh sách dùng làm Data Validation tại cell AN2 trở đi...

Mã:
Public Sub GPE()
Dim Dic As Object, I As Long, K As Long
Dim Tmp As String, Arr, dArr
Arr = Sheet1.Range("B9", Sheet1.Range("B65000").End(3)).Value
ReDim dArr(1 To UBound(Arr), 1 To 1)
Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        For I = 1 To UBound(Arr)
        If Len(Arr(I, 1)) Then
        Tmp = Arr(I, 1)
            If Not .Exists(Tmp) Then
                K = K + 1
                .Add Tmp, K
                dArr(K, 1) = Tmp
            End If
        End If
        Next I
    End With
With Sheet2
    .Range("AN2").Resize(1000).ClearContents
    .Range("AN2").Resize(K) = dArr
    .Range("AN2").Resize(K).Sort .Range("AN2"), 1
    .Range("AN2").Resize(K).Name = "LIST"
    .Range("Y2, AA2").Validation.Delete
    .Range("Y2, AA2").Validation.Add 3, , , "=LIST"
End With
Set Dic = Nothing
End Sub

Hình như Sort của Excel sẽ xếp T12.2016 trước T6.2016 => Phần sort này có lẽ nên làm sau khi bạn ấy chuyển dữ liệu ngày tháng dang dạng chuẩn và Format theo ý muốn

@Chủ Topic tham khảo file này nhé
 

File đính kèm

Cảm ơn hai bạn đã quan tâm, giúp đỡ. Tôi đã test thử nhưng thấy còn một số vấn đề sau:
- Đoạn code VBA của bạn hpkhuong không tự động cập nhật list danh sách và chưa sắp xếp được theo thứ tự thời gian từ nhỏ đến lớn. Mong bạn chỉnh sửa, bổ sung lại giúp.
- Cách thứ 2 của bạn dhn46 tôi có thêm một ý tưởng thế này, nhưng do kiến thức về excel còn hạn chế quá mong các bạn xem và thực hiện giúp: Từ danh sách cột 'B3'!B9:B20 dùng công thức để trích xuất dữ liệu sang cột phụ (thỏa mãn điều kiện dữ liệu không trùng nhau), sau đó sắp xếp dữ liệu đã trích xuất theo trình tự thời gian từ nhỏ đến lớn --> đặt name cho vùng dữ liệu để tạo List bằng Data Validation. Ý tưởng của tôi như vậy không biết có khả thi không, nếu có thì dùng công thức như thế nào ? mong mọi người giúp đỡ.
 
Lần chỉnh sửa cuối:
Xin chào !
Mong mọi người giúp đỡ các tạo list danh sách thỏa mãn các điều kiện sau:
- List danh sách được lấy từ Sheet 'B3'!B8:B18 (có thể Insert thêm dòng).
- List danh sách không được lấy dữ liệu trùng và khoảng trắng.
- List danh sách tự động sắp xếp từ tháng nhỏ đến lớn.
- List danh sách tự động cập nhật thêm dữ liệu mới từ cột Thời gian (cột B:B Sheet B3).
Ưu tiên sử dụng chức năng Data Validation, nếu không thể được mới dùng tới VBA.
Chân thành cảm ơn !
Bạn nhận file thử xem đúng ý bận không!!!
 

File đính kèm

Cảm ơn hai bạn đã quan tâm, giúp đỡ. Tôi đã test thử nhưng thấy còn một số vấn đề sau:
- Đoạn code VBA của bạn hpkhuong không tự động cập nhật list danh sách và chưa sắp xếp được theo thứ tự thời gian từ nhỏ đến lớn. Mong bạn chỉnh sửa, bổ sung lại giúp.
- Cách thứ 2 của bạn dhn46 tôi có thêm một ý tưởng thế này, nhưng do kiến thức về excel còn hạn chế quá mong các bạn xem và thực hiện giúp: Từ danh sách cột 'B3'!B9:B20 dùng công thức để trích xuất dữ liệu sang cột phụ (thỏa mãn điều kiện dữ liệu không trùng nhau), sau đó sắp xếp dữ liệu đã trích xuất theo trình tự thời gian từ nhỏ đến lớn --> đặt name cho vùng dữ liệu để tạo List bằng Data Validation. Ý tưởng của tôi như vậy không biết có khả thi không, nếu có thì dùng công thức như thế nào ? mong mọi người giúp đỡ.

Dù ý tưởng của bạn thế nào thì dùng Text làm Date là không phù hợp cho quản trị dữ liệu.
Tôi thì có "ý tưởng" cột B sheet B3 sửa lại dang Date. Muốn Format nó ra cái gì cũng được.
Dùng VBA lọc ra DS duy nhất, Sort từ nhỏ đến lớn, tạo Name cho Validation như trong file này.
 

File đính kèm

Mã:
Public Sub GPE()
Dim Dic As Object, I As Long, K As Long
Dim Tmp As String, Arr, dArr
Arr = Sheet1.Range("B9", Sheet1.Range("B65000").End(3)).Value2
ReDim dArr(1 To UBound(Arr), 1 To 2)
Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        For I = 1 To UBound(Arr)
        If Len(Arr(I, 1)) Then
        Tmp = Arr(I, 1)
            If Not .Exists(Tmp) Then
                K = K + 1
                .Add Tmp, K
                dArr(K, 1) = Tmp
                If InStr(1, Tmp, ".") = 3 Then
                    dArr(K, 2) = Mid(Tmp, 2, 1)
                Else
                    dArr(K, 2) = Mid(Tmp, 2, 2)
                End If
            End If
        End If
        Next I
    End With
With Sheet2
    .Range("AN2").Resize(1000, 2).ClearContents
    .Range("AN2").Resize(K, 2) = dArr
    .Range("AN2").Resize(K, 2).Sort .Range("AO2"), 1
    .Range("AO2").Resize(K).ClearContents
    .Range("AN2").Resize(K).Name = "LIST"
    .Range("Y2, AA2").Validation.Delete
    .Range("Y2, AA2").Validation.Add 3, , , "=LIST"
End With
Set Dic = Nothing
End Sub

Cảm ơn bạn nhiều lắm, code của bạn gần được rồi. Chỉ có điều nếu thời gian nhập từ T1 đến T12 trong cùng một năm thì code chạy ngon lành, nhưng nếu cột B ở sheet 3 nhập thêm thời gian từ T1 đến T12 khác năm thì code không sắp xếp được theo trình tự thời gian ạ. Vì trong cùng một file tôi phải nhập dữ liễu của nhiều năm (ít nhất là 5 năm). Mong bạn nghiên cứu sửa lại code giúp.
Theo cách sort của bạn pkhuong tôi xin có thêm ý tưởng thế này ạ: Ở cột AO, các tháng của năm sau liền kề với năm nhỏ nhất trong bảng dữ liệu cho cộng với 12, tháng của năm tiếp theo sẽ + 12*2,.... Ví dụ: T1.2015 = 1, ... , T12.2015 = 12, T1.2016 = 1+12, ... , T12.2016 = 12+12, T1.2017=1+12*2,... như vậy có thể sort được đúng trình tự thời gian theo code của bạn pkhuong.
tư duy bằng ngôn ngữ VBA em chưa biết cách diễn đạt như thế nào cho đúng, nhưng em suy nghĩ như trên không biết có làm được không. Mong mọi người giúp đỡ
 

File đính kèm

Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom