Thiết lập tiêu đề cho Listbox bằng VBA ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

sealand

Thành viên gạo cội
Tham gia
16/5/08
Bài viết
4,883
Được thích
7,688
Giới tính
Nam
Nghề nghiệp
Kế Toán
Mình loay hoay mãi mà không được nên đưa lên đây mọi người hỗ trợ:

Giả sử trên Form có Listbox1. Listbox1 có 2 cột là MaVT và TenVT.

Các lệnh thiết lập listbox như sau:
1/ Lệnh AddItems và List để tạo các dòng trên Listbox1
2/Lệnh cho hiện tiêu đề cột của Listbox là: Listbox1.ColumnHeads=True

Giờ để Listbox có dòng tiêu đề cột 1 là Mã VT và tiêu đề cột 2 là Tên VT ta làm thế nào ?
 
Anh Siwtom ơi. Khi Form đang được Show, nếu bị lỗi khi chạy code thì không Debug được, Excel bị treo, phải dùng Ctrl+Alt+Delete để thoát Excel.
 
Upvote 0
Anh Siwtom ơi. Khi Form đang được Show, nếu bị lỗi khi chạy code thì không Debug được, Excel bị treo, phải dùng Ctrl+Alt+Delete để thoát Excel.

Anh có thể cho biết anh đang bị lỗi gì và những thủ tục anh gán lên trên form là gì không?
 
Upvote 0
Ví dụ thay vì chạy code
Mã:
Private Sub UserForm_Activate()
ListBox1.SetFocus
ListBox1.ListIndex = [COLOR=#ff0000]ListBox1.ListCount - 1
[/COLOR]End Sub
Mình chạy code (do ListIndex bắt đầu từ 0 nên vượt 1 dòng)
Mã:
Private Sub UserForm_Activate()
ListBox1.SetFocus
ListBox1.ListIndex = [COLOR=#ff0000]ListBox1.ListCount[/COLOR]
End Sub
Hoặc cố tình cho một câu lệnh sai nào đó hoặc Form đang Show lại tạm dừng (bấm Ctrl+Pause). Nếu gặp lỗi mình nhờ anh siwtom cho câu lệnh để bẩy lỗi (có lẽ là SetWindowProc hWin, False), trả lại nguyên trạng ban đầu, còn nếu tạm dừng, e rằng không có thuốc chữa!
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ thay vì chạy code
Mã:
Private Sub UserForm_Activate()
ListBox1.SetFocus
ListBox1.ListIndex = [COLOR=#ff0000]ListBox1.ListCount - 1
[/COLOR]End Sub
Mình chạy code (do ListIndex bắt đầu từ 0 nên vượt 1 dòng)
Mã:
Private Sub UserForm_Activate()
ListBox1.SetFocus
ListBox1.ListIndex = [COLOR=#ff0000]ListBox1.ListCount[/COLOR]
End Sub
Hoặc cố tình cho một câu lệnh sai nào đó hoặc Form đang Show lại tạm dừng (bấm Ctrl+Pause). Nếu gặp lỗi mình nhờ anh siwtom cho câu lệnh để bẩy lỗi (có lẽ là SetWindowProc hWin, False), trả lại nguyên trạng ban đầu, còn nếu tạm dừng, e rằng không có thuốc chữa!

Chuyện Excel bị treo đâu có phải chỉ khi có SetWindowProc?
Bạn chưa gặp trường hợp khi code có lỗi thì Excel bị treo tới mức không Debug được, không đóng bình thường được, thậm chí dùng Ctrl + Alt + Del cũng phải vài lần mới đóng được.
Vậy câu hỏi là: liệu có thể làm thế nào để khi gặp lỗi thì vẫn luôn debug được hoặc đóng Excel bình thường? Và câu hỏi đó phải đặt chung cho mọi người. "Bệnh" như bạn kể đâu phải là "độc quyền" hay tính chất của riêng SetWindowProc? Tất nhiên khi dùng window subclassing mà cố tình gây lỗi thì "bệnh" nguy hiểm hơn.
Theo tôi bạn cứ viết code cẩn thận, những chỗ có thể có lỗi thì phải bẫy lỗi. Nhưng con người không lường được hết mọi trường hợp, viết chuẩn 100%, vậy đôi khi bị treo Excel thì chấp nhận thôi.
Cái Ctrl + Pause của bạn thì tôi nghĩ không ít trường hợp chả có SetWindowProc mà vẫn treo máy.

Tôi hỏi ngoài lề một chút: đôi khi bạn có nhu cầu nhấn Ctrl + Pause à? Để làm gì vậy?
 
Lần chỉnh sửa cuối:
Upvote 0
Chuyện Excel bị treo đâu có phải chỉ khi có SetWindowProc?
Bạn chưa gặp trường hợp khi code có lỗi thì Excel bị treo tới mức không Debug được, không đóng bình thường được, thậm chí dùng Ctrl + Alt + Del cũng phải vài lần mới đóng được.
Vậy câu hỏi là: liệu có thể làm thế nào để khi gặp lỗi thì vẫn luôn debug được hoặc đóng Excel bình thường? Và câu hỏi đó phải đặt chung cho mọi người. "Bệnh" như bạn kể đâu phải là "độc quyền" hay tính chất của riêng SetWindowProc? Tất nhiên khi dùng window subclassing mà cố tình gây lỗi thì "bệnh" nguy hiểm hơn.
Theo tôi bạn cứ viết code cẩn thận, những chỗ có thể có lỗi thì phải bẫy lỗi. Nhưng con người không lường được hết mọi trường hợp, viết chuẩn 100%, vậy đôi khi bị treo Excel thì chấp nhận thôi.
Cái Ctrl + Pause của bạn thì tôi nghĩ không ít trường hợp chả có SetWindowProc mà vẫn treo máy.

Tôi hỏi ngoài lề một chút: đôi khi bạn có nhu cầu nhấn Ctrl + Pause à? Để làm gì vậy?

Cũng xin thưa với mọi người, nếu không để code bị lỗi vào thì khi nhấn Ctrl+Break thì form vẫn thoát và Excel vẫn hoạt động bình thường. Vậy phải có một lỗi gì đó làm cho đứng màn hình.

Nhưng hình như nếu Ctrl+Break, mặc dù không bị lỗi gì, song sử dụng form vài lần (thoát-mở form), sau đó đóng Excel nó hiện lên thông báo "Out of Memory", thoát thông báo vài lần mới thoát được Excel.

Vã lại, theo em thì chúng ta nên thiết kế form cho hoàn chỉnh, không bị lỗi nữa, bước sau cùng chúng ta mới dùng đến hàm này để hoàn thiện cái ComboBox hoặc ListBox của mình để tránh rủi ro.

Em chưa hề biết class module xài như thế nào, em đang chuẩn bị nghiên cứu về nó, vậy có thể thông qua 2 sự kiện của class dưới đây để tạo thêm thuộc tính cho ComboBox hoặc ListBox được không nhỉ?

PHP:
Private Sub Class_Initialize()

End Sub

Private Sub Class_Terminate()

End Sub
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    76.9 KB · Đọc: 244
Lần chỉnh sửa cuối:
Upvote 0
Tôi hỏi ngoài lề một chút: đôi khi bạn có nhu cầu nhấn Ctrl + Pause à? Để làm gì vậy?
À, Tôi giả thiết vậy thôi chớ thực ra lúc sử dụng thì đâu cần Ctrl + Pause. Chỉ có đôi khi chạy thử code mới có nhu cầu đó, tức là lúc thiết kế thôi, ví dụ như để quên dòng lệnh Msgbox ... trong vòng lặp mà thử code.
Nhưng nếu cẩn thận như anh nói, kiểm tra code cẩn thận, trước khi thử thì cũng chẳng cần.
Chân thành cảm ơn Anh!
 
Upvote 0
Cũng xin thưa với mọi người, nếu không để code bị lỗi vào thì khi nhấn Ctrl+Break thì form vẫn thoát và Excel vẫn hoạt động bình thường. Vậy phải có một lỗi gì đó làm cho đứng màn hình.

Nhưng hình như nếu Ctrl+Break, mặc dù không bị lỗi gì, song sử dụng form vài lần (thoát-mở form), sau đó đóng Excel nó hiện lên thông báo "Out of Memory", thoát thông báo vài lần mới thoát được Excel.

Vã lại, theo em thì chúng ta nên thiết kế form cho hoàn chỉnh, không bị lỗi nữa, bước sau cùng chúng ta mới dùng đến hàm này để hoàn thiện cái ComboBox hoặc ListBox của mình để tránh rủi ro.

Em chưa hề biết class module xài như thế nào, em đang chuẩn bị nghiên cứu về nó, vậy có thể thông qua 2 sự kiện của class dưới đây để tạo thêm thuộc tính cho ComboBox hoặc ListBox được không nhỉ?

PHP:
Private Sub Class_Initialize()

End Sub

Private Sub Class_Terminate()

End Sub

Tôi ủng hộ. Nghĩa cứ tự tìm tòi đi. Có điểm gì thắc mắc hãy hỏi - hỏi toàn diễn đàn.
Có tự làm thì mới biết chứ cứ xài đồ có sẵn thì chả bao giờ học được điều mới
 
Upvote 0
Chuột này khác chuột kia thì kể cũng lạ.
Tôi không có chuột cảm ứng và laptop nên muốn nghiên cứu cũng đành chịu.
Tôi viết lại theo cách mới. Thực ra ta không cần theo dõi sự kiện chuột trong toàn system mà chỉ trong phạm vi ứng dụng của ta. Khi chuột được lăn trong cửa sổ của ta thì thông điệp WM_MOUSEWHEEL sẽ được gửi tới hàm cửa sổ của UserForm (window procedure). Vậy chỉ cần "đánh tráo" hàm cửa sổ để xử lý thông điệp WM_MOUSEWHEEL.
Tóm lại ta dùng công nghệ "Window Subclassing" thay cho hook. Với cách này thì lăn chuột trong UserForm hay notepad không ảnh hưởng tới nhau. Code này lại còn đơn giản hơn hook.

...............

Với hàm của Thầy viết thì ComboBox, ListBox trên UserForm rất tuyệt vời, thế nhưng lại không thể sử dụng được đối với ComboBox trong ActiveX Controls khi dùng trên sheet.

Xin Thầy vui lòng cải tiến thêm nữa được không ạ?

À, nếu có thể được thì trên ListBox hoặc ComboBox có Scroll cuộn ngang nữa, mình có thể làm như cuộn đứng được không ạ? Chỉ thấy sao hỏi vậy chứ em nghĩ có lẽ cũng chẳng cần thiết, số cột thường cố định và thường ít hơn so với hàng mà.
 
Lần chỉnh sửa cuối:
Upvote 0
Chuột này khác chuột kia thì kể cũng lạ.
Tôi không có chuột cảm ứng và laptop nên muốn nghiên cứu cũng đành chịu.
Tôi viết lại theo cách mới. Thực ra ta không cần theo dõi sự kiện chuột trong toàn system mà chỉ trong phạm vi ứng dụng của ta. Khi chuột được lăn trong cửa sổ của ta thì thông điệp WM_MOUSEWHEEL sẽ được gửi tới hàm cửa sổ của UserForm (window procedure). Vậy chỉ cần "đánh tráo" hàm cửa sổ để xử lý thông điệp WM_MOUSEWHEEL.
Tóm lại ta dùng công nghệ "Window Subclassing" thay cho hook. Với cách này thì lăn chuột trong UserForm hay notepad không ảnh hưởng tới nhau. Code này lại còn đơn giản hơn hook.
Trong code sau và trong tập tin đính kèm là code đầy đủ để chạy. Nhưng tôi thêm 1 dòng (mầu đỏ) để test thông điệp được gửi tới hàm cửa sổ. Vậy sau khi test xong thì dòng này xóa đi cho khỏi nhàm code.
Bạn hãy: Kích hoạt UserForm1 (bấm Button 1) --> chọn 1 mục trong ListBox hoặc nhấn tam giác của Combobox --> lăn chuột vài lần --> copy và dán lên GPE những dòng mà Debug.Print ghi trong cửa sổ Immediate để tôi xem.

Mới sưu tầm được file này, cái hay của nó là khi bị lỗi không bị "đơ" Excel như những code khác (dùng một nút lệnh tạo lỗi). Tuy nhiên có một bất tiện là khi lăn chuột, nó luôn luôn select các hàng mà nó cuộn qua, thay vì phải giữ nguyên Index ban đầu cho đến lúc ta cần hàng nào thì chọn hàng đó.

Xin các Thầy rành về API chỉnh sửa giúp phần này được không ạ? Cảm ơn rất nhiều!
 

File đính kèm

Upvote 0
Mới sưu tầm được file này, cái hay của nó là khi bị lỗi không bị "đơ" Excel như những code khác (dùng một nút lệnh tạo lỗi). Tuy nhiên có một bất tiện là khi lăn chuột, nó luôn luôn select các hàng mà nó cuộn qua, thay vì phải giữ nguyên Index ban đầu cho đến lúc ta cần hàng nào thì chọn hàng đó.

Xin các Thầy rành về API chỉnh sửa giúp phần này được không ạ? Cảm ơn rất nhiều!
Xin vui lòng giúp đỡ cho vấn đề này ạ. Cám ơn rất nhiều!

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
cho em hỏi sao tải file đính kèm về mà dùng chuôt vẫn không được ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom