Ấn tổ hợp phím thì hiện lên list danh sách - Validation động

Liên hệ QC

lebaquy

Thành viên mới
Tham gia
4/11/09
Bài viết
13
Được thích
1
Chào các bạn! Hồi trước mình thấy có bạn có file excel khi mà nhập tên cty nào đấy thì chỉ cần ấn tổ hợp phím Ctrl + B một cái thì một danh sách các cty hiện lên cho mình chọn. Các bạn giúp mình cách để khi ấn tổ hợp phím sẽ có list danh sách mình cần hiện lên. Cảm ơn các bạn nhiều!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Chào các bạn! Hồi trước mình thấy có bạn có file excel khi mà nhập tên cty nào đấy thì chỉ cần ấn tổ hợp phím Ctrl + B một cái thì một danh sách các cty hiện lên cho mình chọn. Các bạn giúp mình cách để khi ấn tổ hợp phím sẽ có list danh sách mình cần hiện lên. Cảm ơn các bạn nhiều!

Nếu trong vùng A1 :A10 bạn đã nhập một vài tên khách hàng rồi, Tại ô A11, bạn chỉ cần bấm Alt+Keydown là sẽ hiện ra list danh sách đã có trong vùng A1:A10 cho bạn chọn.
 
Nếu trong vùng A1 :A10 bạn đã nhập một vài tên khách hàng rồi, Tại ô A11, bạn chỉ cần bấm Alt+Keydown là sẽ hiện ra list danh sách đã có trong vùng A1:A10 cho bạn chọn.

Nếu theo cách của DANH thì click chuột phải chọn Pick From Drop-down List... cũng cho ra danh sách nữa đấy! Đặc biệt là không trùng tên!
 
Nếu theo cách của DANH thì click chuột phải chọn Pick From Drop-down List... cũng cho ra danh sách nữa đấy! Đặc biệt là không trùng tên!
Pick From Drop-down List hoàn toàn tương đương với tổ hợp phím Alt + mũi tên xuống
Lúc đầu khi phát hiện ra chức năng này của Excel, tôi thấy nó quá hay.. và nghĩ rằng ta sẽ không cần mất công viết code chi cho mệt... nhưng thật ra không phải thế! Chức năng này vẫn có 1 hạn chế đáng tiếc là nó không "chơi" với dử liệu số ---> Các bạn thử sẽ biết liền
Chờ đến version 2007, tưởng có cải tiến thêm, ai dè vẫn thế... thậm chí có nhiều món còn "cải lùi"...
 
Vậy thì ta viết Class đi! Em đang nghiền món này lắm, nhưng không biết cách viết code như thế nào? Bác nào chỉ dạy với! Please....
Thân.
 
Pick From Drop-down List hoàn toàn tương đương với tổ hợp phím Alt + mũi tên xuống
Lúc đầu khi phát hiện ra chức năng này của Excel, tôi thấy nó quá hay.. và nghĩ rằng ta sẽ không cần mất công viết code chi cho mệt... nhưng thật ra không phải thế! Chức năng này vẫn có 1 hạn chế đáng tiếc là nó không "chơi" với dử liệu số ---> Các bạn thử sẽ biết liền
Chờ đến version 2007, tưởng có cải tiến thêm, ai dè vẫn thế... thậm chí có nhiều món còn "cải lùi"...

Đúng như lời Thầy nói, nó không "chơi" với số, còn cái List trong Validation thì chơi tất cả, nhưng lại trùng tên tùm lum luôn, chẳng chịu lọc cho mình... Bất cập nhỉ?

Món này đã từng đăng trên diển đàn rồi, cả VBA lẩn giải pháp công thức!
Các bạn xem tại đây:
Pick From List !

Trời, xem Validation bằng công thức lọc của Thầy xong là kết "model" liền Thầy ui. Cám ơn rất nhiều!

Tôi thấy một điều trùng hợp như vầy, khi ta có 1 danh sách và nhập kế tiếp tên, nếu tên na ná nhau thì nó "đề nghị" mình cái tên nào đó có sẳn trong danh sách (chức năng Enable AutoComplete for cell values), với cái này, Text ta nhập thì được, nhưng Number thì Never! Phải chăng nó có liên quan đến Drop-down List???
 
Chỉnh sửa lần cuối bởi điều hành viên:
Gửi các bạn thêm 1 cách sử dụng Validation bằng VBA.
VD minh họa là sử dụng Validation trong cột A :
PHP:
Sub worksheet_selectionchange(ByVal target As Range)
Dim i As Long, Str As String
On Error Resume Next
If target.Column > 1 Or (target.Rows.Count + target.Columns.Count) > 2 Then Exit Sub
For i = 1 To target.Row - 1
If WorksheetFunction.CountIf(Range("A1:A" & i), Cells(i, 1)) = 1 Then Str = Str & Cells(i, 1) & ","
Next i
With target.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Str
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowInput = True
    .ShowInput = False
    .ShowError = False
End With
End Sub
 

File đính kèm

Gửi các bạn thêm 1 cách sử dụng Validation bằng VBA.
VD minh họa là sử dụng Validation trong cột A :
PHP:
Sub worksheet_selectionchange(ByVal target As Range)
Dim i As Long, Str As String
On Error Resume Next
If target.Column > 1 Or (target.Rows.Count + target.Columns.Count) > 2 Then Exit Sub
For i = 1 To target.Row - 1
If WorksheetFunction.CountIf(Range("A1:A" & i), Cells(i, 1)) = 1 Then Str = Str & Cells(i, 1) & ","
Next i
With target.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Str
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowInput = True
    .ShowInput = False
    .ShowError = False
End With
End Sub
Dùng Dictionary Object sẽ hay hơn rất nhiều:
PHP:
Private Dic As New Dictionary
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Clls As Range
  If Not Intersect(Range("A1:A20"), Target) Is Nothing Then
    On Error Resume Next
    For Each Clls In Range("A1:A20")
      If Clls <> "" Then Dic.Add Clls.Value, ""
    Next
    With Target.Validation
      .Delete
      .Add 3, , , Join(Dic.Keys, ",")
      .ShowError = False
    End With
  End If
End Sub
Request Microsoft Scripting Runtime
 
Dùng Dictionary Object sẽ hay hơn rất nhiều:
PHP:
Private Dic As New Dictionary
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim Clls As Range
  If Not Intersect(Range("A1:A20"), Target) Is Nothing Then
    On Error Resume Next
    For Each Clls In Range("A1:A20")
      If Clls <> "" Then Dic.Add Clls.Value, ""
    Next
    With Target.Validation
      .Delete
      .Add 3, , , Join(Dic.Keys, ",")
      .ShowError = False
    End With
  End If
End Sub
Request Microsoft Scripting Runtime

Code của anh hình như thiếu lọc duy nhất và bẫy lỗi thì phải.

Mình gửi thêm 1 cách khác, vừa lọc duy nhất vừa Sort. nhưng dùng 1 cột phụ.
PHP:
Sub worksheet_selectionchange(ByVal target As Range)
On Error Resume Next
Application.EnableEvents = False
If target.Column > 1 Or (target.Rows.Count + target.Columns.Count) > 2 Then Exit Sub
[IV:IV].ClearContents
Range("A1:A" & [A65536].End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
                                        CopyToRange:=[IV1], Unique:=True
If [IV1] = [IV2] Then [IV1].ClearContents
[IV:IV].Sort Key1:=[IV1], Order1:=xlAscending
With target.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="=" & Range([IV1], [IV1].End(xlDown)).Address
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowInput = True
    .ShowInput = False
    .ShowError = False
End With
Application.EnableEvents = True
End Sub
 

File đính kèm

Code của anh hình như thiếu lọc duy nhất và bẫy lỗi thì phải.
Keys Properties trong Dictionary Object mặc nhiên nó là Unique list rồi còn gì ---> Cái này tự thân nó như thế, ta chẳng phải làm bất cứ 1 thao tác nào để "rào đón" gì ráo
Đấy mới chính điểm độc đáo của Dictionary Object, nhất là khi làm công việc có liên quan đến Unique list
Bạn thử xem sẽ biết
Xem file đính kèm (code chưa hoàn chỉnh lắm, chỉ là thuật toán thôi)
---------------------
Advanced Filter là công cụ rất mạnh, nhưng đáng tiếc khi nào bạn xây dựng UDF thì lại không thể dùng nó được ---> đó là chưa nói đến vùng dử liệu không phải là 1 cột thì bạn AF cách nào
Dictionary Object thì lại khác ---> Nó chơi tất tần tật trong mọi kiểu dử liệu, mọi cách bố trí dử liệu luôn!
 

File đính kèm

Lần chỉnh sửa cuối:
Code của các Thầy cái nào cũng tuyệt vời cả, hơn thằng Drop-down List cái vụ number, tuy nhiên thua thằng này cái Sort!

Xin cảm ơn các Thầy!!!

Sorry, quên để ý cái code này của Thầy NDU:

PHP:
Sub worksheet_selectionchange(ByVal target As Range) 
On Error Resume Next 
Application.EnableEvents = False 
If target.Column > 1 Or (target.Rows.Count + target.Columns.Count) > 2 Then Exit Sub 
[IV:IV].ClearContents 
Range("A1:A" & [A65536].End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _ 
                                        CopyToRange:=[IV1], Unique:=True 
If [IV1] = [IV2] Then [IV1].ClearContents 
[IV:IV].Sort Key1:=[IV1], Order1:=xlAscending 
With target.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
            Operator:=xlBetween, Formula1:="=" & Range([IV1], [IV1].End(xlDown)).Address 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowInput = False 
    .ShowError = False 
End With 
Application.EnableEvents = True 
End Sub

Cám ơn Thầy NDU.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom