M ở workbook
5. Viết mã lệnh cho các sự kiện tương ứng của các điều khiển (nếu cần) Các thủ tục này phải được đặt trong mô-đun của chính UserForm đó.
được đặt trong mô-đun của chính UserForm đó.
Sau khi thực hiện xong các bước trên, mỗi khi cần hiển thị hộp thoại tuỳ biến, chỉ cần thực thi thủ tục đã tạo ở bước 2.
8.3.1.Tạo mới UserForm
Để tạo mới UserForm, khởi động VBAIDE (nhấn phím ALT+F11), chọn dự án ứng với workbook cần thêm Userform, sau đó chọn trình đơn InsertÖUserForm. Các UserForm sẽ được tự động đặt tên UserForm1, UserForm2,... Người lập trình có thể thay đổi tên của UserForm để dễ dàng nhận dạng UserForm thông qua cửa sổ Properties (chọn UserForm và nhấn phím F4 để hiển thị cửa sổ Properties).
Mỗ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
Để hiển thị UserForm, sử dụng phương thức Show của đối tượng UserForm. Phương thức này có cú pháp như sau:
object.Show modal
Trong đó:
Ø
Øobject: là đối tượng kiểu UserForm;
Ø
Ømodal: là tham số tuỳ chọn, xác định kiểu hiển thị của UserForm. Modal có thể là một trong hai giá trị vbModal hoặc vbModeless. Nếu là vbModal, người dùng phải đóng UserForm mới có thể tiếp tục thao tác với Excel. Nếu là vbModeless, người dùng vẫn có thể vừa thao tác trên UserForm, vừa thao tác trên Excel. Mặc định là giá trị vbModal. Đoạn mã sau sẽ hiển thị UserForm có tên là UserForm1 ở chế độ Modal:
UserForm1.Show
Ngoài ra, còn có một kỹ thuật khác để hiển thị UserForm: sử dụng phương thức Add của tập đối tượng UserForm, sau đó sử dụng phương thức Show để hiển thị UserForm. Phương thức này thích hợp khi trong dự án có nhiều UserForm và người có thể chỉ định để hiện một UserForm bất kỳ. Đoạn mã sau sẽ hiển thị UserForm có tên là UserForm1:
MyForm = “UserForm1”
UserForms.Add(MyForm).Show
CHÚ Ý Thủ tục để hiển thị hộp thoại tuỳ biến (UserForm) phải được đặt trong một mô-đun
của VBA (chứ không phải đặt trong mô-đun của UserForm).
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, 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ớ).
Một khi đã được hiển thị, UserForm sẽ cứ hiện hữu như vậy trên màn hình cho đến khi người dùng đóng UserForm ấy. 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 một thủ tục đóng UserForm. Thủ tục này có thể sẽ sử dụng lệnh Unload để dỡ tải hoàn toàn UserForm, 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: 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ỡ tải hoàn toàn UserForm ra khỏi bộ nhớ, các thuộc tính của UserForm không thể truy cập được nữa.
8.3.3.Các điều khiển trên UserForm
Người lập trình có thể rất nhiều loại điều khiển khác nhau lên UserForm. Thông tin chi tiết, xem lại phần …(ANH ĐỘ). Dưới đây chỉ trình bày thêm một điều khiển riêng có trong Excel, điều khiển RefEdit.
Điều khiển RefEdit, , cho phép người dùng lựa chọn một vùng dữ liệu bằng cách nhập địa chỉ hoặc nhập tên vùng dữ liệu hoặc sử dụng chuột để chọn trực tiếp trong worksheet. Khi người dùng kích chuột vào biểu tượng nhỏ ở góc phải của điều khiển, hộp thoại sẽ tạm thời được ẩn đi và một cửa sổ nhỏ để người dùng chọn vùng dữ liệu sẽ được hiện lên, giống hệt như các hộp thoại mặc định của Excel.
Hình: Đ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:
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
Ø
ØĐừng bao giờ nghĩ rằng RefEdit luôn trả về địa chỉ đúng. Bởi lẽ không phải chỉ có mỗi cách chọn vùng dữ liệu bằng chuột, người dùng còn có thể gõ và hiệu chỉnh địa chỉ hiển thị trên điều khiển RefEdit.Vì vậy, phải luôn kiểm tra tính đúng đắn của địa chỉ vùng dữ liệu. Đoạn mã sau minh hoạ cách kiểm tra lỗi này. Nếu vùng dữ liệu nhập vào không đúng, một hộp thông báo sẽ hiện lên, và cho phép người dùng nhập lại:
On Error Resume Next
Set UserRange = Range(RefEdit1.Text) If Err <> 0 Then
MsgBox “Invalid range selected” RefEdit1.SetFocus
Exit Sub End If
Ø
ØNgười dùng có thể chọn một sheet khác trên thẻ chứa các sheet khi đang chọn vùng dữ liệu. Vì vậy, không nên giả sử rằng vùng dữ liệu được chọn sẽ nằm trên sheet hiện hành. Tuy nhiên, nếu người dùng chọn một sheet khác, địa chỉ của vùng dữ liệu sẽ được tự động thêm vào một tiền tố là tên của sheet được chọn. Chẳng hạn như: Sheet2!$A$1:$C$4
Ø
ØNếu chỉ cần lấy địa chỉ của một ô trong vùng dữ liệu mà người dùng đã chọn, người lập trình có thể chọn ra một ô ở góc trên bên trái của vùng dữ liệu đó bằng cách sử dụng đoạn mã lệnh như sau:
Set OneCell = Range(RefEdit1.Text).Range(“A1”)
GỢI Ý Để người dùng chọn một vùng dữ liệu nào đó, có thể sử dụng hộp thoại InputBox của Excel, xem thêm mục “Hộp thoại InputBox của Excel – Hàm InputBox” trang 68.
8.3.4.Ví dụ về một hộp thoại tuỳ biến
????????????
8.4. Thao tác trên thanh trình đơn
Hầu hết các chương trình trong hệ điều hành Windows đều có hệ thống thanh trình đơn. Thông qua thanh trình đơn, 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.
Đố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: 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:
Ø
ØMenu Bar: Là hàng chữ nằm ở trên cùng, ngay phía dưới thanh tiêu đề của ứng dụng Excel. Như đã đề cập, tuỳ vào từng ngữ cảnh mà thanh Menu Bar có thể là Worksheet Menu Bar hoặc Chart Menu Bar.
Ø
ØMenu: Là một thành phần trong hệ thống trình đơn của Excel, khi người dùng kích chuột vào một Menu thì một danh sách các MenuItem sẽ hiện ra.
Ø
Ø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ó tác dụng tương tự nhau.
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.
8.4.2.Tạo menu 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: