Tìm Kiếm Trong Data Validation Excel

Liên hệ QC

Kiều Mạnh

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

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

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

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

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

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

File đính kèm

  • Data Validation.xlsb
    17.3 KB · Đọc: 62
Lần chỉnh sửa cuối:
chắc bác chạy trên win 10 , excel 2016 nên ko thấy lỗi ,
mình chạy trên win xp và excel 2010 thì bị như vậy !
 
Upvote 0
Upvote 0
nói chung nếu phân tích lỗi này trên win xp cũng ra đc 1 số vấn đề khá hay , có thể áp dụng để giải quyết các vấn đề tiếp theo ^^
 
Upvote 0
những cái mình thu lụm đc đại khái là ,
Excel có nhiều xử lý khi ta tác động vào bằng chuột , bàn phím , các thiết bị ngoại vi khác và các thay đổi khi xử lý dữ liệu .
xét về trường hợp khi nhập liệu trên lưới của phần mềm Excel thì các bước nó xử lý thế nào ,
thử nghiệm thực tế thì mình thấy thế này !

Excel ưu tiên các xử lý của nó trước , rồi sau đó mới đến phiên làm việc của các hàm macro hỗ trợ
các xử lý của Excel khi input bằng keyboard gồm ,
- cho phép gõ chữ vào 1 cell đến khi enter -> nếu gặp enter thì lưu giá trị hiện tại vào bộ nhớ , nếu gặp Esc thì ko lưu ->
nếu Enter thì cập nhật giá trị vào vùng Selection và nhảy đến vùng tiếp theo bên dưới , và Excel kiểm tra các ô có công thức xem có ô nào liên quan đến ô vừa thay đổi giá trị không , nếu có liên quan thì thực hiện tính toán ,
ví dụ ô A2 có công thức là A1*2 , thì nếu thay đổi giá trị ô A1 , Excel sẽ tìm thấy ô A2 có liên quan và thực hiện tính toán
+ việc nhảy đến ô tiếp theo và thực hiện tính toán sau khi enter cái nào làm trước thì chỉ Excel mới biết thôi , và mình cũng ko can thiệp vào đc ^^

- bên trên là 3 công việc Excel sẽ làm khi input , và tất nhiên Excel nó giành làm trước , làm xong sẽ nhường quyền lại cho 3 hàm sau

1) Private Sub Worksheet_Calculate()
2) Private Sub Worksheet_Change(ByVal Target As Range)
3) Private Sub Worksheet_SelectionChange(ByVal Target As Range)

-nếu input mà Enter thì thứ tự ưu tiên là 1,2,3
-nếu trong trường hợp bạn input , không enter mà nhấp chuột sang ô khác thì thứ tự sẽ là 2,1,3
-nếu trong trường hợp bạn gán , ví dụ Range("C4")="c" thì chỉ gọi 1,2 thôi @@
mà dù ưu tiên thế nào thì cũng là việc đã rồi , vì 3 thay đổi bên trên Excel đã giành làm trước , ở đây mình xét trường hợp enter thôi , và kế thừa lại các kết quả tính toán 3 bước trên của excel !

vì excel nó giành làm trước 3 việc bên trên rồi nên khi chúng ta bắt 3 sự kiện này thì sẽ thu đc gì ,
1) là các cells liên quan đến ô vừa nhập trên lưới đã đc refresh dữ liệu
2) là range vừa thay đổi
3) là vùng selection mới !

bí quyết là mình sẽ so sánh vùng Selection và vùng range để biết đc là ô C4 thay đổi giá trị trong trường hợp nào ,
nếu địa chỉ vùng Selection khác vùng Target của Worksheet_Change , nghĩa là giá trị ô thay đổi trong trường hợp Enter , nếu = nhau nghĩa là thay đổi giá trị trong trường hợp gán .

lỗi đầu tiên ở những bài đầu bạn gặp phải là ko xét so sánh 2 vùng range này , nên cứ gán là nó lại gọi Worksheet_Change , và làm lỗi chương trình
còn lỗi ở file vừa nêu là send key trước khi gọi Target.Select , vì khi gọi sendkey thì vùng selection vẫn nằm ở ô C5

còn để gọi 1 form hay thay đổi gì đó khi Worksheet_Change thì xét địa chỉ 2 vùng Selection và target của Worksheet_Change thôi ,
tổng quát là

Private Sub Worksheet_Change(ByVal Target As Range)
if Target.Address="C4" then ' xét 1 ô cụ thể
if Selection.Address=Target.Address then ' nếu địa chỉ thay đổi trong trường hợp gán
' thì gọi form hay làm gì đó , vì lúc này dữ liệu trong C4 là dữ liệu chọn từ Data validation rồi !
else ' nếu địa chỉ thay đổi trong trường hợp input là Enter
'quay trở lại ô đang xét
' xử lý data Validation
end if
end if
end sub

đại khái thế ^^
còn can thiệp vào quá trình xử lý của excel thì khó đấy ,
bạn phải rành về lập trình Winform kiểu c++ ấy , can thiệp bộ nhớ của chương trình đang chạy các kiểu thì may ra ,
 
Lần chỉnh sửa cuối:
Upvote 0
những cái mình thu lụm đc đại khái là ,
Excel có nhiều xử lý khi ta tác động vào bằng chuột , bàn phím , các thiết bị ngoại vi khác và các thay đổi khi xử lý dữ liệu .
xét về trường hợp khi nhập liệu trên lưới của phần mềm excel Excel thì các bước nó xử lý thế nào ,
thử nghiệm thực tế thì mình thấy thế này !

Excel ưu tiên các xử lý của nó trước , rồi sau đó mới đến phiên làm việc của các hàm macro hỗ trợ
các xử lý của Excel khi input bằng keyboard gồm ,
- cho phép gõ chữ vào 1 cell đến khi enter -> nếu gặp enter thì lưu giá trị hiện tại vào bộ nhớ , nếu gặp Esc thì ko lưu ->
nếu Enter thì cập nhật giá trị vào vùng Selection và nhảy đến vùng tiếp theo bên dưới , và Excel kiểm tra các ô có công thức xem có ô nào liên quan đến ô vừa thay đổi giá trị không , nếu có liên quan thì thực hiện tính toán ,
ví dụ ô A2 có công thức là A1*2 , thì nếu thay đổi giá trị ô A1 , Excel sẽ tìm thấy ô A2 có liên quan và thực hiện tính toán
+ việc nhảy đến ô tiếp theo và thực hiện tính toán sau khi enter cái nào làm trước thì chỉ Excel mới biết thôi , và mình cũng ko can thiệp vào đc ^^

- bên trên là 3 công việc Excel sẽ làm khi input , và tất nhiên Excel nó giành làm trước , làm xong sẽ nhường quyền lại cho 3 hàm sau

1) Private Sub Worksheet_Calculate()
2) Private Sub Worksheet_Change(ByVal Target As Range)
3) Private Sub Worksheet_SelectionChange(ByVal Target As Range)

thứ tự ưu tiên từ 1-3
-nếu input mà Enter thì thứ tự là 1,2,3
-nếu trong trường hợp bạn input , không enter mà nhấp chuột sang ô khác thì thứ tự sẽ là 2,1,3
-nếu trong trường hợp bạn gán , ví dụ Range("C4")="c" thì chỉ gọi 1,2 thôi @@
ở đây mình xét trường hợp enter thôi !

vì excel nó giành làm trước 3 việc bên trên rồi nên khi chúng ta bắt 3 sự kiện này thì sẽ thu đc gì ,
1) là các cells liên quan đến ô vừa nhập trên lưới đã đc refresh dữ liệu
2) là range vừa thay đổi
3) là vùng selection mới !

bí quyết là mình sẽ so sánh vùng Selection và vùng range để biết đc là ô C4 thay đổi giá trị trong trường hợp nào ,
nếu địa chỉ vùng Selection khác vùng Target của Worksheet_Change , nghĩa là giá trị ô thay đổi trong trường hợp Enter , nếu = nhau nghĩa là thay đổi giá trị trong trường hợp gán .

lỗi đầu tiên ở những bài đầu bạn gặp phải là ko xét so sánh 2 vùng range này , nên cứ gán là nó lại gọi Worksheet_Change , và làm lỗi chương trình
còn lỗi ở file vừa nêu là send key trước khi gọi Target.Select , vì khi gọi sendkey thì vùng selection vẫn nằm ở ô C5

còn để gọi 1 form hay thay đổi gì đó khi Worksheet_Change thì xét địa chỉ 2 vùng Selection và target của Worksheet_Change thôi ,
tổng quát là

Private Sub Worksheet_Change(ByVal Target As Range)
if Target.Address="C4" then ' xét 1 ô cụ thể
if Selection.Address=Target.Address then ' nếu địa chỉ thay đổi trong trường hợp gán
' thì gọi form hay làm gì đó , vì lúc này dữ liệu trong C4 là dữ liệu chọn từ Data validation rồi !
else ' nếu địa chỉ thay đổi trong trường hợp input và enter
'quay trở lại ô đang xét
' xử lý data Validation
end if
end if
end sub

đại khái thế ^^
còn can thiệp vào quá trình xử lý của excel thì khó đấy ,
bạn phải rành về lập trình Winform kiểu c++ ấy , can thiệp bộ nhớ của chương trình đang chạy các kiểu thì may ra , tốt nhất là làm đúng chuyên ngành cho lành ^^
câu này là sao không hiểu .....???!!!
tốt nhất là làm đúng chuyên ngành cho lành ^^
 
Upvote 0
những cái mình thu lụm đc đại khái là ,
Excel có nhiều xử lý khi ta tác động vào bằng chuột , bàn phím , các thiết bị ngoại vi khác và các thay đổi khi xử lý dữ liệu .
xét về trường hợp khi nhập liệu trên lưới của phần mềm Excel thì các bước nó xử lý thế nào ,
thử nghiệm thực tế thì mình thấy thế này !

Excel ưu tiên các xử lý của nó trước , rồi sau đó mới đến phiên làm việc của các hàm macro hỗ trợ
các xử lý của Excel khi input bằng keyboard gồm ,
- cho phép gõ chữ vào 1 cell đến khi enter -> nếu gặp enter thì lưu giá trị hiện tại vào bộ nhớ , nếu gặp Esc thì ko lưu ->
nếu Enter thì cập nhật giá trị vào vùng Selection và nhảy đến vùng tiếp theo bên dưới , và Excel kiểm tra các ô có công thức xem có ô nào liên quan đến ô vừa thay đổi giá trị không , nếu có liên quan thì thực hiện tính toán ,
ví dụ ô A2 có công thức là A1*2 , thì nếu thay đổi giá trị ô A1 , Excel sẽ tìm thấy ô A2 có liên quan và thực hiện tính toán
+ việc nhảy đến ô tiếp theo và thực hiện tính toán sau khi enter cái nào làm trước thì chỉ Excel mới biết thôi , và mình cũng ko can thiệp vào đc ^^

- bên trên là 3 công việc Excel sẽ làm khi input , và tất nhiên Excel nó giành làm trước , làm xong sẽ nhường quyền lại cho 3 hàm sau

1) Private Sub Worksheet_Calculate()
2) Private Sub Worksheet_Change(ByVal Target As Range)
3) Private Sub Worksheet_SelectionChange(ByVal Target As Range)

-nếu input mà Enter thì thứ tự ưu tiên là 1,2,3
-nếu trong trường hợp bạn input , không enter mà nhấp chuột sang ô khác thì thứ tự sẽ là 2,1,3
-nếu trong trường hợp bạn gán , ví dụ Range("C4")="c" thì chỉ gọi 1,2 thôi @@
mà dù ưu tiên thế nào thì cũng là việc đã rồi , vì 3 thay đổi bên trên Excel đã giành làm trước , ở đây mình xét trường hợp enter thôi , và kế thừa lại các kết quả tính toán 3 bước trên của excel !

vì excel nó giành làm trước 3 việc bên trên rồi nên khi chúng ta bắt 3 sự kiện này thì sẽ thu đc gì ,
1) là các cells liên quan đến ô vừa nhập trên lưới đã đc refresh dữ liệu
2) là range vừa thay đổi
3) là vùng selection mới !

bí quyết là mình sẽ so sánh vùng Selection và vùng range để biết đc là ô C4 thay đổi giá trị trong trường hợp nào ,
nếu địa chỉ vùng Selection khác vùng Target của Worksheet_Change , nghĩa là giá trị ô thay đổi trong trường hợp Enter , nếu = nhau nghĩa là thay đổi giá trị trong trường hợp gán .

lỗi đầu tiên ở những bài đầu bạn gặp phải là ko xét so sánh 2 vùng range này , nên cứ gán là nó lại gọi Worksheet_Change , và làm lỗi chương trình
còn lỗi ở file vừa nêu là send key trước khi gọi Target.Select , vì khi gọi sendkey thì vùng selection vẫn nằm ở ô C5

còn để gọi 1 form hay thay đổi gì đó khi Worksheet_Change thì xét địa chỉ 2 vùng Selection và target của Worksheet_Change thôi ,
tổng quát là

Private Sub Worksheet_Change(ByVal Target As Range)
if Target.Address="C4" then ' xét 1 ô cụ thể
if Selection.Address=Target.Address then ' nếu địa chỉ thay đổi trong trường hợp gán
' thì gọi form hay làm gì đó , vì lúc này dữ liệu trong C4 là dữ liệu chọn từ Data validation rồi !
else ' nếu địa chỉ thay đổi trong trường hợp input là Enter
'quay trở lại ô đang xét
' xử lý data Validation
end if
end if
end sub

đại khái thế ^^
còn can thiệp vào quá trình xử lý của excel thì khó đấy ,
bạn phải rành về lập trình Winform kiểu c++ ấy , can thiệp bộ nhớ của chương trình đang chạy các kiểu thì may ra , tốt nhất là làm đúng chuyên ngành cho lành ^^
vấn đề là dân quậy đang tò mò về việc này đây bác
can thiệp vào quá trình xử lý của excel
 
Upvote 0
miềng xin thu lại câu đó nha ^^
mỗi chuyên ngành cần mỗi thứ khác nhau, mà cái đang quậy thì cần thiết cho những người cần làm việc với excel nhiều và tự động. trên hết là quậy xong rồi có kết quả ngon lành còn chia sẽ với đàn em cho tụi nó vọc tiếp. như thế mới phát triển thêm được. chứ không úm để đó cho đàn em nó DÒM ngưỡng mộ mà nó chả biết gì cả. :v
 
Upvote 0
quả thực mình ko biết đâu ,
nó cũng ko phải lĩnh vực mình theo đuổi !
nếu bạn thích tìm hiểu thì phải tự theo đuổi thôi vì nó là cả 1 khối lượng công việc đồ sộ , bác Tuân có chỉ cho bạn thì nó cũng chỉ là 1 thủ thuật thôi , mà thủ thuật thì ko làm nền tảng vững chắc đc !
bạn có thể tìm đọc bộ sách lập trình Windows của bác Dương Quang Thiện , chắc trong các thư viện có đó , sẽ thấy nó nhiều thế nào ,
gồm 8 tập , mỗi tập khoảng vài trăm trang ,tất tần tật về Winform, luyện xong chắc cũng có cái nhìn tổng quát hơn , hồi mình đi học thì thày chỉ dạy tập 1 thôi à ^^
 
Upvote 0
quả thực mình ko biết đâu ,
nó cũng ko phải lĩnh vực mình theo đuổi !
nếu bạn thích tìm hiểu thì phải tự theo đuổi thôi vì nó là cả 1 khối lượng công việc đồ sộ , bác Tuân có chỉ cho bạn thì nó cũng chỉ là 1 thủ thuật thôi , mà thủ thuật thì ko làm nền tảng vững chắc đc !
bạn có thể tìm đọc bộ sách lập trình Windows của bác Dương Quang Thiện , chắc trong các thư viện có đó , sẽ thấy nó nhiều thế nào ,
gồm 8 tập , mỗi tập khoảng vài trăm trang ,tất tần tật về Winform, luyện xong chắc cũng có cái nhìn tổng quát hơn , hồi mình đi học thì thày chỉ dạy tập 1 thôi à ^^
8 tập nhân mấy trăm trang coi xong là lên núi ở luôn ... khi xuống núi là khả năng khá
 
Upvote 0
Web KT
Back
Top Bottom