Task Pane là cửa sổ mềm mại nằm ở 4 cạnh của cửa sổ Excel hoặc nổi lên (float). Lập trình VBA để tạo ra nó kết hợp nhúng Userform giúp bạn có được một giao diện người dùng đẹp và chuyên nghiệp. Đây là bài hướng dẫn chi tiết để bạn biết cách làm từ con số 0 với BSAC để tạo Task Pane.
Nạp các controls của BSAC
Trước khi lập trình với BSAC, điều đầu tiên bạn cần phải biết import các controls vào cửa sổ Toolbox.
Bước 1: Mở một Userform bất kỳ,
Bước 2: Nhấp chuột vào Userform cửa sổ Toolbox hiện ra, thực hiện các tháo tác như hình dưới đây:
(1) Nhấp chuột phải trên tab "Controls" trong cửa sổ Toolbox, chọn "Import page" (2), tìm trong thư mục của A-Tools hoặc bộ thư viện SetupBSAC giải nén, chọn file "ImportToToolbox.pag" (3), cuối cùng chọn Ok (4) để hoàn tất.
Tạo Task Pane cùng Userform với hai cách thức BSTaskPaneX và BSTaskPane
1. Sử dụng BSTaskPaneX
Nhúng control BSTaskPaneX
Kéo control BSTaskPaneX từ Toolbox vào Userform. Bấm váo control này trên userform rồi nhìn sang cửa sổ Properties Window, bấm tiếp "Custom..." để nhập thông tin cho BSTaskPaneX.
Tròn của sổ mở ra: Text là tên của Task Pane bắt buộc phải có, các mục khác bỏ qua.
Tiếp theo, bấm vào Userform, tại cửa sổ Properties, sửa
ShowModal = False . Chỉ định này là bắt buộc với kỳ phương pháp tạo Task Pane nào.
Tiến hành lập trình trong sự kiện UserForm_Initialize()
Private Sub UserForm_Initialize()
Case 1: Use BSTaskPaneX
BSTaskPaneX1.AllowHide = False 'Prevent use from clicking close [X]
BSTaskPaneX1.Create Me, , ActiveWindow
End Sub
Private Sub cmdClose_OnClick()
Unload Me
End Sub
|
Chỉ cần như vậy là bạn đã tạo thành công Task Pane và nhúng Userform vào bên trong.
Bấm F5 để chạy Userform hoặc bạn tạo Module để viết macro mở Userform1
Vào menu Insert - > Module, bây giờ hãy viết code để mở Userform
Sub ShowForm1()
UserForm1.Show
End Sub
|
Đặt con trỏ bên trong macro ShowForm1 nhấn F5 để chạy Userform, hoặc bạn gán macro này lên menu lệnh, nút lệnh.
Thật tuyệt với mà rất đơn giản!
Tạo Task Pane bằng thư class BSTaskPane
Đây là cách thức chuẩn mực, chúng tôi khuyến khích bạn tạo theo phương pháp này vì tính cơ động của nó.
Nhúng thư viện BSAC vào file Excel
Điều đầu tiên bạn phải đảm bảo thư viện BSAC đã được nhúng vào file Excel của bạn (VBAProject). Thông thường khi bạn kéo một control bất kỳ của BSAC và Userform thì thư viện BSAC đã được nhún vào file Excel này. Nếu trường hợp bạn không dùng control nào của BSAC trên Userform mà chỉ dùng các class của BSAC thì buộc phải làm thao tác nhúng như dưới đây.
(Cửa sổ chọn file BSAC.ocx, chọn kiểu file "Activex Controls")
Lưu ý: Office 32-bit thì chọn BSAC.ocx 32-bit, tại hư mục "C:\Windows\SysWow64"; Office 64-bit thì chọn BSAC.ocx 64-bit, tại hư mục "C:\Windows\System32".
Viết code tạo Task Pane bằng BSTaskPane
Tạo module (nếu chưa có hoặc cần một cái mới để lưu khối code riêng)
Option Explicit
Private WithEvents TP As BSTaskPane 'for Case 2:
Private Sub UserForm_Initialize()
'Case 1: Use BSTaskPaneX
'BSTaskPaneX1.AllowHide = False 'Prevent use from clicking close [X]
'BSTaskPaneX1.Create Me, , ActiveWindow
'Case 2: Use BSTaskPane
Dim TPs As New BSTaskPanes
Set TP = TPs.Add("My Task Pane 1", Me, Window:=ActiveWindow)
TP.AllowHide = False
Set TPs = Nothing
'SinkControl:
' + Userform (Me)
' + Handle to window
' + ClassName:Title (if only find class name then "ClassName:"
' + Title
'Class and Title of appilcation use "Spy++ tool" or other to find
End Sub
Private Sub cmdClose_OnClick()
Unload Me
End Sub
Đoạn code dưới đây có thể bỏ qua nếu không lập trình sự kiện với Task Pane
Private Sub TP_OnDockChange(ByVal BSTaskPaneInst As BSAC.BSTaskPane)
Debug.Print "TP_OnDockChange: " & BSTaskPaneInst.DockPosition
End Sub
Private Sub TP_OnResize(ByVal Width As Long, ByVal Height As Long)
Debug.Print "TP_OnResize: " & Width & "x" & Height
End Sub
Private Sub TP_OnVisible(ByVal BSTaskPaneInst As BSAC.BSTaskPane)
Debug.Print "TP_OnVisible: " & BSTaskPaneInst.Visible
End Sub
|
Như vậy là xong. Bây giờ bạn hãy chạy/mở Userform để thấy kết quả.
Nếu các bạn muốn khi co giãn Task Pane mà controls trong Userform thay đổi theo thì hãy lập trình trong sự kiện
UserForm_Resize().
Private Sub UserForm_Resize()
'Resze any controls if you want
On Error Resume Next
YourControl.Width = Width - YourControl.Left * 2
End Sub
|
Như vậy tôi đã hướng dẫn kỹ về hai cách tạo Task Pane và nhúng Userform vào nó.
ĐÃ HOÀN THÀNH CƠ BẢN!
Kiến thức mở rộng tạo Task Pane chuẩn mực và các ví dụ mở rộng
Bạn hãy tạo một Userform thứ 2 và vẽ các controls như hình dưới đây
Các controls được nhúng vòa Userform gồm: BSButton, BSImageList, BSDateSelector, BSDateTimePickerm SpinButton, BSImage, Label. (BS* là controls thuộc BSAC).
Code tương tác các control trong Userform được tôi gửi theo file đính kèm các bạn tải về xem. Bài viết này tôi chỉ chú trọng phân tích code liên quan đến Task Pane.
Tạo module, copy khối code tạo và điều khiển Task Pane chuẩn mực dưới đây.
Option Explicit
'Author: Nguyen Duy Tuan - https://bluesofts.net
' duytuan@bluesofts.net
'Facebook: https://www.facebook.com/groups/hocexcel
'This code for BSAC v3.1
'Check version of BSAC: F5 to open window "Immediate"
'?BSACVersion
'Enter
Sub CreateTaskPaneAndCheck()
Dim TPs As New BSTaskPanes
Dim TP As BSTaskPane
Dim idx As Long, Title As String
Title = "My Task Pane 2"
idx = TPs.IndexOf(Title, ActiveWindow) 'Find exits task pane?
If idx >= 0 Then 'Found
'Get task pane in task pane store
Set TP = TPs(idx)
Else
'Create the new task pane
Set TP = TPs.Add(Title, UserForm2, False, Window:=ActiveWindow)
TP.AllowHide = False
End If
Set TPs = Nothing
End Sub
Sub CreateTaskOnNewWindow()
Dim TPs As New BSTaskPanes
Dim TP As BSTaskPane
Dim Wb As Workbook, Title As String
Set Wb = Workbooks.Add 'Create new workbook
Title = "Workbook: " & Wb.Name
'Create task pane on the new workbook
Set TP = TPs.Add(Title, , False, Window:=Wb.Windows(1))
TP.AllowHide = False
TP.CTP.Width = 350
Set TPs = Nothing
End Sub
Sub ClearAllTaskPanesInWindow()
Dim TPs As New BSTaskPanes
TPs.Clear ActiveWindow
Set TPs = Nothing
End Sub
Sub ClearAllTaskPanes()
Dim TPs As New BSTaskPanes
TPs.Clear
Set TPs = Nothing
End Sub
|
Ok. Bây giờ bạn hãy gám các macro vào menu hoặc các nút lệnh và chạy, bạn sẽ được giao diện như dưới đây:
Thật tuyệt vời khi lập trình VBA kết hợp với BSAC bạn đã có một giao diện đẹp và rất pro. Nếu không có BSAC, code thuần túy trong VBA chắc hản điều đó là rất rất khó.
Download file ví dụ
BSAC là activex controls chỉ duy nhất một file cần cài vào máy tính "BSAC.ocx". Nếu bạn cài Add-in A-Tools thì BSAC được tự động cài vào. Nếu bạn chỉ muốn BSAC trong máy thì hãy đọc hướng dẫn chi tiêt cách cài trong bộ cài BSAC.
Download SetupBSAC