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
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 !
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.
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 !
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 !
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
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
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.
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.
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
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à
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 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"
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. @@
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. @@
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à
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 ô .
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á
Xin cảm ơn
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 ô .
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.
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.
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á
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 !
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.
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 ...
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.
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.
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ỉ ô.
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.
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ỉ ô.
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
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
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
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
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
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ư ý ^^
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ư ý ^^
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 !
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.
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ỉ
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!).
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ù @@
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!
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....
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ó!
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.
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
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
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.
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....
Đâ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
Đâ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
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
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ì ...............
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
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ì ...............
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
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.
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.
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.
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 ???!!!
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.
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.....
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.....
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 ....
Đâ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ậ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 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 @@
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
Máy Mạnh ko bị vậy ...........Thấy ok Nhưng nó sẻ nhầm lẫn 1 cái đó là Nguon có: con, co, còn khi gõ C thì nó sẻ báo vậy vì Sự kiện nó so sánh tại c4 và trong mãng đó.... mà chưa khắc phục được vì c có co, con