Tạo bảng nhập Dữ liệu nhiều dòng bằng VBA Excel

Liên hệ QC

DarkWanderer

Thành viên hoạt động
Tham gia
16/12/19
Bài viết
104
Được thích
76
Giới tính
Nam
Chào anh chị em trên Diễn đàn,
Mình là nhân viên kho nên tự làm 1 form nhập xuất kho để tự theo dõi vật tư trong kho, ở đây có 1 số vấn đề trong nhập liệu nhiều dòng mà mình tự mò giải quyết như sau
1. Làm sao để quản lý số lượng dòng trên Form
- Mình tạo 1 textbox tên LineCount để lưu trữ số lượng dòng
2. Làm thế nào để xác định được hiện thêm mới dòng nào, xóa dòng nào
- Mình đặt tên các Control như: Column001_Row002, Column006_Row012
- Mình tạo 1 class module để lưu Control.name vào Textbox1, muốn biết số dòng đang chọn là bao nhiêu thì là Right(Textbox1,3)
- Khi thêm dòng thì thì + giá trị cho Textbox1, xóa dòng thì - giá trị Textbox 1
- Khi xóa 1 dòng thì mình dòng lệnh .remove(Textbox1.value) (.remove chỉ áp dụng cho các Control tạo ra bằng code)
3. Làm sao để đưa dữ liệu từ Form xuống Sheet, VD như trong Video mình đã đưa giá trị của 2400 Control (800 x 3) xuống Sheet
- Theo cách bình thường
Sheet1.range("A"&lastrow).value = control1.value
Sheet1.range("B"&lastrow).value = control2.value
Cách này máy tính chạy rất chậm
- Vì vậy mình đã tạo 1 mảng động rồi đưa tất cả Control.value vào đó (Kích thước mảng bằng (LineCount.value,4))
- Sau đó mình dùng code Insert Shift row thêm dòng vào bảng (Số dòng mới thêm bằng LineCount.value), như vậy mình không cần phải kẻ sẵn bảng nhiều, dữ liệu bao nhiêu thì code tự kẻ tiếp, như vậy file đỡ nặng
- Đưa mảng xuống Sheet
Mời mọi người tham khảo, mình cũng không học bài bản nên đụng cái nào mới mò thôi, hiểu biết có thể không đúng :wiggle:
 
Lần chỉnh sửa cuối:
ý của em là khi chọn nhà cung cấp trong CB_NCC không có thì nhấn LB_NCC để thêm NCC vào rồi quay lại Form nhập liệu nhập nhà cung cấp mới.
Bài đã được tự động gộp:

Anh @ongke0711 đã nói đúng ý em ạ.
 
Upvote 0
Trước đây tôi cũng có post một bài mẫu Form nhập liệu (Xem, Sửa, Xóa) ở link này: Mẫu userform nhập liệu
Việc thiết kế Userform cũng phải đòi hỏi kỹ thuật phân tích, nghệ thuật thiết kế chứ không phải bê nguyên kiểu nhập liệu trang bảng tính Excel truyền thống vô mà được.

Hình minh họa:
nn4dFmQ.png
 
Upvote 0
Vậy sẽ phát sinh 2 vấn đề sau:

(1) Sao lại phải nhập NCC (nhà cung cấp) mới từ 1 form khác, mà không phải là 1 Page khác trên Form đang nhập;
(2) NCC vừa được nhập mới sẽ có trong ComBoBox để ta chọn & nhập liệu (cho hóa đơn) dang dỡ (đang nhập) hay không?
Nếu nó chưa có trong ComBoBox, thì làm cách nào cho nó cập nhật ngay để phục vụ kịp thời cho người đang nhập liệu?

Rất mong các bạn thêm ý kiến về 2 vấn đề trên & rất cảm ơn!
 
Upvote 0
Vậy sẽ phát sinh 2 vấn đề sau:

(1) Sao lại phải nhập NCC (nhà cung cấp) mới từ 1 form khác, mà không phải là 1 Page khác trên Form đang nhập;
(2) NCC vừa được nhập mới sẽ có trong ComBoBox để ta chọn & nhập liệu (cho hóa đơn) dang dỡ (đang nhập) hay không?
Nếu nó chưa có trong ComBoBox, thì làm cách nào cho nó cập nhật ngay để phục vụ kịp thời cho người đang nhập liệu?
Bác SA_DQ hỏi hay đó. Đây là nhưng câu hỏi liên quan đến thiết kế cũng như trải nghiệm người dùng (UX) mà người viết ứng dụng phải suy nghĩ đến khi thiết kế ứng dụng, form.

(1). Thiết kế nhập liệu trong cùng 1 Form có nhiều Page cũng có điểm lợi là xử lý luôn trong cùng Form. Một điểm khác mà tôi tính đến khi tách rồi cái Form này ra là:
- Giảm tải số lượng các Control (Textbox, Subform, Page...), Source dữ liệu khi gọi mở Form này (Load form). Số lượng Control tải lên càng nhiều, có nhiều source dữ liệu đi theo các Page con trong đó sẽ ảnh hưởng đến tốc độ thực thi, mở form. Nếu trong môi trường dữ liệu đa người dùng, Form nhiều Pages sẽ phải mở các bảng dữ liệu liên quan mà chưa chắc mình đã dùng tới trong lần nhập liệu này mà việc kết nối tới bảng dữ liệu có thể ảnh hưởng tới một User khác đang thao tác trên bảng dữ liệu đó.
- Có thể sẽ có nhiều Form nhập liệu khác (Phiếu nhập, phiếu xuất, phiếu hoàn trả v...) có tác vụ liên quan đến việc nhập/sửa/xóa NCC nên phải thiết kế cho nó 1 Form độc lập rồi có thể gọi tới nó từ các Form khác bất kỳ.
(2) Vấn đề này của bác chắc chắn khi người ta thiết kế Form riêng buộc phải tính đến để thêm các code Update/ Refresh dữ liệu ngay và luôn khi đóng Form.

Trước đây tôi có thiết kế một cái Form nhập liệu bán hàng đặc thù mà mất cả tháng để tìm ra cách thiết kế hợp lý nhất vừa thuận tiện nhất cho người dùng và dễ dàng cho việc code. Nếu kỹ năng phân tích vấn đề, nắm vững nghiệp vụ tốt thì việc thiết kế Form sẽ đỡ mất thời gian hơn. Nói chung đơn giản có, phức tạp cũng có.
 
Upvote 0
Bác SA_DQ hỏi hay đó.
- Có thể sẽ có nhiều Form nhập liệu khác (Phiếu nhập, phiếu xuất, phiếu hoàn trả v...) có tác vụ liên quan đến việc nhập/sửa/xóa NCC nên phải thiết kế cho nó 1 Form độc lập rồi có thể gọi tới nó từ các Form khác bất kỳ.
Một lý do khác nữa là sẽ có 1 anh chàng nào đó túm được thông tin nhà cung cấp mới, hoặc túm được 1 khách hàng mới, hoặc đưa ra 1 nhu cầu sản phẩm mới. Anh này không nhập liệu mua không nhập liệu bán, không nhập liệu nhập kho, thì mắc gì phải mở form của người khác ở bộ phận khác lên để làm 1 xíu công việc đơn giản của mình?
 
Upvote 0
Khi em nhập liệu mà không có nhà cung cấp nào đó thì em nhấn vào Label ThemNCC, khi đó Form thêm nhà cung cấp hiên ra và em tạo nhà cung cấp mới, xong em nhấn lưu và thoát form themNCC, lúc này Cb_NCC sẽ có nhà cung cấp mới đó.
 
Upvote 0
Thông thường nếu theo Form dạng này thì nó sẽ hoạt động như thế này anh SQ_DQ:
- Nút [Thêm NCC mới] sẽ mở ra 1 userform khác để nhập thông tin NCC.
- Khi nhập tên NCC bên dưới, nếu không có trong hệ thống sẽ bật thông báo và hỏi có muốn thêm NCC mới không - nếu OK sẽ mở Form thêm NCC - nếu không sẽ yêu cầu chọn lại NCC từ danh sách có sẵn.
- Ở Listbox bên dưới, khi nhấp đôi chuột (hoặc bấm nút Sửa/Xóa) vào dòng nào sẽ hiển thị thông tin lên các textbox bên trên để chỉnh sửa nội dung hoặc Xóa dòng đó khỏi CSDL.
bạn có thể chia sẻ code mình xin tgam khảo được không
 
Upvote 0
Mình có tạo 1 useform có 2 dòng hàng 3 cột textbox, mỗi lần click CommandButton để xuống sheet, thì chỉ được dòng đầu , mình xin code nhập 1 lần nhiều dòng textbox xuống sheet được không ạ
 
Upvote 0
Web KT
Back
Top Bottom