168
thoại hiển thị khi gọi bằng VBA không hoàn toàn giống như khi gọi thông qua trình đơn trong
Excel. Chính vì vậy, chẳng có cách nào khác ngoài việc thử nghiệm để kiểm tra hoạt động của
các hộp thoại.
CHÚ Ý Các hộp thoại hiển thị khi gọi bằng VBA không hoàn toàn giống như khi gọi thông
qua trình đơn trong Excel.
Trong trường hợp của hộp thoại Go To, khi hiển thị bằng VBA, nút Special bị mờ đi, không
hoàn toàn giống như khi chọn từ trình đơn EditÖGo To.
Ngoài ra, còn có một vấn đề khác nữa, đó là việc không thể hiển thị được các hộp thoại có
nhiều thẻ khác nhau. Lấy ví dụ với hộp thoại Format Cell, không có cách nào để hiển thị đầy đủ
hộp thoại này với nhiều thẻ khác nhau từ
VBA, thay vào đó, chỉ có thể hiển thị một thẻ tại một
thời điểm. Đoạn mã sau chỉ hiển thị được thẻ Alignment của hộp thoại Format Cells:
Application.Dialogs(xlDialogAlignment).Show
Để hiển thị các thẻ khác trong hộp thoại Format Cells, phải sử dụng riêng lẻ các hằng số đã
được định nghĩa trước như:
xlDialogFormatNumber, xlDialogBorder,
xlDialogCellProtection, xlDialogPatterns, hoặc xlDialogFontProperties.
C
C
H
H
Ư
Ư
Ơ
Ơ
N
N
T
T
R
R
Ê
Ê
N
N
M
M
I
I
C
C
R
R
O
O
S
S
O
O
F
F
T
T
xlDialogOpen Hộp thoại Open
xlDialogSaveAs Hộp thoại Save As
xlDialogPageSetup Hộp thoại Page Setup
xlDialogPrint Hộp thoại Print
xlDialogPrinterSetup Hộp thoại Printer Setup
GỢI Ý Các hằng số tương ứng khi sử dụng tập đối tượng Dialogs được bắt đầu bằng
xlDialog và tiếp theo là tên của hộp thoại (viết liền nhau). Trong VBAIDE, gõ xlDialog sau
đó nhấn CTRL+Space để hiển thị cửa sổ gợi ý mã lệnh, trong đó sẽ có danh sách đầy đủ
các hằng số liên quan.
8.2.6. Thực thi mục trình đơn Excel từ VBA 170
Một cách khác nữa để hiển thị các hộp thoại mặc định là thực thi trực tiếp thông qua trình đơn.
Điều này cũng tương đương như khi sử dụng chuột để chọn một mục trình đơn trong thanh
trình đơn của Excel.
Đoạn mã lệnh sau tương đương với việc người dùng chọn trình đơn EditÖGo To trực tiếp
trong Excel:
Application.CommandBars(“Worksheet Menu Bar”). _
Controls(“Edit”).Controls(“Go To ”).Execute
Câu lệnh trên, khi thực thi sẽ hiển thị hộp thoại Go To. Cần chú ý rằng, đoạn văn bản nằm
trong dấu ngoặc phải giống hệt như những gì hiển thị trên thanh trình đơn (bao gồm cả dấu ba
chấm sau chữ “Go To”).
Việc thực thi mục trình đơn như thế này được thực hiện khá đơn giản, hơn nữa còn khắc phục
được nhược điểm không hiể
n thị hộp thoại có nhiều thẻ như đã đề cập ở phần “Các hộp thoại
mặc định trong Excel – Tập đối tượng Dialogs” trang 167. Ví dụ sau sẽ hiển thị hộp thoại
Format Cells với đầy đủ các thẻ định dạng.
Application.CommandBars("Worksheet Menu Bar"). _
Controls("Format").Controls("Cells ").Execute
C
H
H
Ư
Ư
Ơ
Ơ
N
N
G
G
I
I
V
V
:
:
L
L
Ậ
Ậ
P
P
T
O
S
S
O
O
F
F
T
T
E
E
X
X
C
C
E
E
L
L
171Mỗi một workbook có thể chứa nhiều UserForm khác nhau, mỗi UserForm chính là một hộp
thoại tuỳ biến.
8.3.2. Hiển thị UserForm
172
VBA còn có lệnh Load. Lệnh này chỉ tải UserForm vào trong bộ nhớ mà không hiển thị cho
đến khi sử dụng phương thức
Show của UserForm đó. Để tải UserForm1 vào bộ nhớ, thực hiện
như sau:
Load UserForm1
Khi có một UserForm tương đối phức tạp (có nhiều thành phần điều khiển cùng với nhiều dữ
liệu bên trong đó), nếu sử dụng lệnh
Load để tải UserForm vào bộ nhớ thì UserForm sẽ được
hiển thị nhanh hơn khi sử dụng phương thức
Show. Tuy nhiên, trong đại đa số các trường hợp,
chỉ cần sử dụng phương thức
Show, bởi lẽ phương thức này cũng đã tự động thực hiện lệnh
Load (nếu UserForm chưa được tải vào bộ nhớ) ngay trước khi hiển thị Userform.
Một khi đã được hiển thị, UserForm sẽ luôn tồn tại trên màn hình cho đến khi người dùng đóng
nó lại. Vì vậy, thông thường, người lập trình sẽ tạo thêm một nút lệnh (Command Button) trên
UserFrom để thực hiện thủ tục đóng UserForm. Thủ tục này có thể sử dụng lệnh
Unload để dỡ
bỏ UserForm khỏi bộ nhó của máy tính, hoặc sử dụng phương thức
Hide của đối tượng
UserForm để tạm thời ẩn UserForm.
Đoạn mã sau sẽ đóng cửa sổ UserForm1:
UserForm1.Hide
Hoặc có thể sử dụng đoạn mã sau để đóng cửa sổ UserForm1:
Unload UserForm1
Phương thức Hide chỉ tạm thời ẩn UserForm, bản thân UserForm vẫn còn trong bộ nhớ, các
thuộc tính của UserFrom vẫn có thể được truy cập bình thường. Còn lệnh
Unload thì sẽ gỡ bỏ
UserForm ra khỏi bộ nhớ, lúc này các thuộc tính của UserForm sẽ không thể truy cập được
nữa.
:
L
L
Ậ
Ậ
P
P
T
T
R
R
Ì
Ì
N
N
H
H
T
T
R
R
Ê
Ê
N
E
L
L
173
Hình IV-19: Điều khiển RefEdit
Điều khiển RefEdit cũng tương tự như điều khiển Textbox, vì vậy có thể tham khảo thêm về
điều khiển TextBox để biết thông tin về các phương thức và thuộc tính của điều khiển RefEdit.
Khi thực hiện các thao tác sử dụng RefEdit, cần ghi nhớ những điểm sau:
Ø
Ø
Điều khiển RefEdit trả về chuỗi chứa địa chỉ của vùng dữ liệu. Sau
đó, có thể chuyển
chuỗi đó thành đối tượng kiểu Range sử dụng đoạn mã tương tự như sau:
Dim UserRange As Range
Set UserRange = Range(RefEdit1.Text)
Ø
Ø
Nên khởi tạo giá trị ban đầu cho điều khiển RefEdit bằng địa chỉ của vùng dữ liệu hiện
hành. Để làm được như vậy, trong sự kiện UserForm_Initialize của UserForm cần thêm
đoạn mã lệnh tương tự như sau:
RefEdit1.Text = ActiveWindow.Selection.Address
Ø
Ø
của Excel, xem thêm mục “Hộp thoại InputBox của Excel – Hàm InputBox” trang 162.
8.4. Thao tác trên thanh trình đơn
Hầu hết các chương trình chạy trong hệ điều hành Windows đều có hệ thống thanh trình đơn
bởi tính tiện dụng và hệ thống của nó. Thông qua thanh trình đơn, các chức năng của chương
trình được tổ chức và liệt kê giúp người sử dụng có thể dễ dàng truy cập đến từng tính năng của
chương trình một cách có hệ thống. 174
Đối với các ứng dụng mở rộng viết bằng VBA, việc thực thi một Macro nào đó đều được thực
hiện thông qua trình quản lý Macro hoặc được thực thi trực tiếp trong VBAIDE. Điều này gây
ra nhiều khó khăn cho những người dùng và làm giảm tính chuyên nghiệp của ứng dụng. Thay
vào đó, với một số đoạn mã lệnh đơn giản, người lập trình có thể tự xây dựng hệ thống trình
đơn, tạo nên một giao diện người dùng có tính hiệu quả cao cho ứng dụng mở rộng của mình.
Excel có hai hệ thống thanh trình đơn tương ứng với kiểu sheet được chọn là Worksheet hay
Chartsheet. Thanh trình đơn thứ nhất, có tên là Worksheet Menu Bar, được hiển thị khi sheet
được chọn là Worksheet hoặc khi đã đóng tất cả các Workbook. Đây là thanh trình đơn mặc
định của Excel. Thanh trình đơn thứ hai, có tên là Chart Menu Bar, được hiển thị khi sheet
được chọn là Chart sheet hoặc người dùng đang chọ
n một đối tượng Chart nhúng trong
Worksheet.
Hình IV-20: Thanh trình đơn trong Excel.
8.4.1. Cấu trúc của hệ thống thanh trình đơn
Cấu trúc của hệ thống thanh trình đơn trong Excel có thể được thể hiện thông qua sơ đồ hình
cây như sau:
Ø
Ø
L
L
Ậ
Ậ
P
P
T
T
R
R
Ì
Ì
N
N
H
H
T
T
R
R
Ê
Ê
N
N
175
Ø
Ø
Menu Item: là một thành phần của Menu xuất hiện khi người dùng kích chuột vào menu.
Mỗi Menu Item sẽ thực hiện một tác vụ trong chương trình khi người dùng kích chuột lên
Menu Item đó.
Ø
Ø
Ngoài ra, trong hệ thống menu của Excel còn có khái niệm Separator Bar, là một đường
gạch ngang phân cách giữa các Menu Item dùng để nhóm các Menu Item có liên quan
với một mục tiêu nào đó.
Các Menu có thể lồng vào nhau theo nhiều cấp khác nhau. Một Menu cũng có thể là MenuItem
nằm trong một Menu khác. Chẳng hạn như Menu View củ
a Excel có MenuItem tên là
Toolbars, và đến lượt mình, Toolbars cũng chính là một Menu, có chứa các MenuItem khác
như: Standard, Formatting,…
Hình sau sẽ minh hoạ rõ hơn về cấu trúc của hệ thống trình đơn trong Excel.
Hình IV-21: Hệ thống thanh trình đơn
8.4.2. Tạo trình đơn tuỳ biến
Người lập trình có thể dễ dàng thêm và hiệu chỉnh hệ thống trình đơn trong Excel thông qua
các đoạn mã lệnh bằng VBA theo các bước sau:
1. Phác thảo trình đơn cần tạo và các chức năng tương ứng.
2. Viết mã lệnh cho từng MenuItem. Mỗi đoạn mã lệnh này được chứa trong một chương
được xoá đi khi thoát khỏi chương trình. Giá trị mặc định của tham số này là
False.
Kiểu giá trị trả về của phương thức Add là đối tượng kiểu CommandBarControl, hoặc có thể là
một trong các kiểu dữ liệu sau, tuỳ thuộc vào giá trị của tham số Type:
Ø
Ø
Nếu Type= msoControlPopup: kiểu giá trị trả về là CommandBarPopup.
Ø
Ø
Nếu Type= msoControlButton: kiểu giá trị trả về là CommandBarButton.
Phương thức Add chỉ tạo các đối tượng trống trên hệ thống thanh trình đơn. Vì vậy, người lập
trình cần phải gán thêm các thuộc tính khác cho những đối tượng mới này.
Dưới đây là danh sách các thuộc tính của đối tượng kiểu CommandBarControl:
Thuộc tích Mô tả
BeginGroup Nếu gán bằng TRUE, phía trước điều khiển sẽ xuất hiện Separator Bar để ngăn
cách các nhóm trình đơn.
BuiltIn Đây là thuộc tích chỉ đọc. Trả về giá trị TRUE nếu điều khiển này là điều khiển đã
được xây dựng sẵn trong Excel.
Caption Chuỗi văn bản sẽ được hiển thị trên trình đơn.
Enabled Nếu bằng TRUE, người dùng có thể kích chuột lên đối tượng. Nếu bằng FALSE,
người dùng sẽ không thể kích chuột, và điều khiển sẽ có màu xám.
FaceID Số nguyên thể hiện cho hình ảnh sẽ được hiển thị bên cạnh đoạn văn bản được
hiển thị trên thanh trình đơn.
Id Đây là thuộc tính chỉ đọc. Là mã số xác định các trình đơn đã được định nghĩa
trước trong Excel.
OnAction (Chỉ áp dụng với CommandBarButton) Tên của thủ tục VBA sẽ được thực thi khi
người dùng kích chuột vào MenuItem.
ShortcutText (Chỉ áp dụng với CommandBarButton) Đoạn văn bản hiển thị phần phím tắt cho
T
T
R
R
Ì
Ì
N
N
H
H
T
T
R
R
Ê
Ê
N
N
M
M
I
I
C
C
R
ToolTipText Đoạn văn bản sẽ hiển thị khi người dùng trỏ chuột ngay phía trên điều khiển.
Type Đây là thuộc tính chỉ đọc. Số nguyên xác định kiểu của điều khiển
Thông thường, sau khi tạo mới Menu và MenuItem cần gán các thuộc tính sau:
Ø
Ø
Caption
Ø
Ø
OnAction
Ø
Ø
FaceID
Dưới đây là một ví dụ minh hoạ các bước tạo mới một Menu trong thanh trình đơn “Worksheet
Menu Bar”
Vídụ:TạoMenumới
1. Phác thảo cấu trúc của Menu như sau:
2. Viết mã lệnh cho từng MenuItem
‘MÃ LỆNH CHO MENUITEM2: TINH TONG
Sub Macro1()
MsgBox "Ban da chon MenuItem: Tinh Tong"
End Sub
‘MÃ LỆNH CHO MENUITEM3: TINH TICH
Sub Macro2()
MsgBox "Ban da chon MenuItem: Tinh Tich"