Hỏi về việc kiểm tra giá trị nhập trong table

  • Thread starter Thread starter hoavn
  • Ngày gửi Ngày gửi
Liên hệ QC

hoavn

Thành viên mới
Tham gia
26/11/07
Bài viết
8
Được thích
0
Hi All,

Cho mình hỏi về cách kiểm tra một giá trị nhập vào.
Ví dụ, mình có một bảng tính, trong bảng tính mình có 3 worksheet:
DSNV: trong worksheet này mình tạo 1 table gồm có 3(STT, MANV, TENNV) dữ liệu đã được nhập đầy đủ. và 1 worksheet nhập liệu: có giá trị nhập vào lấy từ DSNV, cũng tương tụ có các field tương ứng, mình đã tạo một List ngay phần nhập liệu để người nhập vào chỉ có thể chọn từ danh sách có sẳn, nhưng mình muốn khi người dùng vừa chọn tên nhân viên thì cột MaNV phải hiện ra cùng lúc vơi tên. Xin cho mình hỏi có cách nào để làm được như vậy hay không?

Xin cách anh chị chỉ giúp.

Cảm ơn.
 
Yêu cầu của bạn phải làm bằng ComboBox chứ ko thể dùng Data Validation dc đâu...
Gợi ý bạn 1 cách đơn giản, bạn có thể cải tiến thêm!
ANH TUẤN
 

File đính kèm

Upvote 0
Chào bạn,

Tất nhiên là làm được. Bạn thử 2 cách sau:

Cách 1. Gài sẵn công thức ở cột MaNV dùng vlookup chẳng hạn
Cách 2. Viết 1 thủ tục để làm điều này.

Tuy nhiên theo mình thì nên cho chọn ở sheet nhập liệu MaNV trước và tự động điền tên nhân viên vào thì hợp lý hơn.

FB.
 
Upvote 0
anhtuan1066 đã viết:
Yêu cầu của bạn phải làm bằng ComboBox chứ ko thể dùng Data Validation dc đâu...
Gợi ý bạn 1 cách đơn giản, bạn có thể cải tiến thêm!
ANH TUẤN

File bạn gửi rất đúng ý mình nhưng mình không rành về viết code lắm, bạn có thể hướng dẩn cụ thể hơn cho mình được không.

Thanks
 
Upvote 0
Code này đơn giản nhất, chủ yếu là dành cho bạn học hỏi đấy... Cách làm ComboBox thì chắc bạn đã biết rồi, tôi khỏi cần nói nha.. Chỉ xin mạn phép các cao thủ giãi thích về code...
1> Giã sử như bạn đã có ComboBox rồi, click phải nó, chọn View code
2> Trong cửa sổ lập trình bạn sẽ thấy đoạn code ghi sẳn
Mã:
Private Sub ComboBox1_Change()
End Sub
3> Giờ chỉ chèn vào thêm 2 dòng nữa:
Dòng 1: ActiveCell.Value = ComboBox1 (ý nghĩa là cell hiện hành đang là cell nào thì khi bấm ComboBox nó sẽ gán dữ liệu vào cell đó
Dòng 2: ActiveCell.Offset(1,0).Select (Ý nghĩa là sau khi gán xong dử liệu thì dịch cell hiện hành xuống 1 dòng, lệnh Offset là dùng đễ dịch chuyễn...OFFSET(dòng,cột)
Cuối cùng bạn dc 1 code đầy đủ:
Mã:
Private Sub ComboBox1_Change()
ActiveCell.Value =  ComboBox1
ActiveCell.Offset(1,0).Select
End Sub
Tất nhiên đây chưa phải là code hoàn hảo... ví dụ có thể cải tiến thêm là: Chì khi cell hiện hành đang nằm ở cột A thì code mới có tác dụng...
Từ từ bạn nghiên cứu thêm.. riêng về phần này thì tôi cũng đang tập tành, ko rành lắm đâu!
Mến
ANH TUẤN
 
Upvote 0
FunnyBoy đã viết:
Chào bạn,

Tất nhiên là làm được. Bạn thử 2 cách sau:

Cách 1. Gài sẵn công thức ở cột MaNV dùng vlookup chẳng hạn
Cách 2. Viết 1 thủ tục để làm điều này.

Tuy nhiên theo mình thì nên cho chọn ở sheet nhập liệu MaNV trước và tự động điền tên nhân viên vào thì hợp lý hơn.

FB.

Mình vẫn chưa hiểu cách làm của bạn, mong bạn chỉ rõ hơn cho mình được không, cho mình công thức luôn được không bạn.

Thanks
 
Upvote 0
anhtuan1066 đã viết:
Code này đơn giản nhất, chủ yếu là dành cho bạn học hỏi đấy... Cách làm ComboBox thì chắc bạn đã biết rồi, tôi khỏi cần nói nha.. Chỉ xin mạn phép các cao thủ giãi thích về code...
1> Giã sử như bạn đã có ComboBox rồi, click phải nó, chọn View code
2> Trong cửa sổ lập trình bạn sẽ thấy đoạn code ghi sẳn
Mã:
Private Sub ComboBox1_Change()
End Sub
3> Giờ chỉ chèn vào thêm 2 dòng nữa:
Dòng 1: ActiveCell.Value = ComboBox1 (ý nghĩa là cell hiện hành đang là cell nào thì khi bấm ComboBox nó sẽ gán dữ liệu vào cell đó
Dòng 2: ActiveCell.Offset(1,0).Select (Ý nghĩa là sau khi gán xong dử liệu thì dịch cell hiện hành xuống 1 dòng, lệnh Offset là dùng đễ dịch chuyễn...OFFSET(dòng,cột)
Cuối cùng bạn dc 1 code đầy đủ:
Mã:
Private Sub ComboBox1_Change()
ActiveCell.Value =  ComboBox1
ActiveCell.Offset(1,0).Select
End Sub
Tất nhiên đây chưa phải là code hoàn hảo... ví dụ có thể cải tiến thêm là: Chì khi cell hiện hành đang nằm ở cột A thì code mới có tác dụng...
Từ từ bạn nghiên cứu thêm.. riêng về phần này thì tôi cũng đang tập tành, ko rành lắm đâu!
Mến
ANH TUẤN

Bạn ơi mình đã tạo y chang rồi, nhưng khi thể hiện thì nó chỉ thể hiện mỗi cột MANV, nó không hiện cột tên nhân viên, trong property mình có phải chỉnh sữa thế nào không? Xin bạn nói rõ thêm thêm dùm mình nhe.

Thanks
 
Upvote 0
Bạn vào property, kiểm tra
- Column Count
- Column Widths
- Width
Thủ xem
 
Upvote 0
Uh... cứ thế... từ từ từng ít 1 bạn sẽ làm dc... Bạn cứ xem Properties của tôi, chỉ có 3 phần lưu ý thôi:
-ColumnCount
-BoundColumn
-ListFillrange
Xem tôi ghi thế nào thì áp dụng vào file bạn như thế
Riêng 2 mục đầu bạn có thể thay đổi 1 thành 2 hoặc 2 thành 1 sẽ biết nó có ý nghĩa gì
Khi nào bạn làm xong thì chúng ta sẽ tiếp tục về các phương án cải tiến nhé...
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể dùng code để lấy dữ liệu cho cột tên nhân viên:
Private Sub ComboBox1_Change()
ActiveCell.Value = ComboBox1.Column(0)
ActiveCell.Offset(0, 1) = ComboBox1.Column(1)
ActiveCell.Offset(1, 0).Select
End Sub
 
Upvote 0
Có thể cải tiến thêm 1 cái nữa...
-Cột A, dòng của AtiveCell luôn lấy dử liệu của cột 1 trong dử liệu gốc
-Cột B, dòng của ActiveCell luôn lấy dử liệu của cột 2 trong dử liệu gốc
Ý tôi muốn nói là dù ActiveCell đang nằm ở đâu thì nó vẩn trích dử liệu về đúng cột A và B với dòng là dòng của ActiveCell
Nếu như thế thì tôi mạn phép Voda sửa lại tí:
Mã:
Private Sub ComboBox1_Change()
Range("A" & ActiveCell.Row) = ComboBox1.Column(0)
Range("B" & ActiveCell.Row) = ComboBox1.Column(1)
Range("A" & ActiveCell.Row).Offset(1, 0).Select
End Sub
Bạn xem có ổn ko?
Mến
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
Có thể cải tiến thêm 1 cái nữa...
-Cột A, dòng của AtiveCell luôn lấy dử liệu của cột 1 trong dử liệu gốc
-Cột B, dòng của ActiveCell luôn lấy dử liệu của cột 2 trong dử liệu gốc
Ý tôi muốn nói là dù ActiveCell đang nằm ở đâu thì nó vẩn trích dử liệu về đúng cột A và B với dòng là dòng của ActiveCell
Nếu như thế thì tôi mạn phép Voda sửa lại tí:
Mã:
Private Sub ComboBox1_Change()
Range("A" & ActiveCell.Row) = ComboBox1.Column(0)
Range("B" & ActiveCell.Row) = ComboBox1.Column(1)
Range("A" & ActiveCell.Row).Offset(1, 0).Select
End Sub
Bạn xem có ổn ko?
Mến
ANH TUẤN

Cảm ơn bạn mình đã làm được, theo mình hiểu thì các cột có ý nghĩa như sau, mình ghi ra coi như vậy có đúng k nhe.
BoundColumn: Mình vẫn chưa hiểu giá trị nhằm mục đích gì (mình đã thử đổi từ 1 thành 2 và ngược lại k thấy có gì khác)
CountColumn: dùng để hiên thị giá trị của List, có thể 1 or 2 or 3 cột tùy theo danh sách.
Do hồi đầu mình k để ý chổ column width nên nó k hiện được 2 cột như mình mong muốn. Vì khi mình vừa tạo thì giá trị mặc định nó để là 2pt, nhưng khi xóa đi thì mới hiển thị .

-Nhưng còn 1 vấn đề khi mình chọn giá trị trong combobox làm sao để người dùng k thể chọn trùng. Bạn có cách nào kiểm tra được không?
- Và độ rộng cho mỗi cột mình có qui định được hay không?(để khi hiển thị cho nó đẹp đó mà %#^#$ )

Xin bạn chỉ giáo thêm.
Thanks
 
Upvote 0
Về BoundComlumn thì có ý nghĩa đấy.. chẳng qua bị code qua mặt mất thôi..
Nếu chạy 1 mình ComboBox mà ko có code thì BoundColumn này sẽ có ý nghĩa là: Lấy giá trị của cột nào?
Ví dụ: BoundColumn=1 thì khi chọn ComboBox nó sẽ lấy giá trị cột 1, tức cột MA.. nếu BoundColumn=2 thì lấy giá trị của cột 2, tức cột TÊN
Vấn đề ko chọn trùng là sao? Tôi chưa hiểu lắm? Có phải bạn muốn rằng nếu dử liệu đã có rồi thì ko dc chọn nữa?
Về độ rộng cột, tôi nghĩ bạn chỉnh ở phần ColumnWidth là dc... cở 35 hoặc 40 pt là vừa rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể cải tiến để cố định ô nhận dữ liệu, không lệ thuộc vào ActiveCell:
Private Sub ComboBox1_Change()
Range("A" & Cells(Rows.Count, 1).End(xlUp).Row + 1) = ComboBox1.Column(0)
Range("B" & Cells(Rows.Count, 1).End(xlUp).Row) = ComboBox1.Column(1)
End Sub
 
Upvote 0
Cảm ơn Voda, nhưng tôi nghĩ ko thể xài code này dc vì có khi mình nhập xong vẫn muốn sửa lại cơ mà.. Đâu chắc nhập là chính xác 100%
 
Upvote 0
Uhm, đúng là khi đã có nhập rồi thì không nên cho nhập nữa. Với lại cho mình nói thêm tí nhe, nếu mấy anh chị giúp mình thì có thể cho mình biết ý nghĩa các hàm mà các anh chị đã giúp, để mình mình có thể hiểu rõ và làm theo được. Chẳng hạn như hàm Range như trên thì nhằm mục đích gì.

Thanks
 
Upvote 0
Range(cái gì đó) là xác định vị trí của 1 cell hoặc 1 mãng... VD:
Range("A5") là nói đến cell A5, chỉ vậy thôi...
Tất nhiên 1 mình cái range này thì ko làm trò trống gì, phải thêm phần đuôi vào thì phải tròn ý nghĩa... Ví dụ:
Range("A5").Select nghĩa là chọn cell A5
Tôi chỉ biết đại khái thế thôi.. Còn cụ thể chắc phải nhờ đến cao thủ Voda! hi... hi...
Bạn cũng có 1 cách học mà ko cần nhớ đến code, đó là bạn Record macro, xong thì mở cửa sổ lập trình ra xem nó viết những gì...
Mến
ANH TUẤN
 
Upvote 0
hoavn đã viết:
- Và độ rộng cho mỗi cột mình có qui định được hay không?(để khi hiển thị cho nó đẹp đó mà
Độ rộng cột được định nghĩa trong column width đơn vị là point. Không biết point với pixel liên quan thế nào nhưng 40pt tương đương 6 ký tự font 9. Nếu combobox có 2 cột, phải định nghĩa độ rộng 2 cột cách nhau bởi 1 dấu phân cách trong hàm (, hoặc ;). Thí dụ gõ 40,180
Như vậy định luôn property listwidth là 40 + 180 =220.
hoavn đã viết:
-Nhưng còn 1 vấn đề khi mình chọn giá trị trong combobox làm sao để người dùng k thể chọn trùng. Bạn có cách nào kiểm tra được không?
Phải dùng 1 bẫy bằng code để khi chọn 1 tên trong DS mà đã có ở dòng trên thì sẽ hiện ra thông báo. Cái này phải nhờ cao thủ VBA làm dùm thôi.
 
Upvote 0
ptm0412 đã viết:
Phải dùng 1 bẫy bằng code để khi chọn 1 tên trong DS mà đã có ở dòng trên thì sẽ hiện ra thông báo. Cái này phải nhờ cao thủ VBA làm dùm thôi.

Có 2 cách :
  1. Tạo ra 1 list mà ở đó không bao gồm các phần tử ở trên. Add list này vào Combobox
  2. Khi chọn xong Combobox, sử dụng hàm countif để xem nó có trùng không. Nếu trùng thì thông báo, nếu không trùng thì sẽ nhận giá trị đó (Không nên dùng ở sự kiện Change)
Thân!
 
Upvote 0
Vụ TRÙNG này nếu làm bằng VBA chắc là dễ hơn, nhưng làm bằng công thức (hoàn toàn ko có tí gì về VBA) ko phải là ko thể... Tuy nhiên phức tạp hơn nhiều...
Tôi cũng nghĩ như Bắp, nên đưa ra thông báo cho người dùng tùy ý quyết định chứ ko nên cấm tiệt (tức là cũng THÔNG BÁO nhưng phải có YES NO)
 
Upvote 0
Web KT

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

Back
Top Bottom