Lập trình với menus và toolbars (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,442
Nghề nghiệp
Bác sĩ
Menu Pop-Up

Mục đích: Tạo menu popup khi người dùng Right-Click khi chuột trong vùng làm việc của một worksheet.

Giả sử workbook của tôi có một worksheet, thì trong ví dụ của tôi có hai đoạn mã. Đoạn thứ nhất nằm trong Module VBA: PopupMenu và đoạn mã thứ hai nằm trong module worksheet: workhere

Đây là đoạn mã trong module VBA PopupMenu:
Mã:
Option Explicit 
Public Const gc_Title = "PopUp Menu Demo" 
Public gcBar_RgtClkMenu As CommandBar 
' ************************************************** *************************
' Muc dich: Gọi hàm tạo popup menu người dùng
'
Sub RunMeToGetThingsGoing() 
Set gcBar_RgtClkMenu = CreateSubMenu 
End Sub 
' ************************************************** *************************
' Hàm tạo popup menu
'
Function CreateSubMenu() As CommandBar 
'đặt tên cho popup menu
Const lcon_PuName = "PopUpDemo" 
'Tạo các đối tượng cho cho popup menu
Dim cb As CommandBar 
Dim cbc As CommandBarControl 
'Chắc chắn rằng popup menu không tồn tại
DeleteCommandBar lcon_PuName 
'Thêm popup menu người dùng cho tập họp (collection) CommandBars
Set cb = CommandBars.Add(Name:=lcon_PuName, Position:=msoBarPopup, MenuBar:=False, Temporary:=False) 
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Thêm vào controls
Set cbc = cb.Controls.Add 
With cbc 
.Caption = "&Control 1" 
.OnAction = "DummyMessage" 
End With 
Set cbc = cb.Controls.Add 
With cbc 
.Caption = "Control &2" 
.OnAction = "DummyMessage" 
End With 
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Set CreateSubMenu = cb 
End Function 
' ************************************************** *************************
' Mục đích: Kiểm tra nếu command bar có tên menuName?
' Nếu tồn tại thì xóa đi
'
Sub DeleteCommandBar(menuName) 
Dim mb 
For Each mb In CommandBars 
If mb.Name = menuName Then 
CommandBars(menuName).Delete 
End If 
Next 
End Sub 
Sub DummyMessage() 
MsgBox "Hello", vbInformation + vbOKOnly, gc_Title 
End Sub
Đây là đoạn mã trong worksheet module: workhere
Option Explicit 
' ************************************************** *************************
' Muc đích : Nó sẽ được kích họat khi người dùng Right click
' ************************************************** *************************

Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean) 
On Error GoTo Worksheet_BeforeRightClick_Error 
'Hiện popup menu người dùng
gcBar_RgtClkMenu.ShowPopup 
Worksheet_BeforeRightClick_Resume: 
'Nhằm ngăn chặn popup menu mặc định của Excel
Cancel = True 
'Thoát khỏi thủ tục
Exit Sub 
Worksheet_BeforeRightClick_Error: 
'Nếu macro khởi tạo chưa chạy
'Hỏi người dùng có muốn chạy bây giờ không?
If vbYes = MsgBox("You need to run the macro " _
& "RunMeToGetThingsGoing" _
& " before this demo will work" & vbCrLf _
& vbCrLf & "Run it now?", vbQuestion + vbYesNo, gc_Title) Then 
'Nếu người dùng click "Yes", thì chạy
RunMeToGetThingsGoing 
MsgBox "Bây giờ thử lại", vbInformation + vbOKOnly, gc_Title 
End If 
''Thoát
Resume Worksheet_BeforeRightClick_Resume 
End Sub
Lần đầu khi bạn Right Click thì bạn sẽ nhận được thông báo sau:
Sau đó nếu bạn chọn Yes thì bạn sẽ nhận được thông báo sau:
Cuối cùng bạn thử Right Click lại thì bạn sẽ nhận được popup menu sau:
Chúc các bạn thành công. Hy vọng bài viết trên sẽ giúp ích các bạn phần nào.
Mọi góp ý của các bạn xin gởi cho tôi theo địa chỉ email sau:
levanduyet@yahoo.com
 
Chỉnh sửa lần cuối bởi điều hành viên:
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 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.


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ào trong đầu đề thì ký tự đó sẽ được gạch dưới (phím nóng); Vị trí hay tên macro cần thự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 true thì trước menu đó sẽ có lằn ngăn cách giống như hình trên. FaceID số nguyên đại diện cho hình biểu diễn của menu đó. Để biết được số nguyên nào đại diện cho hì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.
Mã:
Sub CreateMenu() 
' Thủ tục này thực hiện khi workbook được mở
Dim MenuSheet As Worksheet 
Dim MenuObject As CommandBarPopup 
Dim MenuItem As Object 
Dim SubMenuItem As CommandBarButton 
Dim Row As Integer 
Dim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId 

'''''''''''''''''''''''''''''''''''''''''''''''''' ''
' Chỉ ra Sheet chứa dữ liệu cho menu
Set MenuSheet = ThisWorkbook.Sheets("MenuSheet") 
'''''''''''''''''''''''''''''''''''''''''''''''''' ''

' Nhằm chắc chắn Menu không bị trùng
Call DeleteMenu 
' Khởi tạo giá trị của hàng đầu tiên
Row = 2 

' Thêm vào menu, menu items và submenu items sử dụng
' dữ liệu được lưu trong MenuSheet
Do Until IsEmpty(MenuSheet.Cells(Row, 1)) 
With MenuSheet 
MenuLevel = .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 With 
Select Case MenuLevel 
Case 1 ' Menu
' Đưa Menu ở mức cao nhất vào Worksheet CommandBar
Set MenuObject = Application.CommandBars(1). Controls.Add(Type:=msoControlPopup, ?Before:=PositionOrMacro, Temporary:=True) 
MenuObject.Caption = Caption 
Case 2 ' Menu Item
If NextLevel = 3 Then 
Set MenuItem = MenuObject.Controls.Add(Type:=msoControlPopup) 
Else 
Set MenuItem = MenuObject.Controls.Add(Type:=msoControlButton) 
MenuItem.OnAction = PositionOrMacro 
End If 
MenuItem.Caption = Caption 
If FaceId <> "" Then MenuItem.FaceId = FaceId 
If Divider Then MenuItem.BeginGroup = True 
Case 3 ' SubMenu Item
Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton) 
SubMenuItem.Caption = Caption 
SubMenuItem.OnAction = PositionOrMacro 
If FaceId <> "" Then SubMenuItem.FaceId = FaceId 
If Divider Then SubMenuItem.BeginGroup = True 
End Select 
Row = Row + 1 
Loop 
End Sub 

Sub DeleteMenu() 
' Thủ tục này sẽ thực hiện khi workbook dược đóng lại
' Xóa Menu
Dim MenuSheet As Worksheet 
Dim Row As Integer 
Dim Caption As String 
On Error Resume Next 
Set MenuSheet = ThisWorkbook.Sheets("MenuSheet") 
Row = 2 
Do Until IsEmpty(MenuSheet.Cells(Row, 1)) 
If MenuSheet.Cells(Row, 1) = 1 Then 
Caption = MenuSheet.Cells(Row, 2) 
Application.CommandBars(1).Controls(Caption).Delet e 
End If 
Row = Row + 1 
Loop 
On Error GoTo 0 
End Sub 
Sub DummyMacro() 'Đây chỉ là thủ tục để thử mà thôi
MsgBox "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ãy ra. 
Private Sub Workbook_Open() 
Call CreateMenu 
MsgBox "A new menu (MyMenu) was created.", vbInformation 
End Sub 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Call DeleteMenu 
End Sub
Lược dịch từ internet.

Lê Văn Duyệt

Chúc các bạn thành công. Hy vọng bài viết trên sẽ giúp ích các bạn phần nào.

Mọi góp ý của các bạn xin gởi cho tôi theo địa chỉ email sau:

levanduyet@yahoo.com
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cách thực hiện tạo Menu


1/ Các bạn hãy Insert vào File của mình một Sheet mới và đặt tên là MenuSheet.
- Cột Level nói về cấp độ của menu (sô 1 là cấp cao nhất sẽ thể hiện trên thanh Toolbar, số 2 là cấp độ menu con của 1, và số 3 thể hiện các menu con của cấp 2)
- Cột Caption là tên của các Menu mà bạn muốn đặt
- Cột Position/Macro là tên các Macro dành cho Menu của các bạn
- Cột Divider : nếu bạn nhập chữ TRUE sẽ có lằn phân cách giữa các Menu
- Cột FaceID : Nếu bạn nhập hàm ngẫu nhiên, sẽ có những hình minh hoạ, với các hình Face ID được cài trong máy của bạn, nếu bạn để trống thì trên thanh Menu của bạn sẽ không có hình.

2/Các bạn vào của sổ VBE, (nhấn Alt+F11), bạn Insert 3 Module, và bạn lần lượt Copy Source Code của MenuModule và Menu Tìm Sheet vào, (Code của Tìm Sheet hầu như không cần sửa chỗ nào cả, còn MenuModule, bạn sửa giùm tôi hàng thứ 3 : "Tao Menu.xls" bằng tên File của các bạn
Public Const TenWB As String = "Tao Menu.xls"
Module MoSoSach, tôi giời thiệu với các bạn những câu lệnh đơn giản nhất cho các Macro mở những Sheet có trong Workbook của các bạn. Câu lệnh đó như sau :

Td : dùng để mở Sheet NKC (Nhật ký chung). MoNKC là tên của Macro có trong cột Macro của MenuSheet
Sub MoNKC()
Sheets("NKC").Select
End Sub

3/Cuối cùng , cũng trong cửa sổ VBE, bạn Double Click vào This Workbook của File Tao Menu và Copy Source vào File của các bạn. Lưu File lại và bạn sẽ thấy các Menu của các bạn hoạt động thế nào.
Tôi đã giới thiệu với các bạn File Tìm Sheet mấy hôm trước, lần này tôi giới thiệu lại và hướng dẫn các bạn gắn nó vào Menu của các bạn. Các bạn có thể RightClick, bạn cũng thấy Menu của mình trong ấy. Menu này sẽ được xóa bỏ khi bạn đóng File, và tự động hiện ra khi bạn mở File.

Chúc các bạn thành công
 
Upvote 0
Cách tạo menu trong Excel

Tôi tạo menu từ đời Excel 95 và dùng phương pháp này vẫn ổn định. Cách khai báo code như sau:

MenuBars(xlWorksheet).Menus.Add Caption:="Thong &ke", before:=8
MenuBars(xlWorksheet).Menus("Thong &ke").MenuItems.Add Caption:="&Vao thong so", before:=1, OnAction:="Congtrinh"
MenuBars(xlWorksheet).Menus("Thong &ke").MenuItems.Add Caption:="X&u ly TK", before:=2, OnAction:="Loaisaisotho"


Trong menu chính của Excel, tôi tạo ra (Add) 1 menu mới có tên là "Thong ke" (Caption), vị trí trước thứ 8 trong dãy (before:=8).

Trong menu chính tôi tạo ra menu con (MenuItem) lần lượt là "Vào thông số", "Xu ly TK",... Các MenuItem được gán chương trình con có tên lần lượt là Congtrinh, Loaisaisotho,... (OnAction:=).

Sub Congtrinh()
.....
End Sub


Kết quả

menu1.jpg



Em thấy bác Duyệt có nhiều cách tạo menu, Bác giới thiệu cho mọi người học nhé! :-=
 
Lần chỉnh sửa cuối:
Upvote 0
Tạo Menu

PhanTuHuong đã viết:
Em thấy bác Duyệt có nhiều cách tạo menu, Bác giới thiệu cho mọi người học nhé! :-=
To: PhanTuHuong,
Thực sự ra có nhiều cách tạo menu. Tôi cũng đã cố gắng viết một module để trợ giúp cho việc tạo menu một cách đơn giản. Chị HanDung đã upload lên rồi mà?!
Thân,

LVD
PS: khi nào vào vậy?
 
Upvote 0
Các bạn đã biết cách tạo Popup menu của bác Duyệt. Tôi xin giới thiệu thêm 1 cách tạo nữa, nhìn chung là đơn giản và ngắn gọn(sưu tầm). Chắc chắn nhiều bạn sẽ ngạc nhiên vì code ngắn gọn, dễ hiểu.
Các bạn tải file kèm theo. Chú ý là tôi đã đặt biến cố chỉ ở Sheet1 thôi, tùy công việc mà các bạn có thể đặt khác đi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cái của anh duyệt đưa ra cũng hay. Em thường hay sử dụng cái đó. Code của anh hình như cũng có đưa lên rồi nhưng mà chưa thử. Để em mở xem thế nào?
 
Upvote 0
Các bạn lưu ý khi sử dụng menu popup các phiên bản excel trước 2003. Khi tạo menu popup theo cách của bác Duyệt hay như ở trên thì excel sẽ báo lỗi Invalid procedure call or argument (Run-time error '5'). Nguyên nhân là do phiên bản trước chưa có. Vì vậy bạn vào cửa sổ Microsoft Visual Basic, vào Tools/References. Khi cửa sổ References hiện ra, bạn tìm và đánh dấu mục Microsoft Office 11.0 Object Library (trong Available References).

Cám ơn bác Duyệt đã chỉ dẫn!
 
Upvote 0
Tổng hợp

Tôi xin tổng hợp thành một Module cho các bạn tiện sử dụng

Mã:
Public Const TenMenuSheet = "Menu"
'   Ten sheet chua du lieu de tao Menu
Public Const ToolBarMenuName = "Production department"
'   Ten cua ToolBar Menu
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   TAO VA DELETE MENU
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' nham tao 3 loai menu dua tren du lieu o Sheet Menu
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub CreateMenuAll(Optional CreateMenuBar As Boolean, _
                  Optional CreateShortcutMenu As Boolean, _
                  Optional CreateToolBarMenu As Boolean)
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateMenuBar
    Dim MenuSheet As Worksheet
    Dim MenuObject As CommandBarPopup
    Dim MenuItem As Object
    Dim SubMenuItem As CommandBarButton
    Dim Row As Integer
    Dim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateShortcutMenu
    Dim MenuSCControl As CommandBarControl
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateShortcutMenu
    Dim ToolBarMenu As CommandBar
    Dim ToolbarMenuControl As CommandBarControl
''''''''''''''''''''''''''''''''''''''''''''''''''
' Kiem tra ActiveWorkbook truoc khi thuc hien
    If ActiveWorkbook.Name <> TenWB Then
        Exit Sub
    End If
'   Assign default value if the argument is missing
'   Dua cac gia tri mac dinh vao neu cac doi so khong dua vao
    If IsMissing(CreateMenuBar) Then CreateMenuBar = False
    If IsMissing(CreateShortcutMenu) Then CreateShortcutMenu = False
    If IsMissing(CreateToolBarMenu) Then CreateToolBarMenu = False
'   Trong truong hop CreateMenuBar=True
If CreateMenuBar = True Then
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Location for menu data
'   Chi dinh Sheet de lay du lieu cho Menu
    Set MenuSheet = ThisWorkbook.Sheets(MenuSheet)
''''''''''''''''''''''''''''''''''''''''''''''''''

'   Make sure the menus aren't duplicated
'   De chac chan rang Menu khong bi trung lap
    Call DeleteMenuAll(True, False, False)
    
'   Initialize the row counter; Hang bat dau la hang thu 2
    Row = 2

'   Add the menus, menu items and submenu items using
'   data stored on MenuSheet
'   Dua vao du lieu tren MenuSheet ma xay dung Menu
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        With MenuSheet
            MenuLevel = .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 With
        
        Select Case MenuLevel
            Case 1 ' A Menu
'               Add the top-level menu to the Worksheet CommandBar
'               Menu cap mot
                Set MenuObject = Application.CommandBars(1). _
                    Controls.Add(Type:=msoControlPopup, _
                    Before:=PositionOrMacro, _
                    Temporary:=True)
                MenuObject.Caption = Caption
            
            Case 2 ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = MenuObject.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = MenuObject.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = PositionOrMacro
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True
            
            Case 3 ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = PositionOrMacro
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
        End Select
        Row = Row + 1
    Loop
End If
'   Trong truong hop CreateShortcutMenu=True
If CreateShortcutMenu = True Then
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Location for shortcutmenu data
'   Chi dinh Sheet de lay du lieu cho ShortcutMenu
    Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Make sure the shortcut menus aren't duplicated
'   De chac chan rang Shortcut Menu khong bi trung lap
    Call DeleteMenuAll(False, True, False)
    
'   Initialize the row counter; Hang bat dau la hang thu 2
    Row = 2

'   Add the shortcut menus, shortcutmenu items
'   and subshortcutmenu items using
'   data stored on MenuSheet
'   Dua vao du lieu tren MenuSheet ma xay dung Menu
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        With MenuSheet
            MenuLevel = .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 With
        
        Select Case MenuLevel
            Case 1 ' A Menu
'               Add the top-level shortcut menu to the Cell CommandBar
'               Menu cap mot
                Set MenuSCControl = Application.CommandBars("Cell"). _
                    Controls.Add(Type:=msoControlPopup)
                    MenuSCControl.Caption = Caption
            
            Case 2 ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = MenuSCControl.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = MenuSCControl.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = PositionOrMacro
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True
            
            Case 3 ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = PositionOrMacro
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
        End Select
        Row = Row + 1
    Loop
End If
If CreateToolBarMenu = True Then
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Location for menu data
'   Chi dinh Sheet de lay du lieu cho Menu
    Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Make sure the Toolbar menus aren't duplicated
'   De chac chan rang Toolbar Menu khong bi trung lap
   Call DeleteMenuAll(False, False, True)

'   Create Toolbar
    Set ToolBarMenu = Application.CommandBars.Add
    With ToolBarMenu
        .Visible = False
        .Name = ToolBarMenuName
        .Position = msoBarTop
        .Protection = msoBarNoCustomize
    End With

'   Initialize the row counter; Hang bat dau la hang thu 2
    Row = 2

'   Add the Toolbar menus, Toolbar menu items and submenu items using
'   data stored on MenuSheet
'   Dua vao du lieu tren MenuSheet ma xay dung Menu
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        With MenuSheet
            MenuLevel = .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 With
        
        Select Case MenuLevel
            Case 1 ' A Menu
'               Add the top-level shortcut menu to the Cell CommandBar
'               Menu cap mot
                Set ToolbarMenuControl = Application.CommandBars(ToolBarMenuName). _
                    Controls.Add(Type:=msoControlPopup)
                    ToolbarMenuControl.Caption = Caption
            
            Case 2 ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = ToolbarMenuControl.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = ToolbarMenuControl.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = PositionOrMacro
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True
            
            Case 3 ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = PositionOrMacro
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
        End Select
        Row = Row + 1
    Loop
    ToolBarMenu.Visible = True
End If

End Sub
 
Upvote 0
Tổng hợp I

Phần tiếp theo
Mã:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   Thu tuc nay nham xoa cac loai Menu
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub DeleteMenuAll(Optional DeleteMenuBar As Boolean, _
                  Optional DeleteShortcutMenu As Boolean, _
                  Optional DeleteToolBarMenu As Boolean)
'   Thu tuc nay nen duoc thuc hien khi Workbook duoc dong
'   This sub should be executed when the workbook is closed
'   Deletes the Menus
''''''''''''''''''''''''''''''''''''''''''''''''''
'   Khai bao bien cho CreateMenuBar
    Dim MenuSheet As Worksheet
    Dim CB As CommandBar
    Dim Row As Integer
    Dim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId
''''''''''''''''''''''''''''''''''''''''''''''''''
' Kiem tra ActiveWorkbook truoc khi thuc hien
    If ActiveWorkbook.Name <> TenWB Then
        Exit Sub
    End If
'   Assign default value if the argument is missing
'   Dua cac gia tri mac dinh vao neu cac doi so khong dua vao
    If IsMissing(DeleteMenuBar) Then DeleteMenuBar = False
    If IsMissing(DeleteShortcutMenu) Then DeleteShortcutMenu = False
    If IsMissing(DeleteToolBarMenu) Then DeleteToolBarMenu = False
'   Delete Menu
If DeleteMenuBar = True Then
    On Error Resume Next
    Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
    Row = 2
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        If MenuSheet.Cells(Row, 1) = 1 Then
            Caption = MenuSheet.Cells(Row, 2)
            Application.CommandBars(1).Controls(Caption).Delete
        End If
        Row = Row + 1
    Loop
    On Error GoTo 0
End If
'   Delete Shortcut Menu
If DeleteShortcutMenu = True Then
    On Error Resume Next
    Set MenuSheet = ThisWorkbook.Sheets(TenMenuSheet)
    Row = 2
    Do Until IsEmpty(MenuSheet.Cells(Row, 1))
        If MenuSheet.Cells(Row, 1) = 1 Then
            Caption = MenuSheet.Cells(Row, 2)
            Application.CommandBars("Cell").Controls(Caption).Delete
        End If
        Row = Row + 1
    Loop
On Error GoTo 0
End If
'   Delete ToolbarMenu
If DeleteToolBarMenu = True Then
    On Error Resume Next
    For Each CB In CommandBars
        If mb.Name = ToolBarMenuName Then
            CommandBars(ToolBarMenuName).Delete
        End If
    Next
On Error GoTo 0
End If
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
Sub ResetMenuAll(Optional ResetMenuBar As Boolean, _
                  Optional ResetShortcutMenu As Boolean, _
                  Optional ResetToolBarMenu As Boolean)

If IsMissing(ResetMenuBar) Then ResetMenuBar = False
If IsMissing(ResetShortcutMenu) Then ResetShortcutMenu = False
If IsMissing(ResetToolBarMenu) Then ResetToolBarMenu = False
'Reset MenuBar, ShortcutMenu, ToolBarMenu
If ResetMenuBar = True Then Application.CommandBars(1).Reset
If ResetShortcutMenu = True Then Application.CommandBars("Cell").Reset
If ResetToolBarMenu = True Then Application.CommandBars(ToolBarMenuName).Delete

End Sub
Như vậy các bạn chỉ cần chú ý gọi các hàm khi cần thiết.
Ví dụ như để tạo menu khi mở workbook ra các bạn phải đưa thủ tục vào sự kiện khi workbook mở...
Chúc các bạn thành công.

Lê Văn Duyệt
 
Upvote 0
Thêm vào .FaceId = 59 thử xem, và .BeginGroup = "true" nữa bạn sẽ thấy đẹp menu mình Pro hơn ngay :)

Mã:
Sub taoitem()
Dim NewToolbar As CommandBar
Dim NewButton As CommandBarButton
Dim i As Integer, IDStart As Integer, IDStop As Integer
On Error Resume Next
Application.CommandBars("FaceIds").Delete
On Error GoTo 0
 
Set NewToolbar = Application.CommandBars.Add _
(Name:="FaceIds", temporary:=True)
 
 
IDStart = 59
IDStop = 59
'
 
'
For i = IDStart To IDStop
Set NewButton = NewToolbar.Controls.Add _
(Type:=msoControlButton, ID:=2950)
NewButton.FaceId = i
NewButton.Caption = "Trade Finance Panel"
NewButton.OnAction = "openct"
Next i
NewToolbar.Width = 600
Application.CommandBars("FaceIds").Controls(1).Move Bar:=Application.CommandBars( _
"Standard"), before:=8 'vi tri thu 22 tren tool
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''

Mã:
Sub XoaItem()
 
CommandBars("Standard").Controls("Trade Finance Panel").Delete
End Sub
'''''''''''''''''''''''''''''
Thêm cái này nữa nè
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình cũng có 1 menu viết cách đây 4 năm rồi nhìn cũng khá Pro :), bạn nào cần mail cho mình mình gửi source cho, trên này mình ko biết attach file chỗ nào hehe :)
 
Upvote 0
Sub statusbar4()
Dim bln As Boolean
bln = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.statusbar = " La Chi Nhan - P.Tai tro Thuong mai"
Application.DisplayStatusBar = bln
End Sub

các bạn chạy thử xem
 
Upvote 0
Mấy cái menu của các bác hay lắm
Các bác có thể viết cho em một đoạn code để vô hiệu hoá tất cả các menu trong excel không?
Trước kia em đã làm trong access chứ trong excel thì bó tay!
Cảm ơn các bác nhé
 
Upvote 0
ruadangyeu đã viết:
Mấy cái menu của các bác hay lắm
Các bác có thể viết cho em một đoạn code để vô hiệu hoá tất cả các menu trong excel không?
Trước kia em đã làm trong access chứ trong excel thì bó tay!
Cảm ơn các bác nhé

Mã:
Sub EnableMenu()
  AllMenu True
End Sub
Sub DisableMenu()
  AllMenu False
End Sub

Sub AllMenu(ByVal bEnable As Boolean)
On Error Resume Next

Dim oBar As CommandBar
Dim oCnt As CommandBarControl

For Each oBar In CommandBars
  For Each oCnt In oBar.Controls
    oCnt.Enabled = bEnable
  Next
Next

Set oCnt = Nothing
Set oBar = Nothing

End Sub
 
Upvote 0
Cảm ơn bác Tuan

Cảm ơn bác Tuấn nhé
Em đã thử rồi code của bác chạy bon lắm
Nhưng em muốn không những ta vô hiệu hoá nó mà còn ẩn luôn nó đi cơ (invisible) bác chỉ bảo thêm cho em mở rộng tầm mắt cái

Em đã cho code của bác Tuan vao excel bác nào thích down về test thử
 

File đính kèm

Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom