Thông tin tài liệu:
Khi bạn tạo một ứng dụng trong excel, để cung cấp việc dễ dàng thao tác cho người dùng bạn phải tạo một menu riêng. Tôi xin giới thiệu cùng các bạn một cách để tạo menu riêng này. Một menu bao gồm menu cấp 1 (Menu), menu cấp hai (Menu Item), menu cấp ba (Sub Menu Item). Hình 1 dưới đây thể hiện các cấp menu mà tôi vừa nêu trên.
Nội dung trích xuất từ tài liệu:
TẠO MENU NGƯỜI DÙNG TRONG EXCEL TẠO MENU NGƯỜI DÙNG TRONG EXCEL (Dành cho người đã biết căn bản Visual Basic For Application)Khi bạn tạo một ứng dụng trong excel, để cung cấp việc dễ dàng thao tác chongười dùng bạn phải tạo một menu riêng. Tôi xin giới thiệu cùng các bạn một cáchđể tạo menu riêng này.Một menu bao gồm menu cấp 1 (Menu), menu cấp hai (Menu Item), menu cấp ba(Sub Menu Item). Hình 1 dưới đây thể hiện các cấp menu mà tôi vừa nêu trên.Cách giải quyết là menu này được gọi khi một tập tin excel này được mở ra vàmenu này được gở bỏ khi tập tin excel này được đóng lại.Để cho việc tạo menu này được linh động, tức là bạn có thể thêm bớt, chỉnh sửa dễdàng thì tôi tạo một bảng dữ liệu nằm trên một sheet làm nguồn cho thủ tục tôi viếtđể tạo ra menu. Bảng dữ liệu của tôi gồm có 5 cột (Column) đại diện cho 5 trường(field). Các trường cụ thể đó là: Cấp menu (level) như tôi đã giải thích ở trên; Đầuđề (caption) của cấp menu. Các bạn chú ý ở đây ký tự & đứng trước ký tự nàotrong đầu đề thì ký tự đó sẽ được gạch dưới (phím nóng); Vị trí hay tên macro cầnthực hiện (position/macro) vị trí đối với menu cấp một, tên macro cần thực hiệnđối với menu cấp hai hay cấp ba. Lằn ngăn cách (divider), nếu bạn cho bằng truethì trước menu đó sẽ có lằn ngăn cách giống như hình trên. FaceID số nguyên đạidiện cho hình biểu diễn của menu đó. Để biết được số nguyên nào đại diện chohình gì bạn có thể download và dùng tập tin add-in faceids.xla.Các dữ liệu trong ví dụ tôi được thể hiện ở hình 2 sau:Sau đây là các thủ tục để tạo và xoá menu (bạn nên cho vào module). Bạn chú ýtên sheet chứa dữ liệu để tạo menu của bạn có tên là Menusheet.Code:Sub CreateMenu() Thủ tục này thực hiện khi workbook được mởDim MenuSheet As WorksheetDim MenuObject As CommandBarPopupDim MenuItem As ObjectDim SubMenuItem As CommandBarButtonDim Row As IntegerDim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId Chỉ ra Sheet chứa dữ liệu cho menuSet MenuSheet = ThisWorkbook.Sheets(MenuSheet) Nhằm chắc chắn Menu không bị trùngCall DeleteMenu Khởi tạo giá trị của hàng đầu tiênRow = 2 Thêm vào menu, menu items và submenu items sử dụng dữ liệu được lưu trong MenuSheetDo Until IsEmpty(MenuSheet.Cells(Row, 1))With MenuSheetMenuLevel = .Cells(Row, 1)Caption = .Cells(Row, 2)PositionOrMacro = .Cells(Row, 3)Divider = .Cells(Row, 4)FaceId = .Cells(Row, 5)NextLevel = .Cells(Row + 1, 1)End WithSelect Case MenuLevelCase 1 Menu Đưa Menu ở mức cao nhất vào Worksheet CommandBarSet MenuObject = Application.CommandBars(1).Controls.Add(Type:=msoControlPopup, ?Before:=PositionOrMacro,Temporary:=True)MenuObject.Caption = CaptionCase 2 Menu ItemIf NextLevel = 3 ThenSet MenuItem = MenuObject.Controls.Add(Type:=msoControlPopup)ElseSet MenuItem = MenuObject.Controls.Add(Type:=msoControlButton)MenuItem.OnAction = PositionOrMacroEnd IfMenuItem.Caption = CaptionIf FaceId Then MenuItem.FaceId = FaceIdIf Divider Then MenuItem.BeginGroup = TrueCase 3 SubMenu ItemSet SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)SubMenuItem.Caption = CaptionSubMenuItem.OnAction = PositionOrMacroIf FaceId Then SubMenuItem.FaceId = FaceIdIf Divider Then SubMenuItem.BeginGroup = TrueEnd SelectRow = Row + 1LoopEnd SubSub DeleteMenu() Thủ tục này sẽ thực hiện khi workbook dược đóng lại Xóa MenuDim MenuSheet As WorksheetDim Row As IntegerDim Caption As StringOn Error Resume NextSet MenuSheet = ThisWorkbook.Sheets(MenuSheet)Row = 2Do Until IsEmpty(MenuSheet.Cells(Row, 1))If MenuSheet.Cells(Row, 1) = 1 ThenCaption = MenuSheet.Cells(Row, 2)Application.CommandBars(1).Controls(Caption).Delet eEnd IfRow = Row + 1LoopOn Error GoTo 0End SubSub DummyMacro() Đây chỉ là thủ tục để thử mà thôiMsgBox Thu tuc nay khong lam gi ca!End SubĐể tạo và xoá menu bạn gọi các thủ tục trên khi sự kiện Open và BeforeClose xãyra.Private Sub Workbook_Open()Call CreateMenuMsgBox A new menu (MyMenu) was created., vbInformationEnd SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean)Call DeleteMenuEnd Sub ...