[Chia sẻ] File code VBA cho combobox nhập liệu, tùy biến để dễ dàng kết hợp vào file của bạn.

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,741
Được thích
5,669
Donate (Momo)
Donate
Giới tính
Nam
Về việc dùng combobox để tìm và nhập dữ liệu trực tiếp trên trang tính thì GPE có nhiều, nhưng nếu muốn sửa lại để dùng cho trường hợp cụ thể của bạn thì khá khó khăn nếu không rành về VBA.

Trong file này, tôi cố gắng viết code để đơn giản hóa việc chỉnh sửa kia, làm sao không những dễ cho người dùng mà ngay cả chính tôi sau 1 thời gian dài cũng không phải mất công bóp trán sửa để dùng cho một cách nào đó.

1. Đầu tiên bạn phải có danh mục làm nguồn cho combobox. Danh mục bao nhiêu cột là do yêu cầu quản lý mỗi người nhưng tối thiểu phải có 2 cột Mã số và Tên (hoặc diễn giải) - Hình 1 là danh mục hàng hóa gồm 5 cột như sau (Lưu ý để khai báo khi dùng: tôi bố trí dữ liệu đầu tiên là ô B2):
1650291605178.png
2. Cấu trúc vùng dữ liệu khi nhập, phổ biến một trong hai cách sau Mã - Tên hoặc Tên - Mã - Hình 2 (Lưu ý khi khai báo: Sheet chứa danh mục có tên là DM)
1650291752960.png
3. Khi cần nhập theo kiểu Mã - Tên, ở bước khai báo hãy nhập cột thứ nhất nhỏ hơn (<) cột thứ hai (Ví dụ tại hình 2, bạn cần nhập cột thứ nhất là 1 (tức là cột A) và cột thứ hai là 2 (là cột B) - Hình 3 là giao diện khi nhập kiểu này.
1650292063125.png
4. Nhập theo kiểu Tên - Mã, ở bước khai báo hãy nhập cột thứ nhất lớn hơn (>) cột thứ hai. Ví dụ: Cột thứ nhất nhập số 2 (tức cột B), cột thứ hai nhập số 1 (tức cột A). Hình 4 là giao diện kiểu nhập liệu này:
1650292252233.png
5. Khai báo trực tiếp trong code 2 thông tin như mục 1 và 2 đã nói - Hình 5 - Trong file, Sub KhaiBao chạy bằng phím tắt Ctrl+Shift+K. Nếu bạn dùng thực thì cài lại phím tắt hoặc chạy trực tiếp từ cửa sổ VBE. Việc khai báo này làm khi mở file, hoặc khi đổi sheet nhập liệu, hoặc cuối cùng là khi lỡ dừng code đột ngột.
1699275592431.png
6. Bạn chạy thử để biết việc tùy biến số cột Danh mục dùng cho combobox và ghi lên trang Data hoạt động ra sao. Nếu có lỗi là lỗi ở đây do tôi chưa kiểm tra kỹ. Nếu có lỗi xảy ra, hãy bình luận ở đây để tôi chỉnh sửa.
Lưu ý khi chèn combobox vào trang tính của bạn: hãy vào Developer, bấm Design Mode rồi copy combobox của file này sang để khỏi mất công thiết lập lại các thuộc tính mà tôi đã lập.

Cập nhật 22/04/2022: Thêm thiết lập dành cho ai chỉ cần nhập mã số nhưng tìm danh sách theo tên hàng:
=> Khai báo: Cột 2 lớn hơn Cột 1 một đơn vị và số cột cho combobox là 1 (VD: Cột 2 = 3, Cột 1 = 2 và số cột = 1)
Cập nhật 06/11/2023: Thêm khai báo dòng đầu tiên của dữ liệu (trong file mẫu là dòng 2: FrwData = 2). Sau khi thử nghiệm thành công, bạn vào Sub KhaiBao để đặt cố định các cột thay cho việc phải nhập qua Inputbox
 

File đính kèm

  • 1650292464573.png
    1650292464573.png
    10 KB · Đọc: 1,386
  • 3.Combobox_Search_All_061123.xlsm
    378.3 KB · Đọc: 105
Lần chỉnh sửa cuối:
Bài #13 bạn đã hỏi và tôi trả lời tại #14. Tôi vẫn hiểu câu hỏi của bạn mà. Bạn chưa thử gán như vậy sao?

P/S:
1. Tôi chỉ dẫn sai ở bài #16. Bạn chỉ cần làm mục 2 thôi.
2. Trả lời cho #17: Bạn chép đoạn code sau vào module ThisWorkbook
Rich (BB code):
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Sheet2.KhaiBao
End Sub
Mình đã làm được. Quá tuyệt vời. Một lần nữa, cám ơn bạn rất nhiều :1a:
 
Upvote 0
Trong trường hợp với 3 thông số cho MsBox là 2 - 1 - 1, bạn có thể giúp mình đoạn code để mỗi khi nhập liệu ở cột A thì dòng tương ứng ở cột F sẽ tự động điền vào hàm NOW(), mục đích là để lấy thời gian nhập liệu không?
 
Upvote 0
Trong trường hợp với 3 thông số cho MsBox là 2 - 1 - 1, bạn có thể giúp mình đoạn code để mỗi khi nhập liệu ở cột A thì dòng tương ứng ở cột F sẽ tự động điền vào hàm NOW(), mục đích là để lấy thời gian nhập liệu không?
Trong Private Sub ComboBox1_Change(),
thêm ActiveCell.Offset(0, 5) = Now()
ngay sau dòng:
Rich (BB code):
        If Col1 > Col2 And Cols = 1 And Col2 <> 0 Then
            ActiveCell.Value = ComboBox1.Column(1)
 
Upvote 0
Chào bạn, với 3 thông số nhập vào inputbox lần lượt là 2 - 1 - 1. Mình muốn tạm ngưng combobox để dán dữ liệu của file khác (rất nhiều) vào cột A trong file của bạn thì làm cách nào nhỉ? Cám ơn bạn.
 
Upvote 0
Chào bạn, với 3 thông số nhập vào inputbox lần lượt là 2 - 1 - 1. Mình muốn tạm ngưng combobox để dán dữ liệu của file khác (rất nhiều) vào cột A trong file của bạn thì làm cách nào nhỉ? Cám ơn bạn.
Làm kiểu thủ công trớt: ở menu Developer bấm công cụ Design Mode. Xong việc bấm lại nó lần nữa.
 
Upvote 0
Về việc dùng combobox để tìm và nhập dữ liệu trực tiếp trên trang tính thì GPE có nhiều, nhưng nếu muốn sửa lại để dùng cho trường hợp cụ thể của bạn thì khá khó khăn nếu không rành về VBA.

Trong file này, tôi cố gắng viết code để đơn giản hóa việc chỉnh sửa kia, làm sao không những dễ cho người dùng mà ngay cả chính tôi sau 1 thời gian dài cũng không phải mất công bóp trán sửa để dùng cho một cách nào đó.

1. Đầu tiên bạn phải có danh mục làm nguồn cho combobox. Danh mục bao nhiêu cột là do yêu cầu quản lý mỗi người nhưng tối thiểu phải có 2 cột Mã số và Tên (hoặc diễn giải) - Hình 1 là danh mục hàng hóa gồm 5 cột như sau (Lưu ý để khai báo khi dùng: tôi bố trí dữ liệu đầu tiên là ô B2):
View attachment 274636
2. Cấu trúc vùng dữ liệu khi nhập, phổ biến một trong hai cách sau Mã - Tên hoặc Tên - Mã - Hình 2 (Lưu ý khi khai báo: Sheet chứa danh mục có tên là DM)
View attachment 274637
3. Khi cần nhập theo kiểu Mã - Tên, ở bước khai báo hãy nhập cột thứ nhất nhỏ hơn (<) cột thứ hai (Ví dụ tại hình 2, bạn cần nhập cột thứ nhất là 1 (tức là cột A) và cột thứ hai là 2 (là cột B) - Hình 3 là giao diện khi nhập kiểu này.
View attachment 274638
4. Nhập theo kiểu Tên - Mã, ở bước khai báo hãy nhập cột thứ nhất lớn hơn (>) cột thứ hai. Ví dụ: Cột thứ nhất nhập số 2 (tức cột B), cột thứ hai nhập số 1 (tức cột A). Hình 4 là giao diện kiểu nhập liệu này:
View attachment 274639
5. Khai báo trực tiếp trong code 2 thông tin như mục 1 và 2 đã nói - Hình 5 - Trong file, Sub KhaiBao chạy bằng phím tắt Ctrl+Shift+K. Nếu bạn dùng thực thì cài lại phím tắt hoặc chạy trực tiếp từ cửa sổ VBE. Việc khai báo này làm khi mở file, hoặc khi đổi sheet nhập liệu, hoặc cuối cùng là khi lỡ dừng code đột ngột.
View attachment 274640
6. Bạn chạy thử để biết việc tùy biến số cột Danh mục dùng cho combobox và ghi lên trang Data hoạt động ra sao. Nếu có lỗi là lỗi ở đây do tôi chưa kiểm tra kỹ. Nếu có lỗi xảy ra, hãy bình luận ở đây để tôi chỉnh sửa.
Lưu ý khi chèn combobox vào trang tính của bạn: hãy vào Developer, bấm Design Mode rồi copy combobox của file này sang để khỏi mất công thiết lập lại các thuộc tính mà tôi đã lập.

Cập nhật 22/04/2022: Thêm thiết lập dành cho ai chỉ cần nhập mã số nhưng tìm danh sách theo tên hàng:
=> Khai báo: Cột 2 lớn hơn Cột 1 một đơn vị và số cột cho combobox là 1 (VD: Cột 2 = 3, Cột 1 = 2 và số cột = 1)
Bạn Maika8008 thân! trong file chỉ copy mỗi combobox thôi hả bạn, vì mình thấy code có InputBox (cái InputBox này không cần vẽ hay coppy hả bạn)? Và khi copy combobox để ở dòng A2 như trong file thôi hả bạn?

 
Upvote 0
Bạn Maika8008 thân! trong file chỉ copy mỗi combobox thôi hả bạn, vì mình thấy code có InputBox (cái InputBox này không cần vẽ hay coppy hả bạn)? Và khi copy combobox để ở dòng A2 như trong file thôi hả bạn?

Inputbox là hộp nhập xuất hiện khi ta dùng lệnh InputBox() chứ không phải là công cụ vẽ sẵn. Combobox để đâu cũng được. Nó sẽ di chuyển đến ô hiện hành khi ta bấm vào.
 
Upvote 0
Inputbox là hộp nhập xuất hiện khi ta dùng lệnh InputBox() chứ không phải là công cụ vẽ sẵn. Combobox để đâu cũng được. Nó sẽ di chuyển đến ô hiện hành khi ta bấm vào.
À, vậy mà trước giờ mình cứ tưởng là combobox vẽ nhiều cái, kéo độ rộng cho vừa khít ô và để đúng ô cần mong muốn để đánh vài chữ sẽ hiện ra cái bảng lọc. Cám ơn Maika8008 nhiều.
 
Upvote 0
Về việc dùng combobox để tìm và nhập dữ liệu trực tiếp trên trang tính thì GPE có nhiều, nhưng nếu muốn sửa lại để dùng cho trường hợp cụ thể của bạn thì khá khó khăn nếu không rành về VBA.

Trong file này, tôi cố gắng viết code để đơn giản hóa việc chỉnh sửa kia, làm sao không những dễ cho người dùng mà ngay cả chính tôi sau 1 thời gian dài cũng không phải mất công bóp trán sửa để dùng cho một cách nào đó.

1. Đầu tiên bạn phải có danh mục làm nguồn cho combobox. Danh mục bao nhiêu cột là do yêu cầu quản lý mỗi người nhưng tối thiểu phải có 2 cột Mã số và Tên (hoặc diễn giải) - Hình 1 là danh mục hàng hóa gồm 5 cột như sau (Lưu ý để khai báo khi dùng: tôi bố trí dữ liệu đầu tiên là ô B2):
View attachment 274636
2. Cấu trúc vùng dữ liệu khi nhập, phổ biến một trong hai cách sau Mã - Tên hoặc Tên - Mã - Hình 2 (Lưu ý khi khai báo: Sheet chứa danh mục có tên là DM)
View attachment 274637
3. Khi cần nhập theo kiểu Mã - Tên, ở bước khai báo hãy nhập cột thứ nhất nhỏ hơn (<) cột thứ hai (Ví dụ tại hình 2, bạn cần nhập cột thứ nhất là 1 (tức là cột A) và cột thứ hai là 2 (là cột B) - Hình 3 là giao diện khi nhập kiểu này.
View attachment 274638
4. Nhập theo kiểu Tên - Mã, ở bước khai báo hãy nhập cột thứ nhất lớn hơn (>) cột thứ hai. Ví dụ: Cột thứ nhất nhập số 2 (tức cột B), cột thứ hai nhập số 1 (tức cột A). Hình 4 là giao diện kiểu nhập liệu này:
View attachment 274639
5. Khai báo trực tiếp trong code 2 thông tin như mục 1 và 2 đã nói - Hình 5 - Trong file, Sub KhaiBao chạy bằng phím tắt Ctrl+Shift+K. Nếu bạn dùng thực thì cài lại phím tắt hoặc chạy trực tiếp từ cửa sổ VBE. Việc khai báo này làm khi mở file, hoặc khi đổi sheet nhập liệu, hoặc cuối cùng là khi lỡ dừng code đột ngột.
View attachment 274640
6. Bạn chạy thử để biết việc tùy biến số cột Danh mục dùng cho combobox và ghi lên trang Data hoạt động ra sao. Nếu có lỗi là lỗi ở đây do tôi chưa kiểm tra kỹ. Nếu có lỗi xảy ra, hãy bình luận ở đây để tôi chỉnh sửa.
Lưu ý khi chèn combobox vào trang tính của bạn: hãy vào Developer, bấm Design Mode rồi copy combobox của file này sang để khỏi mất công thiết lập lại các thuộc tính mà tôi đã lập.

Cập nhật 22/04/2022: Thêm thiết lập dành cho ai chỉ cần nhập mã số nhưng tìm danh sách theo tên hàng:
=> Khai báo: Cột 2 lớn hơn Cột 1 một đơn vị và số cột cho combobox là 1 (VD: Cột 2 = 3, Cột 1 = 2 và số cột = 1)
Bạn maika8008 cho mình hỏi, nếu sheet danh mục gồm: ngày tháng, mã hàng, tên hàng, đơn vị tính, số lượng, đơn giá (cột ngày tháng và cột số lượng để trống) và dữ liệu ở cột B2. Bên sheet data gồm: ngày tháng, mã hàng, tên hàng, đơn vị tính, số lượng, đơn giá, thành tiền (trong sheet data dữ liệu nhập ở cột mã hàng (cột b8) hay cột tên hàng (cột c8). Mình muốn hỏi dữ liệu như vậy thì sheet data chỉnh sửa như thế nào và sheet danh mục có nhảy dữ liệu qua không khi có cột trống cách khoảng?. Thân!.
 
Upvote 0
Bạn maika8008 cho mình hỏi, nếu sheet danh mục gồm: ngày tháng, mã hàng, tên hàng, đơn vị tính, số lượng, đơn giá (cột ngày tháng và cột số lượng để trống) và dữ liệu ở cột B2. Bên sheet data gồm: ngày tháng, mã hàng, tên hàng, đơn vị tính, số lượng, đơn giá, thành tiền (trong sheet data dữ liệu nhập ở cột mã hàng (cột b8) hay cột tên hàng (cột c8). Mình muốn hỏi dữ liệu như vậy thì sheet data chỉnh sửa như thế nào và sheet danh mục có nhảy dữ liệu qua không khi có cột trống cách khoảng?. Thân!.
Danh mục sao phải có cột ngày tháng bạn? Như bạn mô tả thì tôi thấy có trống cách quãng gì đâu, mà nếu như cột đơn giá ở Danh mục rỗng thì bên Data sẽ nhận kết quả là rỗng.
Tốt nhất muốn gì thì bạn đưa file dữ liệu của bạn rồi đặt câu hỏi.
 
Lần chỉnh sửa cuối:
Upvote 0
Về việc dùng combobox để tìm và nhập dữ liệu trực tiếp trên trang tính thì GPE có nhiều, nhưng nếu muốn sửa lại để dùng cho trường hợp cụ thể của bạn thì khá khó khăn nếu không rành về VBA.

Trong file này, tôi cố gắng viết code để đơn giản hóa việc chỉnh sửa kia, làm sao không những dễ cho người dùng mà ngay cả chính tôi sau 1 thời gian dài cũng không phải mất công bóp trán sửa để dùng cho một cách nào đó.

1. Đầu tiên bạn phải có danh mục làm nguồn cho combobox. Danh mục bao nhiêu cột là do yêu cầu quản lý mỗi người nhưng tối thiểu phải có 2 cột Mã số và Tên (hoặc diễn giải) - Hình 1 là danh mục hàng hóa gồm 5 cột như sau (Lưu ý để khai báo khi dùng: tôi bố trí dữ liệu đầu tiên là ô B2):
View attachment 274636
2. Cấu trúc vùng dữ liệu khi nhập, phổ biến một trong hai cách sau Mã - Tên hoặc Tên - Mã - Hình 2 (Lưu ý khi khai báo: Sheet chứa danh mục có tên là DM)
View attachment 274637
3. Khi cần nhập theo kiểu Mã - Tên, ở bước khai báo hãy nhập cột thứ nhất nhỏ hơn (<) cột thứ hai (Ví dụ tại hình 2, bạn cần nhập cột thứ nhất là 1 (tức là cột A) và cột thứ hai là 2 (là cột B) - Hình 3 là giao diện khi nhập kiểu này.
View attachment 274638
4. Nhập theo kiểu Tên - Mã, ở bước khai báo hãy nhập cột thứ nhất lớn hơn (>) cột thứ hai. Ví dụ: Cột thứ nhất nhập số 2 (tức cột B), cột thứ hai nhập số 1 (tức cột A). Hình 4 là giao diện kiểu nhập liệu này:
View attachment 274639
5. Khai báo trực tiếp trong code 2 thông tin như mục 1 và 2 đã nói - Hình 5 - Trong file, Sub KhaiBao chạy bằng phím tắt Ctrl+Shift+K. Nếu bạn dùng thực thì cài lại phím tắt hoặc chạy trực tiếp từ cửa sổ VBE. Việc khai báo này làm khi mở file, hoặc khi đổi sheet nhập liệu, hoặc cuối cùng là khi lỡ dừng code đột ngột.
View attachment 274640
6. Bạn chạy thử để biết việc tùy biến số cột Danh mục dùng cho combobox và ghi lên trang Data hoạt động ra sao. Nếu có lỗi là lỗi ở đây do tôi chưa kiểm tra kỹ. Nếu có lỗi xảy ra, hãy bình luận ở đây để tôi chỉnh sửa.
Lưu ý khi chèn combobox vào trang tính của bạn: hãy vào Developer, bấm Design Mode rồi copy combobox của file này sang để khỏi mất công thiết lập lại các thuộc tính mà tôi đã lập.

Cập nhật 22/04/2022: Thêm thiết lập dành cho ai chỉ cần nhập mã số nhưng tìm danh sách theo tên hàng:
=> Khai báo: Cột 2 lớn hơn Cột 1 một đơn vị và số cột cho combobox là 1 (VD: Cột 2 = 3, Cột 1 = 2 và số cột = 1)
hi anh!
em hơi gà excel nên anh cho em hỏi, sao em coppy cái combobox này sang 1 sheet khác nó ko hoạt động vậy anh?
nhấp hiện design view thì thấy, nhưng em bỏ ra cái nó mất tiêu, ấn vào nó như gõ vào 1 ô bình thường trong excel ak
 
Upvote 0
hi anh!
em hơi gà excel nên anh cho em hỏi, sao em coppy cái combobox này sang 1 sheet khác nó ko hoạt động vậy anh?
nhấp hiện design view thì thấy, nhưng em bỏ ra cái nó mất tiêu, ấn vào nó như gõ vào 1 ô bình thường trong excel ak
Chép toàn bộ code của sheet chứa cái combobox sang nữa chứ.
 
Upvote 0
Chép toàn bộ code của sheet chứa cái combobox sang nữa chứ.
em đã chuyển sang hết dc,

nhưng giờ em chỉ muốn cho phép cái combobox này hoạt động khi ở Khu Cột C thui dc ko anh?
còn show thông tin thì nó củng chỉ show tên vật tư thui
em có đính kèm file anh xem qua giúp em nha

em cám ơn anh ak
 

File đính kèm

  • Test.xlsm
    175.2 KB · Đọc: 29
Upvote 0
Bạn xem hướng dẫn ở bài #1. Tôi nói khá rõ mà
 
Upvote 0
Về việc dùng combobox để tìm và nhập dữ liệu trực tiếp trên trang tính thì GPE có nhiều, nhưng nếu muốn sửa lại để dùng cho trường hợp cụ thể của bạn thì khá khó khăn nếu không rành về VBA.

Trong file này, tôi cố gắng viết code để đơn giản hóa việc chỉnh sửa kia, làm sao không những dễ cho người dùng mà ngay cả chính tôi sau 1 thời gian dài cũng không phải mất công bóp trán sửa để dùng cho một cách nào đó.
...
Tôi thấy cái ý tưởng viết cái thủ tục để khai báo Combobox có thể tái sử dụng cho các file khác của bạn khá hay. Tôi đã dùng thử và có một số ý như sau:
- Mỗi lần mở file là phải khai báo vào Input box? Không biết tôi có bỏ sót mục nào trong hướng dẫn của bạn hay không nhưng nếu vậy thì bất tiện quá.
- Nếu dùng Sheet Form nhập liệu thì dùng Combobox kiểu này gây bất tiện vì phải dùng chuột, không thể dùng phím mũi tên hay tab để di chuyển giữa các Cell --> không tiện cho nhập liệu nhanh.
- Trong một Form nhập liệu sẽ có nhiều hơn một Combobox, vậy khai báo Combobox thứ 2, 3... như thế nào?
Ví dụ: combobox chọn [Mã vật tư], combobox chọn [Loại giá bán], combobox [Chọn loại thanh toán] v.v..
Một số ý kiến khi trải nghiệm là vậy. :)
 
Upvote 0
Tôi thấy cái ý tưởng viết cái thủ tục để khai báo Combobox có thể tái sử dụng cho các file khác của bạn khá hay. Tôi đã dùng thử và có một số ý như sau:
- Mỗi lần mở file là phải khai báo vào Input box? Không biết tôi có bỏ sót mục nào trong hướng dẫn của bạn hay không nhưng nếu vậy thì bất tiện quá.
- Nếu dùng Sheet Form nhập liệu thì dùng Combobox kiểu này gây bất tiện vì phải dùng chuột, không thể dùng phím mũi tên hay tab để di chuyển giữa các Cell --> không tiện cho nhập liệu nhanh.
- Trong một Form nhập liệu sẽ có nhiều hơn một Combobox, vậy khai báo Combobox thứ 2, 3... như thế nào?
Ví dụ: combobox chọn [Mã vật tư], combobox chọn [Loại giá bán], combobox [Chọn loại thanh toán] v.v..
Một số ý kiến khi trải nghiệm là vậy. :)
- Có thể thay inputbox bằng việc khai báo cố định trong code.
- Muốn dùng phím tab để thoát khỏi combobox thì vòng vèo 1 chút. Trước đây tôi đã thử rồi nhưng thấy bất tiện sao đó quên mất rồi. Để hồi lục lại xem thử.
- Có nhiều combobox thì cứ mỗi cái phải thêm 1 bộ code ẩn/hiện, keyup, match và đặt điều kiện sử dụng trong sự kiện SelectionChange.
 
Upvote 0
- Có nhiều combobox thì cứ mỗi cái phải thêm 1 bộ code ẩn/hiện, keyup, match và đặt điều kiện sử dụng trong sự kiện SelectionChange.
Đó là lý do tôi nói nên chuyển nó thành Class để có thể khai báo sử dụng cho bao nhiêu comboBox cũng được.
 
Upvote 0
Web KT
Back
Top Bottom