Hỏi về Data Validation

Liên hệ QC
E hỏi thêm chút, liệu list có thể đưa ra gợi ý về việc lựa chọn (như kiểu đánh hàm số trên excel)
Giả dụ: nhập chữ H ở list thì đưa ra lựa chọn như: Hà Nội, Hà Nam... Hà Tiên ???

Hình như bạn muốn nhập liệu nhanh!
Yêu cầu nhiều quá, đã đến lúc bạn nên nghĩ đến việc dùng UserForm thay vì Validation
UserForm kết hợp ComboBox và ListBox sẽ đáp ứng mọi thứ bạn cần (gần giống như tra từ điển)
 
Hình như bạn muốn nhập liệu nhanh!
Yêu cầu nhiều quá, đã đến lúc bạn nên nghĩ đến việc dùng UserForm thay vì Validation
UserForm kết hợp ComboBox và ListBox sẽ đáp ứng mọi thứ bạn cần (gần giống như tra từ điển)
Quả thật.. thầy đi GUỐC trong bụng học trò..
Chỉ có điều.. e cũng có nghiên cứu userform nhưng cứ như +-+-+-+... khó khó là khó
 
Quả thật.. thầy đi GUỐC trong bụng học trò..
Chỉ có điều.. e cũng có nghiên cứu userform nhưng cứ như +-+-+-+... khó khó là khó
Xem file mẫu đính kèm nhé
Hướng dẫn sơ qua cách dùng như clip dưới đây

[video=youtube;H1MGVQ31KcE]http://www.youtube.com/watch?v=H1MGVQ31KcE&feature=youtu.be[/video]


Bạn gõ vài ký tự vào ComboBox, lập tức Listbox sẽ lọc ra những dữ liệu liên quan
Cho phép nhập ký tự đại diện như *, ?...
(dữ liệu được lấy từ sheet MC nha)
----------------
Cách hàm đã viết sẵn cả rồi, giờ việc của bạn là:
- Thay đổi thiết kế của UserForm cho phù hợp
- Thay đổi vùng dữ liệu gốc cho phù hợp
vậy thôi
 

File đính kèm

  • FilterAndSort_2DArray_03.xlsm
    55.1 KB · Đọc: 70
Xem file mẫu đính kèm nhé
Hướng dẫn sơ qua cách dùng như clip dưới đây

[video=youtube;H1MGVQ31KcE]http://www.youtube.com/watch?v=H1MGVQ31KcE&feature=youtu.be[/video]


Bạn gõ vài ký tự vào ComboBox, lập tức Listbox sẽ lọc ra những dữ liệu liên quan
Cho phép nhập ký tự đại diện như *, ?...
(dữ liệu được lấy từ sheet MC nha)
----------------
Cách hàm đã viết sẵn cả rồi, giờ việc của bạn là:
- Thay đổi thiết kế của UserForm cho phù hợp
- Thay đổi vùng dữ liệu gốc cho phù hợp
vậy thôi
Thầy ơi... This video is private ạh
 
1> Code trong Module:
Mã:
Function UniqueList(ParamArray sArray())
  Dim Item, tmpArr, SubArr, tmp
  On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each SubArr In sArray
      tmpArr = SubArr
      If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
      For Each Item In tmpArr
        tmp = CStr(Item)
        If Len(tmp) Then
          If Not .Exists(tmp) Then .Add tmp, ""
        End If
      Next
    Next
    If .Count Then UniqueList = .Keys
  End With
End Function
2> Code sự kiện SelectionChange
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "[COLOR=#ff0000]$G$9[/COLOR]" Then
    Dim arr, rng As Range
    Set rng = [COLOR=#0000cd]Range("D5:D1000")[/COLOR]
    arr = UniqueList(rng)
    If IsArray(arr) Then
      With Target
        .Validation.Delete
        .Validation.Add 3, , , Join(arr, ",")
      End With
    End If
  End If
End Sub
Bạn nhập liệu gì cứ thây kệ, hể chọn vào cell G9 là list sẽ tự cập nhất
Lưu ý:
- Chổ màu đỏ là cell chứa Validaiton
- Chổ màu xanh là vùng dữ liệu cần lấy list duy nhất
Cứ tùy biến 2 chổ đỏ xanh ấy thoải mái, những chổ khác cứ để nguyên
E có sử dụng code này của thày để lọc dữ liệu duy nhất, ở một số sheet khác thì không thấy có lỗi.. nhưng khi kích vào ô D2 của sheet này để chọn thì báo lỗi này, ko biết là lỗi j ạh?
 

File đính kèm

  • run time error.jpg
    run time error.jpg
    92.5 KB · Đọc: 7
  • VBA.jpg
    VBA.jpg
    138.2 KB · Đọc: 5
E có sử dụng code này của thày để lọc dữ liệu duy nhất, ở một số sheet khác thì không thấy có lỗi.. nhưng khi kích vào ô D2 của sheet này để chọn thì báo lỗi này, ko biết là lỗi j ạh?

Đoán thôi: Có thể cái list mà bạn định cho vào Validation nó quá dài... dài đến mức quá tải
Chỉ đoán thôi chứ không có file cũng không biết được gì
 
Đoán thôi: Có thể cái list mà bạn định cho vào Validation nó quá dài... dài đến mức quá tải
Chỉ đoán thôi chứ không có file cũng không biết được gì
name "Phong_dm" là 204 bản ghi (liệu có quá dài)
Nhưng, E cũng áp dụng cách này cho sheet khác thì ko thấy báo lỗi j ạh...
Dạ, e có phát hiện ra là nếu protect sheet thì báo lỗi mà unprotect thì lại ko báo lỗi này ạh
 
Lần chỉnh sửa cuối:
Có khi nào trong source của list data validation vừa chứa phần tử là chuỗi, vừa có phần tử là hàm số được không ạh?
 
1> Code trong Module:
Mã:
Function UniqueList(ParamArray sArray())
  Dim Item, tmpArr, SubArr, tmp
  On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each SubArr In sArray
      tmpArr = SubArr
      If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
      For Each Item In tmpArr
        tmp = CStr(Item)
        If Len(tmp) Then
          If Not .Exists(tmp) Then .Add tmp, ""
        End If
      Next
    Next
    If .Count Then UniqueList = .Keys
  End With
End Function
2> Code sự kiện SelectionChange
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = [SIZE=3][B]"[COLOR=#ff0000]$G$9[/COLOR]"[/B][/SIZE] Then
    Dim arr, rng As Range
    Set rng = [COLOR=#0000cd]Range("D5:D1000")[/COLOR]
    arr = UniqueList(rng)
    If IsArray(arr) Then
      With Target
        .Validation.Delete
        .Validation.Add 3, , , Join(arr, ",")
      End With
    End If
  End If
End Sub
Bạn nhập liệu gì cứ thây kệ, hể chọn vào cell G9 là list sẽ tự cập nhất
Lưu ý:
- Chổ màu đỏ là cell chứa Validaiton
- Chổ màu xanh là vùng dữ liệu cần lấy list duy nhất
Cứ tùy biến 2 chổ đỏ xanh ấy thoải mái, những chổ khác cứ để nguyên
Cho e hỏi bổ sung thêm chỗ này chút ạh.. liệu có thay cái target ( If Target.Address = "$G$9") này thành 1 mảng không, vì e muốn cái data vali này ko chỉ 1 cell mà ở một range..
E có mạnh dạn thay bằng cái này If Target.Address = "G9:G2000" Then mà ko có được
tks
 
Lần chỉnh sửa cuối:
Cho e hỏi bổ sung thêm chỗ này chút ạh.. liệu có thay cái target ( If Target.Address = "$G$9") này thành 1 mảng không, vì e muốn cái data vali này ko chỉ 1 cell mà ở một range..
E có mạnh dạn thay bằng cái này If Target.Address = "G9:G2000" Then mà ko có được
tks

Trật lất!
Vầy mới đúng:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  [COLOR=#ff0000]If Not Intersect(Range("G9:G2000"), Target) Is Nothing Then[/COLOR]
    Dim arr, rng As Range
    Set rng = Sheets("data").Range("list")
    arr = UniqueList(rng)
    arr = Sort1DArray(arr, True, False)
    If IsArray(arr) Then
      With [COLOR=#ff0000]Intersect(Range("G9:G2000"), Target)[/COLOR]
        .Validation.Delete
        .Validation.Add 3, , , Join(arr, ",")
      End With
    End If
  End If
End Sub
 
Trật lất!
Vầy mới đúng:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  [COLOR=#ff0000]If Not Intersect(Range("G9:G2000"), Target) Is Nothing Then[/COLOR]
    Dim arr, rng As Range
    Set rng = Sheets("data").Range("list")
    arr = UniqueList(rng)
    arr = Sort1DArray(arr, True, False)
    If IsArray(arr) Then
      With [COLOR=#ff0000]Intersect(Range("G9:G2000"), Target)[/COLOR]
        .Validation.Delete
        .Validation.Add 3, , , Join(arr, ",")
      End With
    End If
  End If
End Sub
E có sửa lại thì báo lỗi này
New Picture.jpg
Vậy là sao hả Thầy???
 
Web KT

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

Back
Top Bottom