Cố định các controls trong UserForm, giống như cách cố định dòng cột trên sheet?

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Nguyễn Khả Nam

Thành viên mới
Tham gia
6/6/18
Bài viết
23
Được thích
87
Chào các bạn,
Mình đang gặp một chút vấn đề khi cố định các controls trong UserForm, giống như cách cố định dòng cột trên sheet.
Bạn nào biết cách xử lý vấn đề này có thể giúp mình được không? Mình rất cảm ơn sự giúp đỡ của các bạn!

1717044945851.png
 

File đính kèm

  • ChekboxForm.xlsm
    47.4 KB · Đọc: 7
Lần chỉnh sửa cuối:
Tạo các label thay cho việc dùng dữ liệu dòng 1 làm tiêu đề. Nghĩa là nạp dữ liệu từ dòng 2 trở xuống.
Tuy nhiên nếu dữ liệu 50 dòng sẽ sinh ra 65 control, khó kiểm soát.
 
Upvote 0
Tạo các label thay cho việc dùng dữ liệu dòng 1 làm tiêu đề. Nghĩa là nạp dữ liệu từ dòng 2 trở xuống.
Tuy nhiên nếu dữ liệu 50 dòng sẽ sinh ra 65 control, khó kiểm soát.
Cháu cảm ơn chú đã góp ý, cháu đã nghĩ đến cách đó .
Tuy nhiên gặp phải vấn đề khi co kéo sang phải sang trái thì các lable tiêu đề phía trên không chạy theo các cột tương ứng ạ
 
Upvote 0
Cháu cảm ơn chú đã góp ý, cháu đã nghĩ đến cách đó .
Tuy nhiên gặp phải vấn đề khi co kéo sang phải sang trái thì các lable tiêu đề phía trên không chạy theo các cột tương ứng ạ
Theo tôi thì thay vì vẽ 1 loạt các control, thì vẽ chỉ 1 listbox, Header = True
Đâu phải dòng nào cũng cần chỉnh sửa, nên muốn sửa dòng nào thì lấy dữ liệu dòng đó ra các textbox hoặc combobox để sửa rồi cập nhật vào đúng dòng đó.
 
Upvote 0
Theo tôi thì thay vì vẽ 1 loạt các control, thì vẽ chỉ 1 listbox, Header = True
Đâu phải dòng nào cũng cần chỉnh sửa, nên muốn sửa dòng nào thì lấy dữ liệu dòng đó ra các textbox hoặc combobox để sửa rồi cập nhật vào đúng dòng đó.
Vâng, đó cũng là một cách hay và hiệu quả chú ạ,cháu đã từng thiết kế thêm form phụ kiểu này nhấn đúp chuột vào dòng nào trong listbox thì form phụ sẽ hiển thị và sẽ có các cotrols trong form phụ lấy dữ liệu theo dòng đó.
Tuy nhiên ở form này cháu thấy thiết kế kiểu checkbox vậy nhìn vẫn đẹp và hay hơn chỉ tiếc là đang vướng vấn đề cố định tiêu đề nên đưa lên đây để học hỏi thêm ạ.
 
Upvote 0
Tuy nhiên ở form này cháu thấy thiết kế kiểu checkbox vậy nhìn vẫn đẹp và hay hơn chỉ tiếc là đang vướng vấn đề cố định tiêu đề nên đưa lên đây để học hỏi thêm ạ.
Nếu bạn ưu tiên cái đẹp thì tôi chịu thua. Riêng tôi thì ưu tiên form nhẹ nhàng, code đơn giản và quan trọng nhất là hiệu quả.
Người dùng sẽ mở form lên, phải nhập liệu, thêm xóa sửa nửa giờ cho đến vài giờ chứ không mở form lên ngồi ngắm. Nhiều khi để thỏa mãn cái ấn tượng mở form ngắm 30 giây đầu mà phải mất 10, 15 ngày viết code.
 
Upvote 0
Vâng, đó cũng là một cách hay và hiệu quả chú ạ,cháu đã từng thiết kế thêm form phụ kiểu này nhấn đúp chuột vào dòng nào trong listbox thì form phụ sẽ hiển thị và sẽ có các cotrols trong form phụ lấy dữ liệu theo dòng đó.
Tuy nhiên ở form này cháu thấy thiết kế kiểu checkbox vậy nhìn vẫn đẹp và hay hơn chỉ tiếc là đang vướng vấn đề cố định tiêu đề nên đưa lên đây để học hỏi thêm ạ.
Bạn thử đổi qua dùng Listview xem thử. Nếu muốn hiển thị font chữ unicode thì dùng cái BSListview của bác Tuân.
Listview chỉ để xem, chọn dòng chứ không cập nhật trực tiếp được.

Screen Shot 2024-05-31 at 07.43.16.png
 
Upvote 0
Bạn thử đổi qua dùng Listview xem thử. Nếu muốn hiển thị font chữ unicode thì dùng cái BSListview của bác Tuân.
Listview chỉ để xem, chọn dòng chứ không cập nhật trực tiếp được.

View attachment 301260
Cảm ơn bạn đã góp ý ,bạn có thể chia sẻ file kèm với cách dùng Listview để tôi học hỏi thêm cách tạo nhiều checkbox trongListview như vậy được không ?
 
Upvote 0
Theo tôi thì thay vì vẽ 1 loạt các control, thì vẽ chỉ 1 listbox, Header = True
Đâu phải dòng nào cũng cần chỉnh sửa, nên muốn sửa dòng nào thì lấy dữ liệu dòng đó ra các textbox hoặc combobox để sửa rồi cập nhật vào đúng dòng đó.
Bạn thử đổi qua dùng Listview xem thử. Nếu muốn hiển thị font chữ unicode thì dùng cái BSListview của bác Tuân.
Listview chỉ để xem, chọn dòng chứ không cập nhật trực tiếp được.
Cái mà thớt muốn gần như in hệt DataGridview của Dot NET (trừ chuyện sắc đẹp).
Để làm chuyện này, cần code kết nối với mấy cái dll của dot NET. Các bạn thường gọi chúng là API's

Đồng thời, người code phải ở trình độ trên trung bình mới đủ sức kiểm soát các dòng được người dùng update.

Code kết nối dll's của dot NET khá dài và phức tạp. Những bạn nào quen viết code kiểu "write once, use many time" (viết một lần, xài lại nhiều) sẽ thấy cái lợi của dot NET.
 
Upvote 0
Upvote 0
Thử đặt tiêu đề ở một frame riêng và đồng bộ vị trí scroll của 2 frame trong sự kiện Scroll của frame.
Cảm anh đã góp ý, kiến thức em vẫn bị hạn chế chưa xử lý được vấn đề này.
Nếu anh có thời gian thì làm cho em xin ví dụ tham khảo với.
 
Upvote 0
Cảm anh đã góp ý, kiến thức em vẫn bị hạn chế chưa xử lý được vấn đề này.
Nếu anh có thời gian thì làm cho em xin ví dụ tham khảo với.
Để đồng bộ khi kéo Frame2 thì dùng 1 dòng code này thôi. (Frame1 chứa dòng tiêu đề)

JavaScript:
Private Sub Frame2_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle)
    Frame1.ScrollLeft = Frame2.ScrollLeft + ActualDx
End Sub

Xem file đính kèm.
 

File đính kèm

  • ChekboxForm_ongke0711.xlsm
    55 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Để đồng bộ khi kéo Frame2 thì dùng 1 dòng code này thôi. (Frame1 chứa dòng tiêu đề)

JavaScript:
Private Sub Frame2_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle)
    Frame1.ScrollLeft = Frame2.ScrollLeft + ActualDx
End Sub

Xem file đính kèm.
Hay quá anh ơi, nếu có hứng thú anh áp dụng luôn cả cột UserID nữa ạ
 
Upvote 0
Cái mà thớt muốn gần như in hệt DataGridview của Dot NET (trừ chuyện sắc đẹp).
Để làm chuyện này, cần code kết nối với mấy cái dll của dot NET. Các bạn thường gọi chúng là API's

Đồng thời, người code phải ở trình độ trên trung bình mới đủ sức kiểm soát các dòng được người dùng update.

Code kết nối dll's của dot NET khá dài và phức tạp. Những bạn nào quen viết code kiểu "write once, use many time" (viết một lần, xài lại nhiều) sẽ thấy cái lợi của dot NET.
Vâng có lẽ phần mềm này họ đang dùng DataGridview, như bác nhận xét:

1717142840877.png
 
Upvote 0
Vâng có lẽ phần mềm này họ đang dùng DataGridview, như bác nhận xét:
Bên MS Access Form có hỗ trợ hơn, thiết kế giống vậy dễ dàng.

g8pN7Se.png


Screen Shot 2024-05-31 at 15.19.08.png
 
Upvote 0
Về mặt ý nghĩa form chắc là form phân quyền. Nếu là form phân quyền thì lâu lâu mới phải chỉnh sửa, thậm chí chỉ cần thêm bớt chỉnh sửa ngay trên sheet.
Tôi thì ngán cái việc giải quyết 1 việc rất đơn giản là phân quyền, cả năm mới chỉnh sửa thêm bớt 1 vài lần, mà phải viết cả 1 rừng code, thậm chí không hiểu hết code.
 
Upvote 0
Về mặt ý nghĩa form chắc là form phân quyền. Nếu là form phân quyền thì lâu lâu mới phải chỉnh sửa, thậm chí chỉ cần thêm bớt chỉnh sửa ngay trên sheet.
Tôi thì ngán cái việc giải quyết 1 việc rất đơn giản là phân quyền, cả năm mới chỉnh sửa thêm bớt 1 vài lần, mà phải viết cả 1 rừng code, thậm chí không hiểu hết code.
Chào chú Mỹ, đúng là form phân quyền , làm trên sheet thì dễ rồi chú.
Nhưng nếu cứ chọn cái dễ để làm thì kiến thức cũng dừng lại ở đó cũng sẽ không có những câu hỏi hay chủ đề nào mới mẻ hơn.
 
Upvote 0
Web KT

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

Back
Top Bottom