CÔNG TY CỔ PHẦN BLUESOFTS

Lập trình VBA tạo Task Pane cùng BSAC chuẩn mực

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