Sử dụng chức năng Validation thay thế combo trong forms

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,121
Được thích
24,279
Trước kia, để lấy một giá trị trong một CSDL, ta thường dùng hàm Index. Và để chuyên nghiệp hơn thì dùng nút combo trong forms. Tất nhiên là phải khai báo các thông tin về vùng dữ liệu- Input range (CSDL), ô liên kết - cell link, số dòng thả xuống- drop down lines. Bài toán trở nên phức tạp vì nhiều liên kết.
Nhưng bây giờ bạn có thể dùng chức năng Validation bằng cách như sau:
- Chọn ô nhận dữ liệu. VD: F11
- Vào Data/ Validation. Cửa sổ Data Validation hiện ra.
- Trong setting ta chọn list, và khai báo vùng dữ liệu (CSDL) trong Source.
- Cuối cùng bạn đã được ô liên kết với CSDL. Khi di chuyển chuột đến thì ô đó hiện ra nút cuộn xuống ở bên phải.

untitled-1.jpg


- Ngoài ra bạn có thể bổ sung 1 số thông tin trong Input massage, hay bẫy lỗi Error Alert
- Ngoài ra còn một số chức năng khác trong Data Validation\ Settings\ Allow
 
Lần chỉnh sửa cuối:
Tôi xin bổ sung file minh họa kèm theo.

Còn nội dung toàn bộ thì thì anh Luky Luck đã trình bày rồi.
 
File minh họa kèm theo
 

File đính kèm

  • viduValidation.zip
    2.6 KB · Đọc: 4,689
Ứng dụng Validation kết hợp - Chọn nhiều danh sách trên 1 ô

Ta có thể đưa vào Validation - List nhiều danh sách phụ thuộc vào 1 giá trị nảo đó. Ví dụ bạn muốn quản lý công nợ nhiều loại, 131, 141, 138, 331, 338 v...v trên cùng 1 sheet. Nếu mở tài khoản cấp 2 thì bạn rất dễ lẫn lộn, mở thêm 1 cột phụ cho mã đối tượng là cách hay nhất, nhưng để chung một danh sách thì rất khó nhớ. Validation - List sẽ giúp bạn chọn đối tượng tương ứng với tài khoản.
Có nhiều cách để làm được điều này (nhiều công thức cũng như cách tổ chức). File kèm theo là 1 cách. Các công thức đều nằm trong 3 name động:
dmObjectCode: Mã các TK trong DM, các loại khác để Other
dmObColumn: Xác định cột đối tượng với 1000 dòng
dmObject: Cắt bớt cột đối tượng, bỏ những dòng trắng.
 

File đính kèm

  • Expand Validation - Multi List.rar
    12.6 KB · Đọc: 3,141
Validation - Không nhập trùng 2 giá trị trên 1 cột/vùng

Nếu bạn muốn dữ liệu nhập không có giá trị trùng, thí dụ mã hàng trong DMHH chẳng hạn, bạn vào Validation, mục Criteria bạn chọn Custom nhập vào biểu thức:
(Giả sữ cột A)
=COUNTIF(A:A, A1) <=1

Để tránh nhập ngày theo kiểu text, bạn nhập vào biểu thức

=NOT(ISTEXT(A1))
 
Khi nào thì dùng Validation hay Combo Box?

Dear all,
-------
Theo em, ở mức độ đơn giản, những người dùng Excel thường chọn Validation hơn là dùng Combo box. Tuy nhiên ở một số trường hợp phức tạp, chúng ta nên lựa chọn Combo box sẽ hiệu quả hơn. Em xin nêu một số lý do của em khi em muốn chọn Combo box mà không phải là Validation:
1. Không muốn tạo sự kiện Worksheet_Change:
Sự kiện này xảy ra khi có bất cứ một ô nào bị "Edit". Validation là một thuộc tính của cell do đó mỗi lần giá trị thay đổi, biến cố Change xảy ra. Điều này rất phiền toái khi chúng ta có xử lý sự kiện Change của Worksheet.
Chúng ta có thể thay thế sự kiện này bằng sự kiện Change của Combo box mà không cần bận tâm đến sự kiện thay đổi của Worksheet
2. Nguồn dữ liệu:
Đây là điểm khác nhau cơ bản giữa hai đối tượng này. Nếu quan sát kỹ chúng ta thấy rằng Validation thường sử dụng nguồn là một Range hoặc Name. Có những hạn chế nhất định nếu chúng ta sử dụng Validation với nguồn dữ liệu riêng lẻ, bao gồm tập hợp {n} phần tử độ lập hoặc không nằm trên Worksheet. Chúng ta chỉ có thể tạo ra một danh sách 255 phần tử độc lập cho Validation, nhưng với Combo box chúng ta có thể gán được với số phần từ nhiều hơn thế!
3. Nhu cầu về tạo nhiều cột khi sổ danh sách liệt kê:
Tất nhiên Validation vẫn có thể làm được nhưng vẫn "phải động vào một ít VBA" nhưng theo em thì Combo box vẫn làm điều này tốt hơn. Ta chỉ việc thiết lập lại thuộc tính ColunmCount là xong.

www.giaiphapexcel.com còn có nghĩa là giúp chúng ta lựa chọn giải pháp nào tối ưu nhất!
 
Lần chỉnh sửa cuối:
Cho em hỏi chút về COMBO BOX,

Trong một sheet em lập 3 cái COMBO BOX, nguồn dữ liệu lấy từ một sheet khác. ColumnCount là 2, CellLinked đến một ô trong sheet hiện hạnh. Nhưng không hiểu sao chỉ 2 cái đầu là chạy bình thường, còn cái thứ 3 thì không chạy. Cụ thế như sau:

1. Khi bấm vào hình tam giác chỉ xuống thì chỉ hiện dữ liệu ở Column 1 mà không có dữ liệu Column 2.

2. Chọn thử một dữ liệu bất kỳ thì không thấy hiện dữ liệu đó trong COMBO BOX, cũng không thấy nó hiện lên ở CellLinked.

Em đã kiểm tra kỹ thì thấy có 2 điểm khác so với những COMBO BOX kia (2 Cái thực hiện được bình thường), đó là 2 chỉ tiêu TEXT và VALUE trên thể Alphabetic không thấy hiện giá trị.

Em thử điền giá trị vào đó nhưng nó không nhận.

Vậy vấn đề của nó là gì vậy? Và cách nào để khắc phục? Các bác chỉ dùm nhé, em đang rất cần.

Thanks,
 
Giả sử tôi cần tạo một Combo Box, có danh sách là 2 cột lấy trong Sheet2 vùng A1:B10. Ô liên kết (nhận và truyền giá trị từ Combo Box) là A1 của Sheet hiện tại.

1- Tạo Combo Box từ "Control Toolbox"
2- Nhấp chuột phải trên đối tượng chọn "Property"
3- Gián giá trị cho Property của đối tượng
ListFillRange = Sheet2!A1:B10
LinkCell = A1

Vì danh sách gồm 2 cột, bạn quan tâm tới những Property sau:

BoundColumn là 1 'Giá trị nhận ở cột 1
ColumnCount là 2
ColumnWidths là 50;250 'Cột 1 trộng 50, cột 2 rộng 250 . Không có dấu =
ListWidth là 300 'Vì 50 + 250 = 300

Bạn làm thật cẩn thận xem có được không?

Đào Việt Cường đã viết:
1. Không muốn tạo sự kiện Worksheet_Change:
Sự kiện này xảy ra khi có bất cứ một ô nào bị "Edit". Validation là một thuộc tính của cell do đó mỗi lần giá trị thay đổi, biến cố Change xảy ra. Điều này rất phiền toái khi chúng ta có xử lý sự kiện Change của Worksheet.
...

Lập trình trên Excel thì các sự kiện của nó như: "Worksheet_Change";"Worksheet_SelectionChange"...rất quan trọng. Ta không nên né tránh nó. Chính vì thế anh mới một bài nói về vấn đề này hình như là "Tăng tốc độ trên Excel...".
Để đảm bảo hệ thống Excel chạy bình thường thì cấu trúc code nên viết như sau:

Sub Test()
On Error GoTo EndSub: 'Cần phải có để đảm bảo EnableEvents nhận lại giá trị ban đầu.

Dim bEnableEvents As Boolean
'Lưu giá trị cũ và gán giá trị mới cho EnableEvents của Excel
bEnableEvents = Application.EnableEvents
Application.EnableEvents = False 'Khóa tất cả các sự kiện của Excel

'--Ví du Code của người dùng----
'---Range("A1").Value="xzy"
'......

EndSub:

'Hoàn trả giá trị cũ cho EnableEvents của Excel
Application.EnableEvents = bEnableEvents

End Sub
 
Lần chỉnh sửa cuối:
Đây là file VD như anh Tuân đã trình bày. (Chỉ một phần thôi)

Validation+Combobox


Em thấy đây là một giải pháp rất hay.
Cảm ơn anh nhiều!
 
PhanTuHuong đã viết:
Trước kia, để lấy một giá trị trong một CSDL, ta thường dùng hàm Index. Và để chuyên nghiệp hơn thì dùng nút combo trong forms. Tất nhiên là phải khai báo các thông tin về vùng dữ liệu- Input range (CSDL), ô liên kết - cell link, số dòng thả xuống- drop down lines. Bài toán trở nên phức tạp vì nhiều liên kết.
Nhưng bây giờ bạn có thể dùng chức năng Validation bằng cách như sau:
- Chọn ô nhận dữ liệu. VD: F11
- Vào Data/ Validation. Cửa sổ Data Validation hiện ra.
- Trong setting ta chọn list, và khai báo vùng dữ liệu (CSDL) trong Source.
- Cuối cùng bạn đã được ô liên kết với CSDL. Khi di chuyển chuột đến thì ô đó hiện ra nút cuộn xuống ở bên phải.

untitled-1.jpg


- Ngoài ra bạn có thể bổ sung 1 số thông tin trong Input massage, hay bẫy lỗi Error Alert
- Ngoài ra còn một số chức năng khác trong Data Validation\ Settings\ Allow
Bạn cho mình hỏi tạo cái Drop Down 1(Combo) như thế nào.Minh tạo từ Control box nhưng không giống.
 
pxthanhcda đã viết:
Bạn cho mình hỏi tạo cái Drop Down 1(Combo) như thế nào.Minh tạo từ Control box nhưng không giống.

ControlBox thuộc thanh công cụ VisualBasic
Còn cái trên là ComboBox thuộc thanh công cụ Form bạn ạ
(Click chuột phải lên thanh công cụ, chọn Form)

Thân!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bạn Mr Okebabđã chỉ giúp.Thế mà bấy lâu nây minh kô bít:''"
 
chào bạn! không biết làm sao bây giờ máy tôi cứ nhấn enter con trỏ lại chạy chéo

PhanTuHuong đã viết:
Tôi xin bổ sung file minh họa kèm theo.

Còn nội dung toàn bộ thì thì anh Luky Luck đã trình bày rồi.
đsfsfsd
bạn giúp tôi với nhé, tôi đang rất cần
 
PhanTuHuong đã viết:
Tôi xin bổ sung file minh họa kèm theo.

Còn nội dung toàn bộ thì thì anh Luky Luck đã trình bày rồi.
bạn có thể chỉ cho mình làm giống file bạn posst lên mạng đó.Làm thế nào để cho combo box chạy theo hết cột xuống dưới với lại làm cách nào nó ko hiện combo box đứng một chỗ mà có thể di chuyển theo ý mình chọn mỗi khi con trỏ ở đâu thì nó ở đó.Giống file bạn phamtuhuong mình gởi kèm theo luôn nè.
 
Lần chỉnh sửa cuối:
kimlan đã viết:
bạn có thể chỉ cho mình làm giống file bạn posst lên mạng đó.Làm thế nào để cho combo box chạy theo hết cột xuống dưới với lại làm cách nào nó ko hiện combo box đứng một chỗ mà có thể di chuyển theo ý mình chọn mỗi khi con trỏ ở đâu thì nó ở đó.Giống file bạn phamtuhuong mình gởi kèm theo luôn nè.
Nếu bạn là người mới học thì tôi nghĩ bạn khó lòng nuốt trôi nỗi mấy code này chứ đừng nói là làm dc giống nó.. Dù có giãi thích chưa chắc bạn đã hiểu.. Giờ bạn chỉ có 2 lựa chọn:
-Một là mang về xài luôn ko cần suy nghĩ
-Hai là xài tạm cái Validation có sẳn trong Excel... mai này học hỏi thêm rồi hẳn tính
ANH TUẤN
 
Các Bác cho em hỏi, vì sao khi sử dụng combo box từ Control Toolbox thì nó chỉ chấp nhận dạng text , còn value thì không chấp nhận, các Bác có thể khắc phụ vấn đề này được không?
 
Bạn có thể khắc phục nó bằng cách: Hảy nhân cell link với 1 (hoặc dùng hàm VALUE ) trước khi mang nó ra tính toán...
ANH TUẤN
 
Hỏi về độ rộng Column

Trường hợp anh TuanVNUNI làm Validation có thêm cột phụ để diễn giải, nhưng không chỉnh được độ rộng của cột, chỉ chỉnh được độ rộng của toàn List (dùng ListWidth)
Xin có anh nào biết chỉ cho nhé (File của anh Tuân là : Validation_Ext.xls)
(Load file tại đây http://www.giaiphapexcel.com/forum/showthread.php?t=1369)
 
Lần chỉnh sửa cuối:
Trường hợp anh TuanVNUNI làm Validation có thêm cột phụ để diễn giải, nhưng không chỉnh được độ rộng của cột, chỉ chỉnh được độ rộng của toàn List (dùng ListWidth)
Xin có anh nào biết chỉ cho nhé (File của anh Tuân là : Validation_Ext.xls)
(Load file tại đây http://www.giaiphapexcel.com/forum/showthread.php?t=1369)
Để chỉnh độ rộng của cột, bạn chỉnh trong Properties / ColumnWidths (VD : 20 pt;45 pt; 100pt --> ứng với độ rộng của từng cột 1;2;3)

TDN
 
Web KT
Back
Top Bottom