Tìm Kiếm Trong Data Validation Excel

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,033
Giới tính
Nam
Mình có viết code sau để tạo và sử dụng Data Validation trong Excel sử dụng tốt ...Tuy nhiên có 2 vấn đề phát sinh mà suy nghĩ hoài chua tìm ra cách xử lý ... Vậy úp bài nhờ các Bạn trợ giúp

1/ Vùng dữ liêu nguon() luôn luôn phát sinh nên mình sử dụng Dic để lấy duy nhất gán vào Data Validation ...nếu dữ liệu nhiều phải kéo xuống tìm mất công quá ... Vậy mình muốn hỏi có cách nào từ Sheet2.[C4] ta có thể gõ ký tự đại diện là nó tìm kiếm ra được hay không ?? .... để gán vào đó

2/ Khi mình sử dụng SendKeys ("%{Down}") để cho Data Validation nó xổ xuống cho dễ nhìn thì trên máy mình mất phím Numlock và có sử dụng Shell để bật nó lại tuy nhiên thấy nó cũng cứ nhảy link tinh à

Vậy nhờ các Bạn xem có cách nào khác xử lý tốt 2 vấn đề trên không giúp mình với
Xin cảm ơn
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    Call Validation(Nguon, Sheet2.Range("C4"))
    ''Call ON_Numlock
End Sub

Public Sub Validation(ByVal dArr As Variant, ByVal Target As Range)
    Dim i As Long
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(dArr)
            If Not IsEmpty(dArr(i, 1)) Then
                .Item(dArr(i, 1)) = .Count
            End If
        Next
        Target.Validation.Delete
        If .Count Then Target.Validation.Add 3, , , Join(.Keys, ",")
        ''SendKeys ("%{Down}")
    End With
End Sub

Sub ON_Numlock()
    CreateObject("WScript.Shell").SendKeys "{NUMLOCK}", True
End Sub
 

File đính kèm

  • Data Validation.xlsb
    17.3 KB · Đọc: 61
Lần chỉnh sửa cuối:
Coi bộ bài này khó quá hay sao ta .... mà không thấy bạn nào có một chút ý kiến là Sao :eek:
 
Upvote 0
nói chung dùng tool có sẵn của excel thì chịu khó sống chung với các ưu điểm và hạn chế của nó thoai ^^
mục 1 thì nó ko cho gõ vào rồi nên bó tay , mà cho dù cho gõ vào cũng ko biếtchèn code vào bằng cách nào
mô phỏng 1 cái gần giống Data Validation bác xem dùng đc ko !

http://www.mediafire.com/file/j8jcesizbihbma3/Data+Validation.xlsb
 
Upvote 0
Theo ý tưởng của DHN46 cho câu hỏi số 1: vấn đề bạn đang mắc phải là sự kiện gõ bàn phí khi ô C4 được chọn không được phát hiện trong worksheet Code => Có thể bắt sự kiện nhấn bàn phím (Hook keyboard) khi ô C4 được chọn, khi đó sẽ xử lý phần List của Validation theo Keyword. API thì là điểm mạnh của bạn rồi.
 
Upvote 0
nói chung dùng tool có sẵn của excel thì chịu khó sống chung với các ưu điểm và hạn chế của nó thoai ^^
mục 1 thì nó ko cho gõ vào rồi nên bó tay , mà cho dù cho gõ vào cũng ko biếtchèn code vào bằng cách nào
mô phỏng 1 cái gần giống Data Validation bác xem dùng đc ko !

http://www.mediafire.com/file/j8jcesizbihbma3/Data+Validation.xlsb
Cách để cho gõ link tinh vào c4 không khó ....khó là gõ 1 ký tự đại diện vào đó nó có tìm ra được không

VD: Cam ...thì ta chỉ cần gõ C gợi ý thì nó ra Cam hay gần giống như Cam la Co .... hay không .... Có nghĩa là nó gom lại 1 số từ có ký tự C vậy
 
Lần chỉnh sửa cuối:
Upvote 0
bác thử gõ ký tự đại diện vào cột E , nó cũng ra đc đó ^^!
ví dụ : gõ vào ký tự m thì nó lọc ra các ký tự có chữ cái đầu là m

cách của mình là kết hợp 2 cái Control , 1 cái list box và 1 cái image !
nhấp vào ô nào thì cho ẩn hiện 2 cái control , di chuyển control và cho tính toán lọc dữ liệu , đổ vào list box thôi !
 
Lần chỉnh sửa cuối:
Upvote 0
bác thử gõ ký tự đại diện vào cột E , nó cũng ra đc đó ^^!
ví dụ : gõ vào ký tự m thì nó lọc ra các ký tự có chữ cái đầu là m
Mình mới thử lại thấy OK ...Nhưng vấn đề là Mình sẻ lấy Duy nhất để loại bỏ bớt dữ liệu thừa đi và chỉ áp dụng vào 1 celss C4 thôi thì sửa lại code sao Bạn nhỉ
Lưu ý dữ liệu nguon là biến động tăng dần nên phải xài Dic để lấy duy nhất cho vào Data Datalition
 
Upvote 0
là trong list có 3 ký tự "mía " thì bạn muốn lấy 1 " mía " thôi đúng ko ?
có cần sắp sếp cho đẹp ko ^^
 
Upvote 0
Cách để cho gõ link tinh vào c4 không khó ....khó là gõ 1 ký tự đại diện vào đó nó có tìm ra được không

VD: Cam ...thì ta chỉ cần gõ C gợi ý thì nó ra Cam hay gần giống như Cam la Co .... hay không .... Có nghĩa là nó gom lại 1 số từ có ký tự C vậy
Theo ý tưởng của dhn46 bài trên thì nếu hook được bàn phím tại keyboard thì sẽ nhận giá trị input từ keyboard. Lấy cái này để trích lọc. Sau đó add vào validation.
 
Upvote 0
Theo ý tưởng của dhn46 bài trên thì nếu hook được bàn phím tại keyboard thì sẽ nhận giá trị input từ keyboard. Lấy cái này để trích lọc. Sau đó add vào validation.
Mạnh nói thật là chưa biết làm cách này sao cả ...

Nếu được bạn giúp làm mẫu 1 code úp lên cho các thành viên khác nữa cùng nghiên cứu biết đâu lại khai phá ra 1 cái mới hay nữa nữa
Cảm ơn Bạn
 
Upvote 0
Mạnh nói thật là chưa biết làm cách này sao cả ...

Nếu được bạn giúp làm mẫu 1 code úp lên cho các thành viên khác nữa cùng nghiên cứu biết đâu lại khai phá ra 1 cái mới hay nữa nữa
Cảm ơn Bạn
Cũng mới là ý tưởng, mình chưa thực hiện. Giờ không ngồi máy tính nên chưa thử. Để mình thử tìm hiểu sau rồi thảo luận cùng bạn.
 
Upvote 0
ok bác !
nếu thay ô khác thì bác sửa lại dòng 108 nha (If Target.Address = "$C$4" Then)
hoặc nếu muốn trong 1 vùng thì sửa lại so sánh số cột và số dòng

http://www.mediafire.com/file/o3zz24r09ttf44g/Data+Validation+1.xlsb
Hay đó ... giờ giúp Mạnh nâng cấp lên một chút nữa để ta tìm kiếm cho nó nhanh nhé

1/ Khi ta gõ vào c4 chữ m khi nó tìm kiếm nếu có 1 chữ m thì nó hiện ra đó luôn ta chỉ việc gõ Enter là xong .... thay vì ta phải làm thêm động tác bấm cho nó xổ ra xong mới chọn

2/ Khi ta gõ vào c4 chữ m mà nó tìm ra có nhiều chữ m thì nó xổ ra cái list ta chỉ việc sử dụng chuột hay phím mũi tên lên xuông để chọn nó là xong ....thay vì ta thêm thao tác bấm cho nó xổ ra xong mới chọn

Xin cảm ơn

Nói nhỏ một chút ...Tân hả .... dòm màu code Mạnh biết mà
 
Upvote 0
Mạnh nói thật là chưa biết làm cách này sao cả ...

Nếu được bạn giúp làm mẫu 1 code úp lên cho các thành viên khác nữa cùng nghiên cứu biết đâu lại khai phá ra 1 cái mới hay nữa nữa
Cảm ơn Bạn
Chào bạn,

Hiện tại mình đã tìm được cách bắt sự kiện Keypress khi select cell. Nhưng đang tắc ở vấn đề đưa ký tự thu được qua sự kiện vào đối tượng sẵn có (Cell, Validation). Bạn xem có ý tưởng nào mới cho việc này?

Nếu đưa được cái này vào đối tượng thì sẽ lọc trực tiếp trong Validation khi sự kiện nhấn phím xảy ra như yêu cầu bài #1 của bạn mà không phải dùng Control phụ như bài #3

Code trong Module
Mã:
Option Explicit

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MSG
    hwnd As Long
    Message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type

Private Declare Function WaitMessage Lib "user32" () As Long

Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" _
    (ByRef lpMsg As MSG, ByVal hwnd As Long, _
     ByVal wMsgFilterMin As Long, _
     ByVal wMsgFilterMax As Long, _
     ByVal wRemoveMsg As Long) As Long

Private Declare Function TranslateMessage Lib "user32" _
    (ByRef lpMsg As MSG) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
    (ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     lParam As Any) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long

Private Const WM_KEYDOWN As Long = &H100
Private Const PM_REMOVE  As Long = &H1
Private Const WM_CHAR    As Long = &H102
Private bExitLoop As Boolean

Sub TrackKeyPressInit()

    Dim msgMessage As MSG
    Dim bCancel As Boolean
    Dim iKeyCode As Integer
    Dim lXLhwnd As Long

    On Error GoTo errHandler:
        Application.EnableCancelKey = xlErrorHandler
        bExitLoop = False
        lXLhwnd = FindWindow("XLMAIN", Application.Caption)
    Do
        WaitMessage
        If PeekMessage _
            (msgMessage, lXLhwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE) Then
            iKeyCode = msgMessage.wParam
            TranslateMessage msgMessage
            PeekMessage msgMessage, lXLhwnd, WM_CHAR, _
            WM_CHAR, PM_REMOVE
            If iKeyCode = vbKeyBack Then SendKeys "{BS}"
            If iKeyCode = vbKeyReturn Then SendKeys "{ENTER}"
            bCancel = False
            Sheet_KeyPress _
            ByVal msgMessage.wParam, ByVal iKeyCode, ByVal Selection, bCancel
            If bCancel = False Then
                PostMessage _
                lXLhwnd, msgMessage.Message, msgMessage.wParam, 0
            End If
        End If
errHandler:
        DoEvents
    Loop Until bExitLoop

End Sub

Sub StopKeyWatch()
    bExitLoop = True
End Sub

Private Sub Sheet_KeyPress(ByVal KeyAscii As Integer, _
                           ByVal KeyCode As Integer, _
                           ByVal Target As Range, _
                           Cancel As Boolean)
    k = k + 1
    Debug.Print ChrW(KeyAscii) '<= Nhan su kien Keypress
    'Cells(1, 1) = ChrW(KeyAscii) '<= Khong nhan su kien Keypress
End Sub

Code trong Sheet2
Mã:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$C$4" Then
        TrackKeyPressInit
    Else
        StopKeyWatch
        DoEvents
    End If
End Sub
 
Upvote 0
Chào bạn,

Hiện tại mình đã tìm được cách bắt sự kiện Keypress khi select cell. Nhưng đang tắc ở vấn đề đưa ký tự thu được qua sự kiện vào đối tượng sẵn có (Cell, Validation). Bạn xem có ý tưởng nào mới cho việc này?

Nếu đưa được cái này vào đối tượng thì sẽ lọc trực tiếp trong Validation khi sự kiện nhấn phím xảy ra như yêu cầu bài #1 của bạn mà không phải dùng Control phụ như bài #3

Code trong Module
Mã:
Option Explicit

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MSG
    hwnd As Long
    Message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type

Private Declare Function WaitMessage Lib "user32" () As Long

Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" _
    (ByRef lpMsg As MSG, ByVal hwnd As Long, _
     ByVal wMsgFilterMin As Long, _
     ByVal wMsgFilterMax As Long, _
     ByVal wRemoveMsg As Long) As Long

Private Declare Function TranslateMessage Lib "user32" _
    (ByRef lpMsg As MSG) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
    (ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     lParam As Any) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long

Private Const WM_KEYDOWN As Long = &H100
Private Const PM_REMOVE  As Long = &H1
Private Const WM_CHAR    As Long = &H102
Private bExitLoop As Boolean

Sub TrackKeyPressInit()

    Dim msgMessage As MSG
    Dim bCancel As Boolean
    Dim iKeyCode As Integer
    Dim lXLhwnd As Long

    On Error GoTo errHandler:
        Application.EnableCancelKey = xlErrorHandler
        bExitLoop = False
        lXLhwnd = FindWindow("XLMAIN", Application.Caption)
    Do
        WaitMessage
        If PeekMessage _
            (msgMessage, lXLhwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE) Then
            iKeyCode = msgMessage.wParam
            TranslateMessage msgMessage
            PeekMessage msgMessage, lXLhwnd, WM_CHAR, _
            WM_CHAR, PM_REMOVE
            If iKeyCode = vbKeyBack Then SendKeys "{BS}"
            If iKeyCode = vbKeyReturn Then SendKeys "{ENTER}"
            bCancel = False
            Sheet_KeyPress _
            ByVal msgMessage.wParam, ByVal iKeyCode, ByVal Selection, bCancel
            If bCancel = False Then
                PostMessage _
                lXLhwnd, msgMessage.Message, msgMessage.wParam, 0
            End If
        End If
errHandler:
        DoEvents
    Loop Until bExitLoop

End Sub

Sub StopKeyWatch()
    bExitLoop = True
End Sub

Private Sub Sheet_KeyPress(ByVal KeyAscii As Integer, _
                           ByVal KeyCode As Integer, _
                           ByVal Target As Range, _
                           Cancel As Boolean)
    k = k + 1
    Debug.Print ChrW(KeyAscii) '<= Nhan su kien Keypress
    'Cells(1, 1) = ChrW(KeyAscii) '<= Khong nhan su kien Keypress
End Sub

Code trong Sheet2
Mã:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$C$4" Then
        TrackKeyPressInit
    Else
        StopKeyWatch
        DoEvents
    End If
End Sub
hiện em cũng đang tìm hiểu code này, nhưng không biết bắt sự kiện, xử lý ký tự nhập vào thế nào? ở đâu.
ngồi cả tuần nay mà chả làm được
nhất là gõ tiếng việt
nếu sử lý ở Sheet_KeyPress
chữ "đến" nó sẽ ra "đêsn", nhưng xử lý chuỗi lúc ta nhập vào thì nó chỉ được mỗi chữ "sn"
 
Upvote 0
Mình có viết code sau để tạo và sử dụng Data Validation trong Excel sử dụng tốt ...Tuy nhiên có 2 vấn đề phát sinh mà suy nghĩ hoài chua tìm ra cách xử lý ... Vậy úp bài nhờ các Bạn trợ giúp

1/ Vùng dữ liêu nguon() luôn luôn phát sinh nên mình sử dụng Dic để lấy duy nhất gán vào Data Validation ...nếu dữ liệu nhiều phải kéo xuống tìm mất công quá ... Vậy mình muốn hỏi có cách nào từ Sheet2.[C4] ta có thể gõ ký tự đại diện là nó tìm kiếm ra được hay không ?? .... để gán vào đó

2/ Khi mình sử dụng SendKeys ("%{Down}") để cho Data Validation nó xổ xuống cho dễ nhìn thì trên máy mình mất phím Numlock và có sử dụng Shell để bật nó lại tuy nhiên thấy nó cũng cứ nhảy link tinh à

Vậy nhờ các Bạn xem có cách nào khác xử lý tốt 2 vấn đề trên không giúp mình với
Xin cảm ơn
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    Call Validation(Nguon, Sheet2.Range("C4"))
    ''Call ON_Numlock
End Sub

Public Sub Validation(ByVal dArr As Variant, ByVal Target As Range)
    Dim i As Long
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(dArr)
            If Not IsEmpty(dArr(i, 1)) Then
                .Item(dArr(i, 1)) = .Count
            End If
        Next
        Target.Validation.Delete
        If .Count Then Target.Validation.Add 3, , , Join(.Keys, ",")
        ''SendKeys ("%{Down}")
    End With
End Sub

Sub ON_Numlock()
    CreateObject("WScript.Shell").SendKeys "{NUMLOCK}", True
End Sub
em nhớ vụ trích lọc trong Data Validation thầy ndu có làm 1 lần mà bằng công thức và cột phụ trong excel chứ không phải code, mà giờ tìm lại bài đó thì thua. công cụ tìm kiếm của GPE chả tìm ra. @@
 
Upvote 0
em nhớ vụ trích lọc trong Data Validation thầy ndu có làm 1 lần mà bằng công thức và cột phụ trong excel chứ không phải code, mà giờ tìm lại bài đó thì thua. công cụ tìm kiếm của GPE chả tìm ra. @@
Tôi thường tìm bằng google theo cú pháp:
Mã:
 Từ khóa site:www.giaiphapexcel.com
Cái file mà bạn nói tôi tìm nó ra vầy:
https://www.google.com.vn/?gfe_rd=c...++trong+Validation+site:www.giaiphapexcel.com
 
Upvote 0
Hay đó ... giờ giúp Mạnh nâng cấp lên một chút nữa để ta tìm kiếm cho nó nhanh nhé

1/ Khi ta gõ vào c4 chữ m khi nó tìm kiếm nếu có 1 chữ m thì nó hiện ra đó luôn ta chỉ việc gõ Enter là xong .... thay vì ta phải làm thêm động tác bấm cho nó xổ ra xong mới chọn

2/ Khi ta gõ vào c4 chữ m mà nó tìm ra có nhiều chữ m thì nó xổ ra cái list ta chỉ việc sử dụng chuột hay phím mũi tên lên xuông để chọn nó là xong ....thay vì ta thêm thao tác bấm cho nó xổ ra xong mới chọn

Xin cảm ơn

Nói nhỏ một chút ...Tân hả .... dòm màu code Mạnh biết mà

miềng ko phải Tân ^^
http://www.mediafire.com/file/v8udshcb2mjx6od/Data+Validation+2.xlsb
nhập = bàn phím , ko dùng chuột !
thank you !
 
Upvote 0
Tôi thường tìm bằng google theo cú pháp:
Mã:
 Từ khóa site:www.giaiphapexcel.com
Cái file mà bạn nói tôi tìm nó ra vầy:
https://www.google.com.vn/?gfe_rd=cr&ei=ZERsWeTOEbCl8wfskqfQAQ&gws_rd=ssl#q=Cải+thiện+chức+năng+settings+-+list++trong+Validation+site:www.giaiphapexcel.com

dùng công thức để filter Validation chỉ dùng cho người bình thường. Khổ cái ở đây toàn dân quậy, thích bắt sự kiện key_press khi đang gõ chữ lên ô biết sao giờ.
Nhưng mà tôi nói trước cho các dân quậy nha, đừng có dại mà đi theo đường Hook Keyboard bàn phím, đơn giản vì thông điệp bàn phím KHÔNG PHẢN ÁNH được nội dung trong ô .
 
Upvote 0
Web KT
Back
Top Bottom