Tìm Kiếm Trong Data Validation Excel (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,133
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

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
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 !
Mạnh mới đến xài tới 7 vòng For .... và tại sao ta ....

1/ Không sử dụng Data Datavaliton thật mà phải xài Data Datavaliton giả ....
2/ Nếu code đó điều chỉnh lại áp dụng cho Data Datavaliton thật .... thì điều gì sẻ xảy ra ...??!!!
3/ Mạnh thấy chèn 1 cái Controls làm giả Data Datavalition đó là gì ...phải check thêm cái gì mới thấy nó .... Máy Mạnh tìm hoài không thấy
4/ Phải chăng sử dụng Data Datavaliton thật cho bài này là vấn đề khó ....???!!!
....................
Với yêu cầu bài 1 làm ra được như vậy là quá tốt ...........Thuật toán hay ..........
Nhưng Mạnh vẫn nêu ra mấy vấn đề trên để mở rộng đường ta nghiên cứu tiếp .........
Làm 1 cái Data Datavaltion thật xem tình hình sao ... hay viết 1 hàm bao quát nhất xử lý được 2 vấn đề bài 1

Nghiên cứu thêm thôi mà .............Nhức đầu quá :D
Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
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 ô .
Vậy có cách nào để bắt sự kiện khi gõ chữ trong cells ko anh. Hook thì được nhưng xử lý chuỗi sau khi enter thấy khó quá.
 
Upvote 0
Có chứ. mắt người nhìn thấy được thì code cũng lấy được. --=0--=0
Bạn AutoReply có thể vui lòng Code phần này, và nếu được thì chỉ cho mình thêm phần Hook để lấy mọi ký tự khi bàn phím được nhấn, không phân biệt nhấn trên ứng dụng nào, rất mong phản hồi từ bạn.
 
Upvote 0
Bạn AutoReply có thể vui lòng Code phần này, và nếu được thì chỉ cho mình thêm phần Hook để lấy mọi ký tự khi bàn phím được nhấn, không phân biệt nhấn trên ứng dụng nào, rất mong phản hồi từ bạn.

phần này là phần gì vậy bạn ?
Mình vô tình tìm thấy có đường dẫn này
http://www.giaiphapexcel.com/diendan/threads/xả-xì-chét.108295/page-4#post-692303
bạn xem thử "hắn" làm có giống với ý bạn chăng ? chi tiết thì mình không biết, tại đâu phải mình làm =))
Về việc Hook bàn phím bạn nên xem lại đường dẫn của MS
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
chú ý họ viết về tham số thứ 3, 4 , xem làm thế nào để thực hiện Hook trên toàn bộ các Process. Mình dốt lắm không có hiểu được nhiều đâu bạn ơi. Chớ nên xem trọng mình +-+-+-++-+-+-+
 
Upvote 0
phần này là phần gì vậy bạn ?
Mình vô tình tìm thấy có đường dẫn này
http://www.giaiphapexcel.com/diendan/threads/xả-xì-chét.108295/page-4#post-692303
bạn xem thử "hắn" làm có giống với ý bạn chăng ? chi tiết thì mình không biết, tại đâu phải mình làm =))
Về việc Hook bàn phím bạn nên xem lại đường dẫn của MS
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
chú ý họ viết về tham số thứ 3, 4 , xem làm thế nào để thực hiện Hook trên toàn bộ các Process. Mình dốt lắm không có hiểu được nhiều đâu bạn ơi. Chớ nên xem trọng mình +-+-+-++-+-+-+
ơ, vậy bác không phải chim hồng à. chắc cái đó đúng ý rồi đấy bác. có thể thì cho em xin code phần đó với, như trong video ấy
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh mới đến xài tới 7 vòng For .... và tại sao ta ....

1/ Không sử dụng Data Datavaliton thật mà phải xài Data Datavaliton giả ....
2/ Nếu code đó điều chỉnh lại áp dụng cho Data Datavaliton thật .... thì điều gì sẻ xảy ra ...??!!!
3/ Mạnh thấy chèn 1 cái Controls làm giả Data Datavalition đó là gì ...phải check thêm cái gì mới thấy nó .... Máy Mạnh tìm hoài không thấy
4/ Phải chăng sử dụng Data Datavaliton thật cho bài này là vấn đề khó ....???!!!
....................
Với yêu cầu bài 1 làm ra được như vậy là quá tốt ...........Thuật toán hay ..........
Nhưng Mạnh vẫn nêu ra mấy vấn đề trên để mở rộng đường ta nghiên cứu tiếp .........
Làm 1 cái Data Datavaltion thật xem tình hình sao ... hay viết 1 hàm bao quát nhất xử lý được 2 vấn đề bài 1

Nghiên cứu thêm thôi mà .............Nhức đầu quá :D
Xin cảm ơn

1/ là vì mình chỉ biết cách dùng Data Datavaliton sơ sơ à , nói chung nó là công cụ chuẩn của nhà phát triển thì mình chỉ có thể sử dụng đc các tính năng nó hỗ trợ thôi , khi sử dụng Data Datavaliton , mình xét các các tính năng như cho phép thêm danh sách chọn , cho phép enter , nhập các kiểu , ..v.v..v và ..v..v.. , nếu phù hợp mình sẽ chọn nó , mà nghĩ cho cùng Data Datavaliton cũng chỉ là danh sách đổ xuống thôi mà có nhiều cách để giải quyết ^^
2/ nếu sửa lại cho Data Datavaliton thì làm sao khi gõ vào ký tự đại diện vào ô C4 nó cho phép gọi 1 sự kiện nào đó , đàng này nếu ô C4 set Data Datavaliton thì nó khóa lại , ko cho bạn nhảy qua ô khác khi nhập sai , và báo lỗi Data ko có trong danh sách gì đó , vậy thì ko chèn code vào đc , nếu dùng bắt sự kiện bàn phím thì lại ko phân biệt đc chữ tiếng Việt , mà đc thì cũng lắm công phu @@ !
3 / cái control mình dùng là List box , Excel 2010 bạn vào Developer -> Design Mode là thấy nó , còn muốn add thì Developer ->Insert -> ( Activex Control ) -> chọn List box
4 / nói chung Data Datavaliton khó hay ko thì chắc là do cảm tính thôi , vì nó hỗ trợ chỉ đến thế thì chỉ dùng đc như thế , nếu rảnh thì nghiên cứu chơi cũng đc , còn để áp dụng công việc nếu ko rành sẽ làm tăng chí phí về ( thời gian + bảo dưỡng ) , mình chỉ thấy cái nào dễ sử dụng , và biết sử dụng thì mình làm thôi ,

có 2 thuật toán mình sử dụng trong đó là sort và Group , để xử lý ra dữ liệu mong muốn , còn nạp nó vào Data Datavaliton thế nào thì mình chịu thôi , hoặc nạp đc nhưng phải thêm vài thao tác !
 
Upvote 0
Bạn AutoReply có thể vui lòng Code phần này, và nếu được thì chỉ cho mình thêm phần Hook để lấy mọi ký tự khi bàn phím được nhấn, không phân biệt nhấn trên ứng dụng nào, rất mong phản hồi từ bạn.
Cứ yên tâm đi cái này sư phụ Mạnh mà ra tay thì nó là chuyên nhỏ như con

1/ là vì mình chỉ biết cách dùng Data Datavaliton sơ sơ à , nói chung nó là công cụ chuẩn của nhà phát triển thì mình chỉ có thể sử dụng đc các tính năng nó hỗ trợ thôi , khi sử dụng Data Datavaliton , mình xét các các tính năng như cho phép thêm danh sách chọn , cho phép enter , nhập các kiểu , ..v.v..v và ..v..v.. , nếu phù hợp mình sẽ chọn nó , mà nghĩ cho cùng Data Datavaliton cũng chỉ là danh sách đổ xuống thôi mà có nhiều cách để giải quyết ^^
2/ nếu sửa lại cho Data Datavaliton thì làm sao khi gõ vào ký tự đại diện vào ô C4 nó cho phép gọi 1 sự kiện nào đó , đàng này nếu ô C4 set Data Datavaliton thì nó khóa lại , ko cho bạn nhảy qua ô khác khi nhập sai , và báo lỗi Data ko có trong danh sách gì đó , vậy thì ko chèn code vào đc , nếu dùng bắt sự kiện bàn phím thì lại ko phân biệt đc chữ tiếng Việt , mà đc thì cũng lắm công phu @@ !
3 / cái control mình dùng là List box , Excel 2010 bạn vào Developer -> Design Mode là thấy nó , còn muốn add thì Developer ->Insert -> ( Activex Control ) -> chọn List box
4 / nói chung Data Datavaliton khó hay ko thì chắc là do cảm tính thôi , vì nó hỗ trợ chỉ đến thế thì chỉ dùng đc như thế , nếu rảnh thì nghiên cứu chơi cũng đc , còn để áp dụng công việc nếu ko rành sẽ làm tăng chí phí về ( thời gian + bảo dưỡng ) , mình chỉ thấy cái nào dễ sử dụng , và biết sử dụng thì mình làm thôi ,

có 2 thuật toán mình sử dụng trong đó là sort và Group , để xử lý ra dữ liệu mong muốn , còn nạp nó vào Data Datavaliton thế nào thì mình chịu thôi , hoặc nạp đc nhưng phải thêm vài thao tác !
Câu 2 ý Bạn là xử lý lỗi khi gõ ký tự không có trong Data Datavaliton thì nó báo lỗi như hình đúng không ....Nếu muốn gõ link tinh vào đó mà nó không báo lỗi thì đơn giản lắm mấy từ là xong ...Capture.PNG
 
Upvote 0
Nếu sử dụng hook bàn phím thì chữ tiếng anh thì được nhưng còn chữ tiếng việt vì có sử dụng bộ gõ unikey nên không hiện thi được tiếng việt nữa.
 
Upvote 0
phần này là phần gì vậy bạn ?
Mình vô tình tìm thấy có đường dẫn này
http://www.giaiphapexcel.com/diendan/threads/xả-xì-chét.108295/page-4#post-692303
bạn xem thử "hắn" làm có giống với ý bạn chăng ? chi tiết thì mình không biết, tại đâu phải mình làm =))
Về việc Hook bàn phím bạn nên xem lại đường dẫn của MS
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
chú ý họ viết về tham số thứ 3, 4 , xem làm thế nào để thực hiện Hook trên toàn bộ các Process. Mình dốt lắm không có hiểu được nhiều đâu bạn ơi. Chớ nên xem trọng mình +-+-+-++-+-+-+
Chào bạn,

Qua bài của bạn mình mới biết bạn "Chim Hồng" là "zai" - (hắn, gái chắc dùng ả :) )

Cũng qua bài này giúp mình mở mang thêm nhưng thêm bài #29 nữa thì mình cũng tò mò về các phương án có thể thi triển +-+-+-+. Rất mong bạn AutoReply code cho mình và mọi người tham khảo.
 
Upvote 0
Chào bạn,

Qua bài của bạn mình mới biết bạn "Chim Hồng" là "zai" - (hắn, gái chắc dùng ả :) )

Cũng qua bài này giúp mình mở mang thêm nhưng thêm bài #29 nữa thì mình cũng tò mò về các phương án có thể thi triển +-+-+-+. Rất mong bạn AutoReply code cho mình và mọi người tham khảo.

ở trên có ghi rồi mà bạn
chi tiết thì mình không biết, tại đâu phải mình làm =))
mình thấy có video đó làm được nên mình nghĩ là được thôi chứ có biết code gì đâu bạn. Chắc có hiểu lầm gì ở đây rồi chăng. +-+-+-++-+-+-+
 
Upvote 0
ở trên có ghi rồi mà bạn

mình thấy có video đó làm được nên mình nghĩ là được thôi chứ có biết code gì đâu bạn. Chắc có hiểu lầm gì ở đây rồi chăng. +-+-+-++-+-+-+
Video điền vào Form ở chế độ Showmodal = False thì ngay code mình up cũng đã làm được. Vấn đề mình đang đưa ra là điền dữ liệu vào Cell.

Bạn AutoReply vừa giỏi (mình đã xem nhiều bài của bạn) vừa khiêm tốn mình còn phải học tập nhiều.
 
Upvote 0
Vấn đề mình đang đưa ra là điền dữ liệu vào Cell.
có nghĩa là vừa điền vào cell thì dữ liệu trên cell đó hiện lên form luôn sao bác. em cũng đang tò mò cái này. có code thực hiện vụ này được chắc đã lắm (phát triển thêm được vài tiện ích có sẵn trên diễn đàn được, làm vài cái mã mở cho dân tình thế thái học hỏi cũng được).
thấy vụ này addins A tools làm được sao không hỏi luôn tác giả nhỉ, bác chim hồng thấy lâu quá không onl ( thế mà trước giờ cứ nghĩ AutoReply là nick khác của bác ấy- toàn cao thủ ẩn dật) chắc không hỏi được.
còn code hook sự kiện đó thì em nghĩ không giống trong video của bác chim hồng và addins A tools, vì cả 2 khi nhấn đều còn thấy được địa chỉ ô, trong khi đó code ở #1 thì không thấy được địa chỉ ô.
 
Lần chỉnh sửa cuối:
Upvote 0
có nghĩa là vừa điền vào cell thì dữ liệu trên cell đó hiện lên form luôn sao bác. em cũng đang tò mò cái này. có code thực hiện vụ này được chắc đã lắm (phát triển thêm được vài tiện ích có sẵn trên diễn đàn được, làm vài cái mã mở cho dân tình thế thái học hỏi cũng được).
thấy vụ này addins A tools làm được sao không hỏi luôn tác giả nhỉ, bác chim hồng thấy lâu quá không onl ( thế mà trước giờ cứ nghĩ AutoReply là nick khác của bác ấy- toàn cao thủ ẩn dật) chắc không hỏi được.
còn code hook sự kiện đó thì em nghĩ không giống trong video của bác chim hồng và addins A tools, vì cả 2 khi nhấn đều còn thấy được địa chỉ ô, trong khi đó code ở #1 thì không thấy được địa chỉ ô.
Bạn mới học VBA thì cứ từ từ mà tìm hiểu. Bạn biết đọc Code, biết áp dụng Code rồi thì cứ theo Code tôi up mà triển, nếu chưa biết thì mò tiếp như tôi, cứ thử, không được thử tiếp chứ có hiểu ý nghĩa mô tê gì đâu :) .


Addin Atool bạn thích thì bạn hãy liên hệ với tác giả vì đó là sản phẩm thương mại và cũng không nằm trong vấn đề đang thảo luận.
 
Upvote 0
có nghĩa là vừa điền vào cell thì dữ liệu trên cell đó hiện lên form luôn sao bác. em cũng đang tò mò cái này. có code thực hiện vụ này được chắc đã lắm (phát triển thêm được vài tiện ích có sẵn trên diễn đàn được, làm vài cái mã mở cho dân tình thế thái học hỏi cũng được).
thấy vụ này addins A tools làm được sao không hỏi luôn tác giả nhỉ, bác chim hồng thấy lâu quá không onl ( thế mà trước giờ cứ nghĩ AutoReply là nick khác của bác ấy- toàn cao thủ ẩn dật) chắc không hỏi được.
còn code hook sự kiện đó thì em nghĩ không giống trong video của bác chim hồng và addins A tools, vì cả 2 khi nhấn đều còn thấy được địa chỉ ô, trong khi đó code ở #1 thì không thấy được địa chỉ ô.
Phần mền A Tool làm được như vậy cũng phải dùng kỹ thuật hook keyboard và bẫy các sự kiện....để sử lý thông tin nhập vào và đưa lại vào cell.
 
Upvote 0
Mạnh mới nghĩ ra 1 giải pháp đơn giản vầy ... Nhờ các bạn Tham gia thêm
1/ Tại C4 ta gõ chữ m xong Enter ...xong ta chọn Biểu tượng Data nó xổ ra cái cần lọc ...
Tương Tự như vây ... Gõ chữ đ vv...

2/ Còn rắc rối lắm ........ là phải thực hiện tới 3 thao tác mới cho ra kết quả

3/ Chưa xử lý được SendKeys

Mong các bạn tham gia thêm
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    If Target.Address = [C4].Address Then
        Call GetListValidation(Nguon(), Sheet2.Range("C4"))
    End If
End Sub

Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, dk As String, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    dk = Sheet2.Range("C4").Value
    For i = 1 To UBound(Arr)
        If InStr(1, Arr(i, 1), dk) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.Keys, ",")
            ''SendKeys ("%{Down}") ', True
            .ShowError = False
        End If
    End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mạnh mới nghĩ ra 1 giải pháp đơn giản vầy ... Nhờ các bạn Tham gia thêm
1/ Tại C4 ta gõ chữ m xong Enter ...xong ta chọn Biểu tượng Data nó xổ ra cái cần lọc ...
Tương Tự như vây ... Gõ chữ đ vv...

2/ Còn rắc rối lắm ........ là phải thực hiện tới 3 thao tác mới cho ra kết quả

3/ Chưa xử lý được SendKeys

Mong các bạn tham gia thêm
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    If Target.Address = [C4].Address Then
        Call GetListValidation(Nguon(), Sheet2.Range("C4"))
    End If
End Sub

Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, dk As String, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    dk = Sheet2.Range("C4").Value
    For i = 1 To UBound(Arr)
        If InStr(1, Arr(i, 1), dk) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.Keys, ",")
            ''SendKeys ("%{Down}") ', True
            .ShowError = False
        End If
    End With
End Sub
Cách này của bạn thì sự kiện trên cell đã xử lý xong rồi. Mà làm đơn giản nữa thì sort nguồn rồi dùng offset để thiết lập vùng validation
 
Upvote 0
Cách này của bạn thì sự kiện trên cell đã xử lý xong rồi. Mà làm đơn giản nữa thì sort nguồn rồi dùng offset để thiết lập vùng validation
Mình mới viết sơ bộ vậy ... còn rắc rối lắm ....Sort Nguon thì không được vì nguon còn liên quan các cột và dòng khác nữa
Mình chưa nghĩ ra làm sao gõ vào c4 xong Enter một cái nó ra luôn nếu có 1 chữ m hay nếu có nhiều chữ m thì nó ra 1 list ....nếu bạn biết chỉ dùm
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh mới nghĩ ra 1 giải pháp đơn giản vầy ... Nhờ các bạn Tham gia thêm

vọc thử !
source của bác ok roài , chỉnh lại 4 chỗ là chạy đc !
số 444 chưa hoàn chỉnh lắm !

PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)         '111
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    If Target.Address = [C4].Address Then
 
        If Selection.Address = Target.Address Then Exit Sub '---222
        Target.Select                                       '---333
        Call GetListValidation(Nguon(), Sheet2.Range("C4"))
    End If
End Sub

Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, dk As String, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    dk = Sheet2.Range("C4").Value
    For i = 1 To UBound(Arr)
        If InStr(1, Arr(i, 1), dk) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.Keys, ",")
            .ShowError = False
            SendKeys ("%{Down}")    '---444
        End If
 
       
 
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
vọc thử !
source của bác ok roài , chỉnh lại 4 chỗ là chạy đc !

PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)         '111
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    If Target.Address = [C4].Address Then
 
        If Selection.Address = Target.Address Then Exit Sub '---222
        Target.Select                                       '---333
        Call GetListValidation(Nguon(), Sheet2.Range("C4"))
    End If
End Sub

Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, dk As String, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    dk = Sheet2.Range("C4").Value
    For i = 1 To UBound(Arr)
        If InStr(1, Arr(i, 1), dk) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.Keys, ",")
            .ShowError = False
        End If
 
         SendKeys ("%{Down}")    '---444
 
    End With
End Sub
Vậy là tam ok .... Manh mới thêm Ucase vào 1 chút ...nếu xóa trắng c4 nó lấy hết

PHP:
Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    For i = 1 To UBound(Arr)
        If InStr(1, UCase(Arr(i, 1)), UCase(Target.Value)) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.Keys, ",")
            .ShowError = False
        End If
        If Dic.Count > 1 Then SendKeys ("%{Down}")
        Target.Select
    End With
    Set Dic = Nothing
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
dòng SendKeys ("%{Down}") '---444
mình cho lại vào trong if rồi , để bên ngoài bị lỗi ,
còn chừa lại 1 trường hợp là nếu trong danh sách có 1 ký tự thì ko xổ list ra mà cho vào C4 luôn !
mục 444 bác chỉnh lại , so sánh giá trị Dic sao đó để đc như ý ^^
 
Upvote 0
dòng SendKeys ("%{Down}") '---444
mình cho lại vào trong if rồi , để bên ngoài bị lỗi ,
còn chừa lại 1 trường hợp là nếu trong danh sách có 1 ký tự thì ko xổ list ra mà cho vào C4 luôn !
mục 444 bác chỉnh lại , so sánh giá trị Dic sao đó để đc như ý ^^
đang chinh chỗ có 1 cái chưa được .... Chỉnh dùm mạnh đi :D
Thử gõ c xong chon co xem là thấy .....có vấn đề
 
Upvote 0
nói chung cũng ko rành Dic lắm
chỗ đó mình nghĩ là trong trường hợp Dic.Count=1 , và giá trị ô C4 <> giá trị duy nhất trong Dic
thì lấy giá trị trong Dic gán ra ô C4 , nhưng lấy giá trị duy nhất trong Dic ra sao ta @@
sửa phần xét send key chắc là xong rùi đó !
thôi ngủ phát !
 
Upvote 0
và nếu được thì chỉ cho mình thêm phần Hook để lấy mọi ký tự khi bàn phím được nhấn, không phân biệt nhấn trên ứng dụng nào.
Có một số sự kiện trong sytem mà rất có thể một ứng dụng nào đó quan tâm. Vd. tôi rất muốn system báo cho tôi biết khi có một phím nào được nhấn, chuột được click, move (trong cửa sổ nào đó của ứng dụng của tôi hoặc trong trong bất cứ cửa sổ nào trong system), khi có một cửa sổ nào đó được tạo ra hoặc bị hủy (vd. nếu ta khởi động notepad thì có một cửa sổ được tạo ra có class là "notepad", mà trong nó có cửa sổ con có class là "Edit". Cửa sổ con này là toàn bộvùng trắng mà ta nhìn thấy của trình soạn thảo văn bản)
Nếu ứng dụng có nhu cầu thì "đặt đơn" lên system xin hook cụ thể. Ứng dụng đặt đơn bằng cách gọi hàm SetWindowsHookEx với các tham số. Tham số đầu là để "báo cáo" cho sytem về loại hook cần đặt. Tham số thứ hai là địa chỉ của hàm callback. Nếu ta lập trình trong vd. VB, Delphi v...v thì code của callback có thể nằm ở trong code của ứng dụng hoặc nằm trong thư viện DLL. Về các yêu cầu thì phải đọc trong help về tham số thứ 3 và 4. Khi hàm SetWindowsHookEx trảvề giá trị <> 0 thì có nghĩa là hook đã được cài đặt thành công, và kể từ lúc này cho tới khi "nộp đơn" xin hủy hook (UnhookWindowsHookEx) khi sự kiện liên quan tới hook sảy ra thì system sẽ gọi hàm callback (do có địa chỉ của nó rồi) và truyền vào 3 tham số. Trong tham số wParam vàlParam chứa đựng mọi thông tin về sự kiện. Ứng dụng sẽ lọc ra các thông tin cần thiết để xử lý.

Rất có thể có nhiều khách hàng cùng quan tâm vd. sự kiện liên quan tới bàn phím. Lúc này cáckhách sẽ được sắp xếp theo một hàng - anh nào đặt đơn càng muộn thì càng đứng trước. Khi sảy ra sự kiện thì system sẽ gọi callback của anh đầu tiên - anh đăng ký muộn nhất, tiếp theo gọi callback của anh thứ hai v...v. Nhưng không phải lúc nào cũng thế. Tiếp theo tôi sẽ chỉ ra.

Code của callback có thể xử lý sự kiện hoặc không làm gì nhưng luôn trả về kết quả (vì callback là hàm).
1. Nếu callback trả về giá trị do CallNextHookEx trả về, tức có (vd. hàm callback có tên là LowLevelKeyboardProc)
Mã:
LowLevelKeyboardProc = CallNextHookEx(HookHandle, code, wParam, lParam)
thì system sẽ gọi callback của các khách tiếp theo, và cuối cùng thì gửi thông điệp tới cửa sổ đích - cửa sổ mà ở đó có sự kiện sảy ra.
2. Nếu callback trả về giá trị <> 0 (không có code ở điểm 1) thì system sẽ không gọi callback của những khách ở sau và không gửi thông điệp tới cửa sổ đích. Tức nếu có 10 khách mà khách thứ 1 và 2 đều trả về giá trị do CallNextHookEx trả về thì sytem sẽ gọi callback của khách thứ ba. Nếu khách thứ 3 trả về giá trị <> 0 thì sytem sẽ không gọi callback của khách 4, 5, ..., 10, và cũng không gửi thông điệp tới cửa sổ đích. Tức chuỗi "chăm sóc khách hàng" bị đứt ở khách thứ 3. Đây là ích kỷ. Lộc là của chung, mọi người cùng hưởng. Chỉ trừ khi ta có nhu cầu "chính đáng" thì mới ngắt chuỗi "chăm sóc khách hàng".
3. Nếu khách hàng nào trả về giá trị 0 thì system sẽ không gọi callback của những khách đứng sau nhưng sẽ gửi thông điệp tới cửa sổ đích. Riêng về phần này thì nếu tôi còn nhớ nó đúng với những khách khác. Riêng về khách Unikey (Unikey cũng gọi SetWindowsHookEx.) thì lại không đúng. Tức code của tôi ngắt chuỗi "chăm sóc khách hàng" nhưng callback của Unikey vẫn được gọi. Tôi không tìm hiểu thêm vì sao.

Lý thuyết chỉ có vậy. Nhưng nếu ai đó định dùng cho bài cụ thể ở chủ đề này thì chướng ngại trùng trùng điệp điệp. Thậm chí không phải chỉ do Unikey.

Trước hết ta xét việc gỏ một đoạn văn bản không dấu, tức chỉ a-z, A-Z, dùng bàn phím của Windows chứ không dùng Unikey. Sau khi gõ một loạt ký tự thì ta nhấn phím BACK. Vd. gõ "Anh an com go" và phát hiện gõ sai vậy ta nhấn BACK rồi nhấn "a" để có Anh an com ga". Khi bạn bắt được các phím liên tiếp "A, n, h, , a, n, , c, o, m, , g, o, BACK, a" thì bạn phải biết biến chuỗi 15 ký tự đó thành chuối 13 ký tự "Anh an com ga". Bạn có thể ghi nhớ các phím vào một buffer nhưng ở trên là trường hợp dễ, chỉ việc "vứt đi" 2 phím "o" và BACK. Nhưng nếu tôi thấy sai ở giữa văn bản nên tôi click vào giữa văn bản rồi nhấn một loại BACK hoặc DELETE thì làm sao code biết là tôi đã xóa bao nhiêu ký tự và xóa ở đoạn nào? Kết quả là code có một loại ký tự vàmột loạt BACK - DELETE nhưng làm sao code từ một mớ ký tự đó tạo ra được chuỗi đang hiển thị ở trình soạn thảo văn bản? Như thế thì mớ chuỗi ký tự kia là vô dụng, có cũng như không. Mà nếu tôi nhấn BACK - DELETE là còn thông cảm đấy. Nếu tôi bôi đen một đoạn giữa văn bản rồi nhấn DELETE thì code chỉ bắt được 1 DELETE nhưng thực chất cả một đoạn dài đã bị xóa. Và xóa bao nhiêu, ở đâu thì cũng chịu.

Về Unikay nếu nói thật ngắn gọi, sơ qua thì nó đặt đơn hook bàn phím và chuột. Nó hoạt động trên cơ sở đánh tráo. Cụ thể thế nào? Vd. bạn đang có thiết lập Unicode và kiểu gõ Telex. Khi bạn gõ "a" thì nó ghi nhớ trong buffer của mình. Khi bạn gõ tiếp "a" thì nó phát hiện ra và lúc đó nó sẽ giả nhấn BACK để xóa "a" rồi sau đó nó sẽ gửi ký tự "â" tới trình soạn văn bản. Nếu bạn cũng đăng ký hook thì bạn sẽ nhận được 3 phím: "a", "a", BACK. Code của bạn là tổng quát, làm sao nó biết là phải biến a, a, BACK thành "â"? Ai đó có thể gõ bằng bàn phím Anh "a, a, BACK" (gõ nhầm 2 ký tự "a") để có "a" thôi thì sao? Do "â" được Unikey gửi tới cửa sổ đích bằng thông điệp (PostMessageW + WM_CHAR) mà không phải do được gõ trên bàn phím nên code của bạn không nhận được.

Nói tóm lại chướng ngại trùng trùng điệp điệp để có thể dùng trong chủ đề này. Tôi không nói là không thể. Có thể không cần "sưu tầm" một mớ phím gõ mà chỉ ... chăng? Cái quan trọng nhất là ý tưởng. Nếu có ý tưởng thì nhiều khi lại phải thốt lên: ơ sao lại đơn giản thế.

Vọc hook cũng cần nhớ là do ta không làm chủ được code của Excel (ai mà biết nó có gì, cũng chả can thiệp vào nó được) nên rất có thể khi làm một việc nào đó code của ta sẽ xung đột với code của Excel. Vd. làm một việc gì đó khi bảng tính đang ở chế độ Edit cell - ai đó đang gõ dữ liệu trong cell, thì có thể Excel sẽ chết đột ngột, thậm chí không có thông báo báo tử. Vì thế phải rất thận trọng.

Nhưng nếu muốn vọc chơi thì tôi đính kèm tập tin. Tùy nhu cầu xử lý cái gì, lọc cái gì mà code sẽ khác đi. Hãy khởi động tập tin -> nhấn nút Hook -> cữ gõ chơi một lúc, hoặc mở notepad rồi gõ trong notepad (ở VN chắc gõ bằng Unikey). Kết quả sẽ có trong tập tin Excel. Vd. gõ trong notepad "a, a, BACK" thì trong notepad chỉ còn "â" và trong Excel có 3 kết quả "a, a, BACK".
 

File đính kèm

Upvote 0
dhn46 xin cảm ơn bác batman1, những giải thích của bác rất cặn kẽ dễ hiểu nhưng ứng dụng được là 1 vấn đề tìm tòi lớn của dhn46.

Bác cho dhn46 hỏi thêm 1 câu nữa: trong file ví dụ của bác bắt được Keyboard trên các ứng dụng, nhưng khi dhn46 thử như sau thì không được:

Tài khoản Window: User (Không phải Admin)
Chạy 1 ứng dụng cài đặt bất kỳ => hiện bảng UAC => Gõ keyboard

Khi xem lại file Excel thì trường hợp này không phát hiện.

Vậy có cách nào để bắt được Keyboard cho trường hợp này không ạ? Nếu được bác có thể cho dhn46 tham khảo file được không bác.

dhn46 xin cảm ơn bác.
 
Upvote 0
Trước hết ta xét việc gỏ một đoạn văn bản không dấu, tức chỉ a-z, A-Z, dùng bàn phím của Windows chứ không dùng Unikey. Sau khi gõ một loạt ký tự thì ta nhấn phím BACK. Vd. gõ "Anh an com go" và phát hiện gõ sai vậy ta nhấn BACK rồi nhấn "a" để có Anh an com ga". Khi bạn bắt được các phím liên tiếp "A, n, h, , a, n, , c, o, m, , g, o, BACK, a" thì bạn phải biết biến chuỗi 15 ký tự đó thành chuối 13 ký tự "Anh an com ga". Bạn có thể ghi nhớ các phím vào một buffer nhưng ở trên là trường hợp dễ, chỉ việc "vứt đi" 2 phím "o" và BACK. Nhưng nếu tôi thấy sai ở giữa văn bản nên tôi click vào giữa văn bản rồi nhấn một loại BACK hoặc DELETE thì làm sao code biết là tôi đã xóa bao nhiêu ký tự và xóa ở đoạn nào? Kết quả là code có một loại ký tự vàmột loạt BACK - DELETE nhưng làm sao code từ một mớ ký tự đó tạo ra được chuỗi đang hiển thị ở trình soạn thảo văn bản? Như thế thì mớ chuỗi ký tự kia là vô dụng, có cũng như không. Mà nếu tôi nhấn BACK - DELETE là còn thông cảm đấy. Nếu tôi bôi đen một đoạn giữa văn bản rồi nhấn DELETE thì code chỉ bắt được 1 DELETE nhưng thực chất cả một đoạn dài đã bị xóa. Và xóa bao nhiêu, ở đâu thì cũng chịu..
em cũng vọc vụ này hổm rày và chết ngắt trong đoạn trên.
chắc vọc sỹ mới chơi nên chả nghĩ được ý tưởng để giải quyết.
hic..... hic....
em tải thử file trên về thì việc hook nếu gõ chữ ngay trên cells của excel thì lệnh không thực hiện, nếu nhấn ra ngoài excel thì lệnh mới chạy. vậy thì khác với code của bác dhn46 rồi bác nhỉ
 
Lần chỉnh sửa cuối:
Upvote 0
Tạo danh sách tìm kiếm nhiều cột và lọc hay tim trong validation mà muốn dùng chính ngay mục nhập tại ô soạn thảo excel là kỹ thuật vô cùng khó! Excel không mở đối tượng để người lập trình can thiệp và vào các thuộc tính, sự kiện vào đối tượng nhập liệu. Hiện nay A-Tools đã hack được vào đối tượng này để bắt sự kiện và tôi đã tạo ra tính năng nhập liệu nâng cao. Đây là kỹ thuật lập trình API với Hook, Subclass ở mức độ rất cao cấp, nó không phải can thiệp thông thường như các chuyên gia lập trình API trong Windows trên thế giới. Chính vì thế kỹ thuật bắt sự kiện vào mục nhập liệu của Excel - không chèn Active Controls trở thành "bí quyết" công nghệ.
Video tôi chia sẻ dưới đây không có ý quảng cáo mà chỉ ra những khó khăn và bất cập nếu lập trình VBA thông thường để tạo danh sách tìm kiếm nhiều cột như các sản phẩm khác của nhiều người, bên cạnh đó tôi cũng chỉ ra 8 đặc tính khó mà tôi đã xử lý được trong chức năng này, nếu bạn nào muốn làm thì coi như đây là ý tưởng thiết kế tham khảo.
(Tôi có thể chia sẻ kiến thức về kỹ thuật lập trình API cũng như về VBA trong các vấn đề ngoài chức năng của A-Tools. Sorry!).
 
Upvote 0
Tạo danh sách tìm kiếm nhiều cột và lọc hay tim trong validation mà muốn dùng chính ngay mục nhập tại ô soạn thảo excel là kỹ thuật vô cùng khó! Excel không mở đối tượng để người lập trình can thiệp và vào các thuộc tính, sự kiện vào đối tượng nhập liệu. Hiện nay A-Tools đã hack được vào đối tượng này để bắt sự kiện và tôi đã tạo ra tính năng nhập liệu nâng cao. Đây là kỹ thuật lập trình API với Hook, Subclass ở mức độ rất cao cấp, nó không phải can thiệp thông thường như các chuyên gia lập trình API trong Windows trên thế giới. Chính vì thế kỹ thuật bắt sự kiện vào mục nhập liệu của Excel - không chèn Active Controls trở thành "bí quyết" công nghệ.
Video tôi chia sẻ dưới đây không có ý quảng cáo mà chỉ ra những khó khăn và bất cập nếu lập trình VBA thông thường để tạo danh sách tìm kiếm nhiều cột như các sản phẩm khác của nhiều người, bên cạnh đó tôi cũng chỉ ra 8 đặc tính khó mà tôi đã xử lý được trong chức năng này, nếu bạn nào muốn làm thì coi như đây là ý tưởng thiết kế tham khảo.
(Tôi có thể chia sẻ kiến thức về kỹ thuật lập trình API cũng như về VBA trong các vấn đề ngoài chức năng của A-Tools. Sorry!).
nếu tính năng này cua A tools là miễn phí vậy thầy có thể rộng lượng chia sẻ được không thầy? đang tò mò tìm hiểu để phát triển vài thứ hỗ trợ cho công việc mà bí thù lù @@
 
Upvote 0
Cám ơn batman1, Anh Tuấn đã chia sẻ những kiến thức và kinh nghiệm làm.. Bạn Mutants Men! Anh Tuấn ở trên đã nói đây là kỹ thuật hook nâng cao và nó nằm trong A Tool nên ko thể chia sẻ đc.
... nên phải tự nghiên cứu thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn batman1, Anh Tuấn đã chia sẻ những kiến thức và kinh nghiệm làm.. Bạn Mutants Men! Anh Tuấn ở trên đã nói đây là kỹ thuật hook nâng cao và nó nằm trong A Tool nên ko thể chia sẻ đc.
... nên phải tự nghiên cứu thôi!
Tôi thấy vụ hook này cũng có một thành viên làm được mà một thời gian rồi không thấy onl. Tớ đây chắc cũng đi xa chủ đề của anh mạnh rồi.
Hic.... Hic....
Chả thấy ảnh đá động gì tới vụ hook này. Chắc không quan tâm
Hic.... Hic....
 
Upvote 0
Tôi thấy vụ hook này cũng có một thành viên làm được mà một thời gian rồi không thấy onl. Tớ đây chắc cũng đi xa chủ đề của anh mạnh rồi.
Hic.... Hic....
Chả thấy ảnh đá động gì tới vụ hook này. Chắc không quan tâm
Hic.... Hic....

File bạn Batman1 chính là kỹ thuật Hook để bắt sự kiện bàn phím trên VBA, xét về chia sẻ mã nguồn với kỹ thuật Hook bàn phím nó tốt nhất trên GPE ! Trước đây có file gần giống file này nhưng nó bẫy chỉ cho nhập phím số. Như mình đã chia sẻ "Can thiệt vào mục nhập của Excel là kỹ thuật Hook, SubClass cao cấp trong lập trình API... Can thiệt vào đối tượng nhập liệu của Excel là vô cùng khó! ". Bạn cứ tìm trên Google từ khoá "Hook" + API + VBA,... thế giới nói nhiều về việc này để nâng cao hiểu biết về nó, không làm việc này thì làm việc khác. Kỹ thuật xử lý sự kiện nhập liệu trong Excel mình làm trong Add-in A-Tools nếu chuyển thành ngôn ngữ VBA để chạy thì sợ rằng không chạy nổi, vì VBA hỗ trợ SubClass rất kém. A-Tools là miễn phí nhiều chức năng nhưng không phải mã nguồn mở, có những bí mật về công nghệ trong sản phẩm này - Cơ sở thương thiệu có tính tính cạnh tranh nên mình không thể chia sẻ (mình chỉ có thể chia sẻ kinh nghiệp, định hướng xây dựng chức/tính năng), các kỹ thuật khác không liên quan chức năng trong A-Tools mình sẽ chia sẻ như: Công thức Excel, VBA, Delphi, API!
(Bạn tìm bài viết của mình trên GPE sẽ thấy nhiêu ví dụ về API, trong đó có file mã nguồn mở Unicode Menu In Userform khá công phu.)

Tôi khuyên các bạn, nếu kiến thức của chúng ta mới chỉ dừng lại ở VBA (kể cả cao cấp VBA thuần tuý) thì đừng sử dụng kỹ thuật Hook, SubClass vì rất dễ làm hỏng ứng dụng, có những lỗi không tìm được lý do. Chỉ dùng khi bạn có hiểu biết nhất định về nó!
 
Upvote 0
dhn46 xin cảm ơn bác batman1, những giải thích của bác rất cặn kẽ dễ hiểu nhưng ứng dụng được là 1 vấn đề tìm tòi lớn của dhn46.

Bác cho dhn46 hỏi thêm 1 câu nữa: trong file ví dụ của bác bắt được Keyboard trên các ứng dụng, nhưng khi dhn46 thử như sau thì không được:

Tài khoản Window: User (Không phải Admin)
Chạy 1 ứng dụng cài đặt bất kỳ => hiện bảng UAC => Gõ keyboard

Khi xem lại file Excel thì trường hợp này không phát hiện.

Vậy có cách nào để bắt được Keyboard cho trường hợp này không ạ? Nếu được bác có thể cho dhn46 tham khảo file được không bác.

dhn46 xin cảm ơn bác.
Thực ra Excel và lập trình chỉ là đam mê chứ không phải công việc nên tôi không tìm hiểu các hệ điều hành khác ngoài XP Home của tôi. Tất nhiên nhiều cái tôi biết nhưng về bảo mật, thiết lập thì không có system thích hợp để kiểm nghiệm. Chả nhẽ không dùng tới trong công việc mà lại bỏ tiền ra mua Windows 7, 8, 10 và những hđh sẽ có? Vì cài Windows lậu mà bị phát hiện thì bị phạt. Nếu công việc cần tới thì cũng liều đấy nhưng công việc không liên quan gì tới lập trình.

Vài lời mở đầu vậy.

1. Tôi đã thử code trên máy bàn với XP Home + Excel 2010. Chỉ có 1 tài khoản Administrator. Kết quả luôn có trong sheet dù gõ phím khi Excel active hay khi notepad active.

Khi nhận được phản hồi của bạn thì tôi đã thử ở 2 máy:

2. notebook của vợ với Windows 7 Starter + Excel 2007
2a. Máy chỉ có 1 tài khoản Administrator. Kết quả như điểm 1.
2b. Tôi lập thêm tài khoản User. Tôi phải cho phép dùng Macro vì mỗi tài khoản có thiết lập riêng. Khi chạy code thì cũng có kết quả như điểm 1.

3. Hàng xóm có laptop với Windows 10 Home 64-bit + Excel 2007. Cũng chỉ có 1 tài khoản Administrator. Chạy code thì cũng cho kết quả như điểm 1.
Tôi tạo thêm 1 tài khoản local (Administrator là tài khoản Microsoft). Cũng cho phép dùng Macro. Khi chạy code thì cũng có kết quả như điểm 1.

Tóm lại thì tôi chạy trên 3 máy từ system cũ XP tới system mới nhất Windows 10 đều thành công. Vì vậy tôi không hiểu bạn bị lỗi gì.

Bạn chạy không thành công với system nào vậy? Không thành công với tài khoản User hay cả với tài khoản Administrator cũng không thành công?

Nếu bạn nhấn phím mà không có kết quả trên sheet thì chỉ có thể là SetWindowsHookEx không thành công. Bạn thử sau dòng
Mã:
HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, Application.Hinstance, 0)
thì thêm code
Mã:
If HookHandle <> 0 Then
    MsgBox "Thanh cong"
Else
    MsgBox "Khong thanh cong"
End If
rồi xem thông điệp thế nào.

Nhiều hàm API khi gọi mà không thành công thì có thể đọc thông tin về lỗi bằng hàm GetLastError. Nhưng trong trường hợp SetWindowsHook thì không biết system có để lại thông tin lỗi không vì tôi không thấy help đả động tới. Nhưng bạn vẫn có quyền thử:
1. Khai báo
Mã:
Private Declare Function GetLastError Lib "kernel32.dll" () As Long
2. Sau dòng
Mã:
HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, Application.Hinstance, 0)
thì thêm code
Mã:
Debug.Print GetLastError
để xem GetLastError trả về giá trị bao nhiêu.

Khi SetWindowsHook thành công thì rõ ràng system sẽ gọi hàm LowLevelKeyboardProc. Nhưng bạn cũng có thể thêm dòng đầu tiên trong hàm là
Mã:
Debug.Print "hic hic"

Tóm lại thì tôi thử thành công trên 3 máy, cả tài khoản Administrator và tài khoản user. Tôi chịu, không biết thất bại của bạn là do đâu.

Bạn nên để ý là tôi đưa code cho bạn vọc chơi thôi. Không phải để bạn áp dụng vào làm chủ đề này. Tôi không chỉ nói về các chướng ngại trùng trùng điệp điệp mà còn nói rõ là cái hook dạng này + chế độ nhập liệu của Excel là trò chơi bật lửa trên thùng thuốc súng. Tùy cái mà làm thôi. Có những cái nguy hiểm và cực khó như Tuân đã nêu. Bởi nguồn gốc là bạn không làm chủ được code của Excel, bạn chỉ diễn nhờ trên sân người khác. Nếu ứng dụng bạn viết từ A đến Z thì bạn mới làm chủ được.

Những cái cực khó mà cần thiết thì phải có ý tưởng để giải quyết. Khi người ta đã có ý tưởng và có code xử lý thì thường không ai chia sẻ miễn phí với người khác cả. Cần câu cơm mà cho không người khác?
 
Upvote 0
Tài khoản Window: User (Không phải Admin)
Chạy 1 ứng dụng cài đặt bất kỳ => hiện bảng UAC => Gõ keyboard

Khi xem lại file Excel thì trường hợp này không phát hiện
Do không đọc kỹ nên tôi chót viết bài trước.

Nếu nói về nhấn phím trong bảng UAC thì ...

Mọi cái sảy ra hay không đều do system quyết định. Ông system là tối cao mà ổng quyết định không gọi các callback thì phải chịu thôi. Tôi không biết hướng giải quyết. Thậm chí tôi không có system với cái UAC kia để thực nghiệm.
 
Upvote 0
Do không đọc kỹ nên tôi chót viết bài trước.

Nếu nói về nhấn phím trong bảng UAC thì ...

Mọi cái sảy ra hay không đều do system quyết định. Ông system là tối cao mà ổng quyết định không gọi các callback thì phải chịu thôi. Tôi không biết hướng giải quyết. Thậm chí tôi không có system với cái UAC kia để thực nghiệm.
Em đã chỉnh UAC ở mức thấp nhất, và máy tính đã có quyền Admin
nhưng khi sửa theo bài #56 thì khi nhấn phím
ở ngoài excel: dữ liệu được điền vào các ô ở trên cell
trong excel: dữ liệu điền ngay ô chọn chứ không điền như trường hợp trên
em có thử thêm Beep sau dòng: Sheet1.Cells(r, c).Value = Text
thì chỉ nghe âm thanh báo khi ở nhấn phím bên ngoài excel, vậy là trong excel thì không thể gọi LowLevelKeyboardProc chạy được
không biết vụ hook này có đả động đến chủ đề này không. nếu đi xa vấn đề quá thì mong mọi người có thể qua topic này, em hỏi mà chả ai quan tâm trả lời cả
hic..... hic....
 
Upvote 0
Đây là kết quả cuối cùng úp lên tặng cho Bạn nào cần thì cứ vậy mà xài ... code xúc tích ngắn gọn ... đơn giản ....

Và dễ hiểu kèm theo tham số của hàm InStr cho những ai mới bắt đầu VBA tìm hiểu

1/ Tại C4 bạn muốn gõ cái giống gì vào đó thì gõ xong Enter

2/ nếu Xóa trắng C4 thì nó lấy hết

3/ Quá trình xử dụng nếu có lỗi gì phát sinh vui lòng báo lại tại đây

4/ Mô tả Hàm InStr cho những Bạn mới làm quen với VBA ... Mạnh Copy từ Internet

Tên hàm:
InStr

Mô tả:
InStr([start, ]string1, string2[, compare])
Tìm chuỗi string2 trong chuỗi string1, tìm từ vị trí start

Tham số:
start
Vị trí tìm
string1
Chuỗi tìm kiếm
string2
Giá trị cần tìm
compare
Chỉ rõ kiểu dữ liệu để so sánh trong quá trình tìm kiếm

Ghi chú:
Dùng cho tham số compare
vbUseCompareOption = –1
Chế độ tùy chọn, VB sẽ tự động lựa lọai dữ liệu thích hợp
vbBinaryCompare = 0
So sánh nhị phân
vbTextCompare = 1
So sánh chuỗi
vbDatabaseCompare = 2
So sánh dữ liệu

Private Sub Form_Load()
Dim SearchString, SearchChar, MyPos
SearchString = "XXpXXpXXPXXP"' String to search in.
SearchChar = "P"' Search for "P".
' So sanh theo cua text tu vi tri 4
MyPos = InStr(4, SearchString, SearchChar, 1)' Returns 6.
' So sanh theo Binary
MyPos = InStr(1, SearchString, SearchChar, 0)' Returns 9.
' So sanh theo Binary, do mac dinh la 0
MyPos = InStr(SearchString, SearchChar)' Returns 9.
MyPos = InStr(1, SearchString, "W")' Returns 0.
End Sub

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
        Dim Nguon()
        Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
        If Target.Address = [C4].Address Then
            If Target.Count = 1 Then
                Call GetListValidation(Nguon(), Sheet2.Range("C4"))
            End If
        End If
    Application.EnableEvents = True
End Sub

Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    For i = 1 To UBound(Arr)
        If InStr(1, UCase(Arr(i, 1)), UCase(Target.Value), 1) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.keys, ",")
            .ShowError = False
        End If
        If Dic.Count > 1 Then
            SendKeys ("%{Down}"), True
        ElseIf Dic.Count = 1 Then
            Target.Value = Dic.keys()
        End If
        Target.Select
    End With
    Set Dic = Nothing
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
ở ngoài excel: dữ liệu được điền vào các ô ở trên cell
trong excel: dữ liệu điền ngay ô chọn chứ không điền như trường hợp trên
Không hẳn như bạn nói, nhưng chuyện điền vào ô chọn là dễ hiểu.

Bạn nhầm lẫn 2 vấn đề: code nhập vào A1:O1, A2:O2, còn nhập vào ô chọn là do Excel nhập. Vd. bạn không dùng hook gì cả nhưng bạn chọn D9 rồi gõ "a" rồi "a" thì có thấy "aa" trong D không? Rõ ràng là có.

Tại sao tôi nói "không hẳn"? Vì bạn chỉ gõ được 1 ký tự khi có ô chọn.

Tôi đính kèm tập tin để mọi người có thể trong một phạm vi nào đó có thể hiểu được hook làm việc như thế nào. Tôi đính kèm tập tin về hook vì tôi hiểu là dhn46 muốn biết về hook.

Nhưng tôi cũng nói rõ là đó chỉ là ví dụ và muốn làm gì thì phải sửa code cho thích hợp
Tôi cũng viết rõ là trò chơi với cell ở chế độ edit là bật lửa trên thùng thuốc súng. Cũng viết rõ không phải để dùng hook giải quyết vấn đề của chủ đề này. Tóm lại: tôi trả lời câu hỏi cụ thể của dhn46. Thế thôi.

Trong tập tin của tôi có CommandButton nên khi click để cài hook thì nó active và không có cell nào được chọn. Vì thế tôi mới nạp phím vào cells (A1:O1, A2:O2, ...). Nếu khi có hook mà cell nào đó được chọn thì chỉ gõ được 1 ký tự, khi gõ ký tự 2 thì Excel chết đột ngột. Vì khi gõ xong 1 ký tự thì mọi người sẽ nhìn thấy trong cell được chọn có ký tự đầu tiên và trỏ văn bản ở sau nó. Khi gõ ký tự đầu thì cell không ở trạng thái như thế (chưa có ký tự trong cell và chưa có trỏ văn bản - caret). Vì thế khi gõ ký tự 2 thì 99,99% chắc chắn thao tác nhập text vào A2 đã xung đột với code của Excel.

Toàn bộ sẽ như thế này: Giả sử D9 đang activate. Bạn gõ "a" thì system gọi callback -> callback nhập "a" vào A1 -> sau khi system gọi hết các callback thì "tuồn" phím cho cửa sổ đang có input trong system, đó là cửa sổ Excel -> Excel nhận được phím "a" nên nó "đưa" vào D9 và hiển thị caret -> bạn gõ ký tự "a" thứ 2 -> system gọi callback -> callback nhập "a" vào A2. Chính lúc này, khi D9 đang ở chế độ Edit, thì 99,99% chắc chắn là thao tác "nhập "a" vào A2" đã xung đột với code của Excel -> Excel chết đột ngột. Rất có thể thread lúc đó đang ở trong một "critical section".

Tôi đã viết rất rõ là code chỉ để vọc cho biết hook hoạt động như thế nào. Mọi dụng ý dùng nó để thử nghiệm trên cell đang nhập liệu, tương tác vào các đối tượng của Excel thì các bạn tự nghiên cứu. Tôi sẽ không trả lời những câu hỏi về những việc đó.

Nếu ai đó muốn thử nghiệm hook cả khi có cell active, ở chế độ Edit thì thay
Mã:
Sheet1.Cells(r, c).Value = Text
bằng
Mã:
Debug.Print Text
hoặc ghi Text vào tập tin trên đĩa.
 
Upvote 0
Không hẳn như bạn nói, nhưng chuyện điền vào ô chọn là dễ hiểu.

Bạn nhầm lẫn 2 vấn đề: code nhập vào A1:O1, A2:O2, còn nhập vào ô chọn là do Excel nhập. Vd. bạn không dùng hook gì cả nhưng bạn chọn D9 rồi gõ "a" rồi "a" thì có thấy "aa" trong D không? Rõ ràng là có.

Tại sao tôi nói "không hẳn"? Vì bạn chỉ gõ được 1 ký tự khi có ô chọn.

Tôi đính kèm tập tin để mọi người có thể trong một phạm vi nào đó có thể hiểu được hook làm việc như thế nào. Tôi đính kèm tập tin về hook vì tôi hiểu là dhn46 muốn biết về hook.

Nhưng tôi cũng nói rõ là đó chỉ là ví dụ và muốn làm gì thì phải sửa code cho thích hợp
Tôi cũng viết rõ là trò chơi với cell ở chế độ edit là bật lửa trên thùng thuốc súng. Cũng viết rõ không phải để dùng hook giải quyết vấn đề của chủ đề này. Tóm lại: tôi trả lời câu hỏi cụ thể của dhn46. Thế thôi.

Trong tập tin của tôi có CommandButton nên khi click để cài hook thì nó active và không có cell nào được chọn. Vì thế tôi mới nạp phím vào cells (A1:O1, A2:O2, ...). Nếu khi có hook mà cell nào đó được chọn thì chỉ gõ được 1 ký tự, khi gõ ký tự 2 thì Excel chết đột ngột. Vì khi gõ xong 1 ký tự thì mọi người sẽ nhìn thấy trong cell được chọn có ký tự đầu tiên và trỏ văn bản ở sau nó. Khi gõ ký tự đầu thì cell không ở trạng thái như thế (chưa có ký tự trong cell và chưa có trỏ văn bản - caret). Vì thế khi gõ ký tự 2 thì 99,99% chắc chắn thao tác nhập text vào A2 đã xung đột với code của Excel.

Toàn bộ sẽ như thế này: Giả sử D9 đang activate. Bạn gõ "a" thì system gọi callback -> callback nhập "a" vào A1 -> sau khi system gọi hết các callback thì "tuồn" phím cho cửa sổ đang có input trong system, đó là cửa sổ Excel -> Excel nhận được phím "a" nên nó "đưa" vào D9 và hiển thị caret -> bạn gõ ký tự "a" thứ 2 -> system gọi callback -> callback nhập "a" vào A2. Chính lúc này, khi D9 đang ở chế độ Edit, thì 99,99% chắc chắn là thao tác "nhập "a" vào A2" đã xung đột với code của Excel -> Excel chết đột ngột. Rất có thể thread lúc đó đang ở trong một "critical section".

Tôi đã viết rất rõ là code chỉ để vọc cho biết hook hoạt động như thế nào. Mọi dụng ý dùng nó để thử nghiệm trên cell đang nhập liệu, tương tác vào các đối tượng của Excel thì các bạn tự nghiên cứu. Tôi sẽ không trả lời những câu hỏi về những việc đó.

Nếu ai đó muốn thử nghiệm hook cả khi có cell active, ở chế độ Edit thì thay
Mã:
Sheet1.Cells(r, c).Value = Text
bằng
Mã:
Debug.Print Text
hoặc ghi Text vào tập tin trên đĩa.
Cám ơn bạn đã nói rất chi tiết về hook keyboard. Một ví dụ rất hay!
 
Upvote 0
Đây là kết quả cuối cùng úp lên tặng cho Bạn nào cần thì cứ vậy mà xài ... code xúc tích ngắn gọn ... đơn giản ....

Và dễ hiểu kèm theo tham số của hàm InStr cho những ai mới bắt đầu VBA tìm hiểu

1/ Tại C4 bạn muốn gõ cái giống gì vào đó thì gõ xong Enter

2/ nếu Xóa trắng C4 thì nó lấy hết

3/ Quá trình xử dụng nếu có lỗi gì phát sinh vui lòng báo lại tại đây

4/ Mô tả Hàm InStr cho những Bạn mới làm quen với VBA ... Mạnh Copy từ Internet

Tên hàm:
InStr

Mô tả:
InStr([start, ]string1, string2[, compare])
Tìm chuỗi string2 trong chuỗi string1, tìm từ vị trí start

Tham số:
start
Vị trí tìm
string1
Chuỗi tìm kiếm
string2
Giá trị cần tìm
compare
Chỉ rõ kiểu dữ liệu để so sánh trong quá trình tìm kiếm

Ghi chú:
Dùng cho tham số compare
vbUseCompareOption = –1
Chế độ tùy chọn, VB sẽ tự động lựa lọai dữ liệu thích hợp
vbBinaryCompare = 0
So sánh nhị phân
vbTextCompare = 1
So sánh chuỗi
vbDatabaseCompare = 2
So sánh dữ liệu

Private Sub Form_Load()
Dim SearchString, SearchChar, MyPos
SearchString = "XXpXXpXXPXXP"' String to search in.
SearchChar = "P"' Search for "P".
' So sanh theo cua text tu vi tri 4
MyPos = InStr(4, SearchString, SearchChar, 1)' Returns 6.
' So sanh theo Binary
MyPos = InStr(1, SearchString, SearchChar, 0)' Returns 9.
' So sanh theo Binary, do mac dinh la 0
MyPos = InStr(SearchString, SearchChar)' Returns 9.
MyPos = InStr(1, SearchString, "W")' Returns 0.
End Sub

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
        Dim Nguon()
        Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
        If Target.Address = [C4].Address Then
            If Target.Count = 1 Then
                Call GetListValidation(Nguon(), Sheet2.Range("C4"))
            End If
        End If
    Application.EnableEvents = True
End Sub

Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    For i = 1 To UBound(Arr)
        If InStr(1, UCase(Arr(i, 1)), UCase(Target.Value), 1) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.keys, ",")
            .ShowError = False
        End If
        If Dic.Count > 1 Then
            SendKeys ("%{Down}"), True
        ElseIf Dic.Count = 1 Then
            Target.Value = Dic.keys()
        End If
        Target.Select
    End With
    Set Dic = Nothing
End Sub
Vừa nghĩ ra 1 cách bắt sự kiện nhấn phím enter
Anh xem nếu ok thì sửa lại code trên he
Nghĩ chắc là dùng được
Thêm vài trường hợp xử lý lại cho đúng với khi nhấn phím enter như bình thường là ok
Em vừa thử thì thấy ok. Enter 1 phát là sổ list ra ngay
Đang onl điện thoại (sửa cáp mạng- mất kết nối không up file được) nên ghi cái ý tưởng ra thôi.
Mã:
Sub Gan()
Application.onkey "{ENTER"}, "KeyEnter" ' enter ban phim so
Application.onkey "{RETURN}", "KeyEnter" ' enter ban phim chu
End sub
Sub KeyEnter()
If len(Activecell.value)=0 then
Activecell.offset(1,0).Activate
Else
Msgbox Activecell.value
End if
End sub
 
Lần chỉnh sửa cuối:
Upvote 0
Vừa nghĩ ra 1 cách bắt sự kiện nhấn phím enter
Anh xem nếu ok thì sửa lại code trên he
Nghĩ chắc là dùng được
Thêm vài trường hợp xử lý lại cho đúng với khi nhấn phím enter như bình thường là ok
Em vừa thử thì thấy ok. Enter 1 phát là sổ list ra ngay
Đang onl điện thoại (sửa cáp mạng- mất kết nối không up file được) nên ghi cái ý tưởng ra thôi.
Mã:
Sub Gan()
Application.onkey "{ENTER"}, "KeyEnter" ' enter ban phim so
Application.onkey "{RETURN}", "KeyEnter" ' enter ban phim chu
End sub
Sub KeyEnter()
If len(Activecell.value)=0 then
Activecell.offset(1,0).Activate
Else
Msgbox Activecell.value
End if
End sub
ok .......... Lúc nào rảnh úp file xem ... dân nghiên cứu code két mà khi có ý tưởng mới mắt sáng long lanh liền à
 
Lần chỉnh sửa cuối:
Upvote 0
Giờ Mạnh muốn mở rộng hướng ta nghiên cứu tiếp vầy các Bạn xem tình hình sao nha
1/ Vẫn sử dụng Validation thật để chơi tiếp ....??!!!

2/ Vùng dữ liệu Nguon ta sẻ mở rộng thêm 5 hay nhiều cột nữa ...vvv

3/ Khi ta gõ vào c4 chữ m và chọn nó thì sẻ lấy nguyên dòng theo dữ liệu trong Validation gán xuống dưới ...và tại c4 gán cái chọn vào đó luôn ...hay trả về 1 mãng dữ liệu xuống dưới vvv...

4/ Mặc dù trên GPE huuthang_bd Or langtuchungtinh ..... đã làm rồi ......

nhưng Sử dụng controls để làm và 1 trường hợp khác nữa cũng làm nhưng ta chỉ dòm thôi Mạnh ko tiện nói ở đây ... Vì mình là dân mê code mà chỉ dòm thôi thì ...............:D

5/ Nếu được ta sẻ làm thêm cái form khi gõ vào c4 nó sẻ lọc và Show ra Form cho dễ nhìn

6/ Ý tưởng là vậy không biết các Bạn sao ....thêm bớt gì ta sẻ từng bước điều chỉnh cuộc chơi tiếp

Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Giờ Mạnh muốn mở rộng hướng ta nghiên cứu tiếp vầy các Bạn xem tình hình sao nha
1/ Vẫn sử dụng Validation thật để chơi tiếp ....??!!!

2/ Vùng dữ liệu Nguon ta sẻ mở rộng thêm 5 hay nhiều cột nữa ...vvv

3/ Khi ta gõ vào c4 chữ m và chọn nó thì sẻ lấy nguyên dòng theo dữ liệu trong Validation gán xuống dưới ...và tại c4 gán cái chọn vào đó luôn ...hay trả về 1 mãng dữ liệu xuống dưới vvv...

4/ Mặc dù trên GPE huuthang_bd Or langtuchungtinh ..... đã làm rồi ......

nhưng Sử dụng controls để làm và 1 trường hợp khác nữa cũng làm nhưng ta chỉ dòm thôi Mạnh ko tiện nói ở đây ... Vì mình là dân mê code mà chỉ dòm thôi thì ...............:D

5/ Nếu được ta sẻ làm thêm cái form khi gõ vào c4 nó sẻ lọc và Show ra Form cho dễ nhìn

6/ Ý tưởng là vậy không biết các Bạn sao ....thêm bớt gì ta sẻ từng bước điều chỉnh cuộc chơi tiếp

Xin cảm ơn
anh cho hỏi, khi đặt con trỏ trên cells, sau đó gọi form ShowModal = false , thì chương trình sẽ Active Form, khi đó sẽ nhấn phím sẽ không thao tác được trên sheet được nữa.
vậy code như thế nào để có thể chọn lại ô đang chọn và edit được (giống thao tác nhấn chọn ô rồi F2) tức là khi gọi form xong thì lập tức sẽ Active Sheet lại để thao tác gõ chữ ngay chứ không mất công nhấn chuột lại vào Sheet thì mới thao tác được
chỉ cần làm được công việc trên thì sẽ giúp ích được cho việc phát triển ở mục 5 mà anh nói.
 

File đính kèm

Upvote 0
anh cho hỏi, khi đặt con trỏ trên cells, sau đó gọi form ShowModal = false , thì chương trình sẽ Active Form, khi đó sẽ nhấn phím sẽ không thao tác được trên sheet được nữa.
vậy code như thế nào để có thể chọn lại ô đang chọn và edit được (giống thao tác nhấn chọn ô rồi F2) tức là khi gọi form xong thì lập tức sẽ Active Sheet lại để thao tác gõ chữ ngay chứ không mất công nhấn chuột lại vào Sheet thì mới thao tác được
chỉ cần làm được công việc trên thì sẽ giúp ích được cho việc phát triển ở mục 5 mà anh nói.
Nói chung ok ... nhưng dài dòng và dòng này có tác dụng gì Application.SendKeys "{F2}"
 
Upvote 0
Ta lại thử bỏ hết mấy cái If trong Sub KeyEnter ..... đi ...xong xóa trắng c4 đi xem sao .............Tịt :D:eek:
vẫn pình xường
Mã:
Sub KeyEnter()
    Application.ScreenUpdating = False
    If ActiveCell.Address(0, 0) <> "C4" Then GoTo Thoat
    Application.EnableEvents = False
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    Call GetListValidation(Nguon(), ActiveCell)
    Application.EnableEvents = True
    Beep
Thoat:
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
vẫn pình xường
Mã:
Sub KeyEnter()
    Application.ScreenUpdating = False
    If ActiveCell.Address(0, 0) <> "C4" Then GoTo Thoat
    Application.EnableEvents = False
    Dim Nguon()
    Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
    Call GetListValidation(Nguon(), ActiveCell)
    Application.EnableEvents = True
    Beep
Thoat:
    Application.ScreenUpdating = True
End Sub
Ko biết bên đó là thử Run chưa vậy ...???
 
Upvote 0
Ko biết bên đó là thử Run chưa vậy ...???
bên đây thử rồi anh, không có dữ liệu nó sổ ra danh sách đầy đủ.
mặc định khi mở file là gán phím enter để chạy code, đóng file thì khôi phục lại chức năng phím enter.
test thì chỉnh vậy thôi, đi vào thực tế thì lúc đó dùng class để gán lệnh cho phím enter.
 
Upvote 0
bên đây thử rồi anh, không có dữ liệu nó sổ ra danh sách đầy đủ.
mặc định khi mở file là gán phím enter để chạy code, đóng file thì khôi phục lại chức năng phím enter.
test thì chỉnh vậy thôi, đi vào thực tế thì lúc đó dùng class để gán lệnh cho phím enter.
sao máy mạnh ko được ... thôi bỏ qua vụ này ....Ta chuyển qua bài 66 ... ý sao .... nếu tạm ok ta cho vào class
ta nghiên cứu từng bước 1 sai tới đâu sửa tới đó .............. Nghiên cứu mà sợ chi sai ???!!!
 
Upvote 0
sao máy mạnh ko được ... thôi bỏ qua vụ này ....Ta chuyển qua bài 66 ... ý sao .... nếu tạm ok ta cho vào class
ta nghiên cứu từng bước 1 sai tới đâu sửa tới đó .............. Nghiên cứu mà sợ chi sai ???!!!
cho vào sự kiện class thì chắc làm được, còn việc tổ chức để có thể cài đặt làm sao cho code hiểu mà làm theo đúng ý mình mới khó anh à.
đang bắt đầu tải VB2017 về tối quậy, tận 21Gb, chả biết máy chạy nổi không.
 
Upvote 0
Delphi.PNG
cho vào sự kiện class thì chắc làm được, còn việc tổ chức để có thể cài đặt làm sao cho code hiểu mà làm theo đúng ý mình mới khó anh à.
đang bắt đầu tải VB2017 về tối quậy, tận 21Gb, chả biết máy chạy nổi không.
vb2017 gì vậy mà tới 21G dữ vậy .... học thôi kiếm bản nào nhẹ xài đã khi kiến thức khá chơi sau ok mà mạnh đang xài delphi2010 có 403 MB sau khi setup chay ngọt lắm ... rất nhẹ hổ trợ Unicode vvv.....
 
Upvote 0
vb2017 gì vậy mà tới 21G dữ vậy .... học thôi kiếm bản nào nhẹ xài đã khi kiến thức khá chơi sau ok mà mạnh đang xài delphi2010 có 403 MB sau khi setup chay ngọt lắm ... rất nhẹ hổ trợ Unicode vvv.....
upload_2017-7-21_18-19-4.png
vậy cho em xin link đi, tìm hoài mà chả có bản nào nhẹ cả.
 
Upvote 0
Em tải Delphi về tới lúc cài đặt nó đòi Serial Number thì không biết điền, mong anh Kieu Manh giúp đỡ!!!
 
Upvote 0
Upvote 0
quá nhọ rồi!, vừa tải xong Visual Studio 20Gb, Dephil 2Gb, máy treo (có đóng băng), khởi động lại, lại google tiếp nữa
dân quây thứ thiệt rồi ............Mạnh thì Ghost thôi ... có ngày Ghost 3 lần đó và Mạnh có 1 Mình chơi 2 máy mà .............. Mấy hôm quậy mấy con Virus tính bắt nhốt nó lại nhưng không được máy bị dính xong tải Norton chạy ... xong Kaskersky chạy hết xong Bung ghost ....***&&%--=0
 
Upvote 0
Đây là kết quả cuối cùng úp lên tặng cho Bạn nào cần thì cứ vậy mà xài ... code xúc tích ngắn gọn ... đơn giản ....

Và dễ hiểu kèm theo tham số của hàm InStr cho những ai mới bắt đầu VBA tìm hiểu

1/ Tại C4 bạn muốn gõ cái giống gì vào đó thì gõ xong Enter

2/ nếu Xóa trắng C4 thì nó lấy hết

3/ Quá trình xử dụng nếu có lỗi gì phát sinh vui lòng báo lại tại đây

4/ Mô tả Hàm InStr cho những Bạn mới làm quen với VBA ... Mạnh Copy từ Internet

Tên hàm:
InStr

Mô tả:
InStr([start, ]string1, string2[, compare])
Tìm chuỗi string2 trong chuỗi string1, tìm từ vị trí start

Tham số:
start
Vị trí tìm
string1
Chuỗi tìm kiếm
string2
Giá trị cần tìm
compare
Chỉ rõ kiểu dữ liệu để so sánh trong quá trình tìm kiếm

Ghi chú:
Dùng cho tham số compare
vbUseCompareOption = –1
Chế độ tùy chọn, VB sẽ tự động lựa lọai dữ liệu thích hợp
vbBinaryCompare = 0
So sánh nhị phân
vbTextCompare = 1
So sánh chuỗi
vbDatabaseCompare = 2
So sánh dữ liệu

Private Sub Form_Load()
Dim SearchString, SearchChar, MyPos
SearchString = "XXpXXpXXPXXP"' String to search in.
SearchChar = "P"' Search for "P".
' So sanh theo cua text tu vi tri 4
MyPos = InStr(4, SearchString, SearchChar, 1)' Returns 6.
' So sanh theo Binary
MyPos = InStr(1, SearchString, SearchChar, 0)' Returns 9.
' So sanh theo Binary, do mac dinh la 0
MyPos = InStr(SearchString, SearchChar)' Returns 9.
MyPos = InStr(1, SearchString, "W")' Returns 0.
End Sub

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
        Dim Nguon()
        Nguon = Sheet1.Range(Sheet1.[B3], Sheet1.[B65536].End(3)).Value
        If Target.Address = [C4].Address Then
            If Target.Count = 1 Then
                Call GetListValidation(Nguon(), Sheet2.Range("C4"))
            End If
        End If
    Application.EnableEvents = True
End Sub
 
Public Sub GetListValidation(ByVal Arr As Variant, ByVal Target As Range)
    Dim Dic As Object, i As Long
    Set Dic = CreateObject("scripting.dictionary")
    For i = 1 To UBound(Arr)
        If InStr(1, UCase(Arr(i, 1)), UCase(Target.Value), 1) Then
            If Not IsEmpty(Arr(i, 1)) Then
                Dic.Item(Arr(i, 1)) = Dic.Count
            End If
        End If
    Next
    With Target.Validation
        .Delete
        If Dic.Count Then
            .Add 3, , , Join(Dic.keys, ",")
            .ShowError = False
        End If
        If Dic.Count > 1 Then
            SendKeys ("%{Down}"), True
        ElseIf Dic.Count = 1 Then
            Target.Value = Dic.keys()
        End If
        Target.Select
    End With
    Set Dic = Nothing
End Sub


miềng chạy thử lại thử hình như code bị lỗi 1 chỗ @@
 
Upvote 0
vậy chắc là lỗi thứ 2 !
đối với trường hợp danh sách có 1 từ như chữ (l) thì nó ra chữ (Lê) luôn
nhưng với trường hợp danh sách có nhiều mục thì nó ko xổ ra !
hay máy mình bị lỗi @@
 
Upvote 0
vậy chắc là lỗi thứ 2 !
đối với trường hợp danh sách có 1 từ như chữ (l) thì nó ra chữ (Lê) luôn
nhưng với trường hợp danh sách có nhiều mục thì nó ko xổ ra !
hay máy mình bị lỗi @@
vậy thì ko đúng khởi động lại máy xem
 
Upvote 0
ô C4 bác gõ thử chữ (c) thử , hoặc chữ (m)!
thôi ngủ phát ^^
 
Lần chỉnh sửa cuối:
Upvote 0
thử ở máy chỗ làm cũng bị ^^

upload_2017-7-22_8-13-27.png

upload_2017-7-22_8-12-48.png

nhập chữ m , ko enter mà click chuột thì ok @@

upload_2017-7-22_8-14-57.png
 
Upvote 0

File đính kèm

  • m.png
    m.png
    125.3 KB · Đọc: 4
Upvote 0
máy Mạnh ko bị vậy .............No biết tại sao ???!!!
anh dùng code như thế nào?
bạn ấy dùng code như thế nào?
nếu dùng onkey như em nói ở mấy bài trước thì ra y như của em, còn vẫn xử lý sự kiện select_change trên sheet thì nó vẫn như của bạn ấy thôi, cách này không thể nào làm con trỏ vẫn ở trong ô nhập liệu đang nhập rồi hiện list ra đâu, nó phải nhảy ô rồi mới hiện
 
Upvote 0
Upvote 0

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

Back
Top Bottom