Mình hỏi về code VBA để tạo thêm mục trên thanh MenuBar (1 người xem)

Liên hệ QC

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

ptlong04x1

Thành viên tích cực
Tham gia
15/10/08
Bài viết
1,031
Được thích
1,531
Nghề nghiệp
Kỹ sư xây dựng
Mình viết đoạn code dưới đây để tạo thêm 1 mục trên thanh MenuBar, nhưng vẫn không hiện được caption của nó (ở đây là "123"). Mong các bạn giúp đỡ.Cảm ơn.

Private Sub Workbook_Open()

Dim Ten_Menu As CommandBarButton

Set Ten_Menu = Application.CommandBars("Worksheet Menu Bar").Controls.Add
With Ten_Menu
.Caption = "123"
.FaceId = 0
.BeginGroup = True
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Mình viết đoạn code dưới đây để tạo thêm 1 mục trên thanh MenuBar, nhưng vẫn không hiện được caption của nó (ở đây là "123"). Mong các bạn giúp đỡ.

Code của bạn thiếu một dòng xác định Style của commandbarbutton làm sao nó hiện chữ "123' lên được, bạn thêm dòng đó vào như sau:
PHP:
Public Sub myMenu()
Dim Ten_Menu As CommandBarButton
Set Ten_Menu = Application.CommandBars("Worksheet Menu Bar").Controls.Add
With Ten_Menu
.Caption = "123"
.FaceId = 0
.BeginGroup = True
.Style = msoButtonCaption      ''<=== Thêm dòng này vào nha!
End With
End Sub
 
Upvote 0
Ah, Ban cho hoi vay de xoa cai button tao tren Manu Bar thi lam sao?
 
Upvote 0
Ah, Ban cho hoi vay de xoa cai button tao tren Manu Bar thi lam sao?

Bạn dùng SUB này thử xem, trong đó "Ten_Tag" là do bạn truyền vào khi chạy SUB.

Ví dụ : bạn tạo Menu "GAME" với thuộc tính .Tag = "abc", thì khi xoá Menu này bạn phải truyền vào "Ten_Tag""abc"

PHP:
Sub Xoa_Menu_Tren_Thanh_Cong_Cu(Ten_Tag As String)
    
    On Error Resume Next
    Do
        Application.CommandBars.FindControl(, , Ten_Tag, False).Delete
    Loop Until Application.CommandBars.FindControl(, , Ten_Tag, False) Is Nothing
    On Error GoTo 0

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Các mem cho hỏi cái là sau khi tạo được menu custom rồi thì làm sao để điều khiển nó chạy theo đoạn code của mình được? Xin cảm ơn.
 
Upvote 0
Code của bạn thiếu một dòng xác định Style của commandbarbutton làm sao nó hiện chữ "123' lên được, bạn thêm dòng đó vào như sau:
PHP:
Public Sub myMenu()
Dim Ten_Menu As CommandBarButton
Set Ten_Menu = Application.CommandBars("Worksheet Menu Bar").Controls.Add
With Ten_Menu
.Caption = "123"
.FaceId = 0
.BeginGroup = True
.Style = msoButtonCaption ''<=== Thêm dòng này vào nha!
End With
End Sub

Code này cũng còn thiếu 1 đoạn cũng khá quan trọng:
Application.CommandBars("worksheet menu bar").Reset
Đây là đoạn code reset lại Menu bar trước khi tạo Menu, nếu không thêm code này vào, thì menu đã tồn tại sẽ báo lỗi.

Các mem cho hỏi cái là sau khi tạo được menu custom rồi thì làm sao để điều khiển nó chạy theo đoạn code của mình được? Xin cảm ơn.
Ngoài ra nó còn thiếu một cái cực kỳ quan trọng: OnAction
PHP:
Public Sub myMenu() 
Application.CommandBars("worksheet menu bar").Reset ''<=== Thêm dòng này vào nha!
Dim Ten_Menu As CommandBarButton
Set Ten_Menu = Application.CommandBars("Worksheet Menu Bar").Controls.Add
With Ten_Menu
.Caption = "123"
.FaceId = 0
.OnAction = "YourMacro" '<=== Thêm dòng này vào nha!
.BeginGroup = True
.Style = msoButtonCaption 
End With
End Sub

PHP:
Sub YourMacro()
  MsgBox "Tôi yêu GPE!"
End Sub

Như vậy, nếu bạn có Macro nào thì đặt đúng tên vào OnAction, để trong ngoặc kép nhé, code sẽ chạy cho bạn xem.

Ngoài ra còn thiếu vị trí, thuộc nhóm nào nữa. VD:
.Controls.Add(Type:=1, before:=1).Caption = "ABC"
 
Lần chỉnh sửa cuối:
Upvote 0
Code này cũng còn thiếu 1 đoạn cũng khá quan trọng:
Application.CommandBars("worksheet menu bar").Reset
Đây là đoạn code reset lại Menu bar trước khi tạo Menu, nếu không thêm code này vào, thì menu đã tồn tại sẽ báo lỗi.


Ngoài ra nó còn thiếu một cái cực kỳ quan trọng: OnAction
PHP:
Public Sub myMenu() 
Application.CommandBars("worksheet menu bar").Reset ''<=== Thêm dòng này vào nha!
Dim Ten_Menu As CommandBarButton
Set Ten_Menu = Application.CommandBars("Worksheet Menu Bar").Controls.Add
With Ten_Menu
.Caption = "123"
.FaceId = 0
.OnAction = "YourMacro" '<=== Thêm dòng này vào nha!
.BeginGroup = True
.Style = msoButtonCaption 
End With
End Sub
PHP:
Sub YourMacro()
  MsgBox "Tôi yêu GPE!"
End Sub
Như vậy, nếu bạn có Macro nào thì đặt đúng tên vào OnAction, để trong ngoặc kép nhé, code sẽ chạy cho bạn xem.

Ngoài ra còn thiếu vị trí, thuộc nhóm nào nữa. VD:
.Controls.Add(Type:=1, before:=1).Caption = "ABC"

Nếu anh dùng câu

Mã:
[B]Application.CommandBars("worksheet menu bar").Reset[/B]
Thì giả sử có các menu tự tạo khác thì các menu tự tạo khác cũng sẽ bị mất.
Cách đơn giản là dò có menu nào tạo ra xoá menu đó và tạo lại là được.

Mã:
Application.CommandBars("Worksheet Menu Bar").Controls("[B][COLOR=Red]TenMenu[/COLOR][/B]").Delete
 
Upvote 0
Nếu anh dùng câu

Mã:
[B]Application.CommandBars("worksheet menu bar").Reset[/B]
Thì giả sử có các menu tự tạo khác thì các menu tự tạo khác cũng sẽ bị mất.
Cách đơn giản là dò có menu nào tạo ra xoá menu đó và tạo lại là được.

Mã:
Application.CommandBars("Worksheet Menu Bar").Controls("[B][COLOR=red]TenMenu[/COLOR][/B]").Delete


Đồng ý với ĐỞM, tuy nhiên đâu có ai để tồn tại menu hoài trên Excel đúng không? Mở File, hoặc Active workbook thì load menu cần thiết cho File đó, đóng File hoặc DeActive Workbook thì Reset menu, nên ít ai mà xóa từng nút lệnh bên trong nó lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
Đồng ý với ĐỞM, tuy nhiên đâu có ai để tồn tại menu hoài trên Excel đúng không? Mở File, hoặc Active workbook thì load menu cần thiết cho File đó, đóng File hoặc DeActive Workbook thì Reset menu, nên ít ai mà xóa từng nút lệnh bên trong nó lắm.
Thí dụ như thế này nhé, già sử ứng dụng của mình không muốn có những menu khác xuất hiện (VD: Help) và những add-ins khác cần, nếu anh Reset thì nó xuất hiện lại cái Help đó và làm mất menu của add-ins khác.
Nói chung mình chỉ đưa ra trường hợp có thể xảy ra còn sử dụng thì tuỳ theo từng trường hợp mà dùng.
 
Lần chỉnh sửa cuối:
Upvote 0
Thí dụ như thế này nhé, già sử ứng dụng của mình không muốn có những menu khác xuất hiện (VD: Help) và những add-ins khác cần, nếu anh Reset thì nó xuất hiện lại cái Help đó và làm mất menu của add-ins khác.
Nói chung mình chỉ đưa ra trường hợp có thể xảy ra còn sử dụng thì tuỳ theo từng trường hợp mà dùng.


Mỗi File mình làm một MENU, POPUP, PLY cần thiết, trong đó, mình thích cái gì, mình bỏ cái gì thì cứ cho nó vào hoặc xóa nó luôn trong code đó, khi reset rồi load lại Menu thì nó đã xóa hay bỏ những thứ đó rồi còn gì nè! Sau khi thoát File mình Reset để trả lại đúng cái Excel đang có thôi.

VD: Trong PLY:
......

.Controls("Tab Color").BeginGroup = True

.Controls("Insert...").Delete
.Controls("Delete").Delete
.Controls("Rename").Delete
.Controls("Move or Copy...").Delete
.Controls("View Code").Delete
.Controls("Protect Sheet...").Delete
.Controls("Unprotect Sheet...").Delete
.Controls("Hide").Delete
.Controls("Unhide...").Delete
.Controls("Select All Sheets").Delete
.....
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là một Ví dụ điển hình, các bạn tham khảo nhé. Đoạn code dưới đây là một Menu tắt khi bạn Click phải chuột lên Tab của Sheet:

PHP:
''*****************************************************************************************************
'*****************************************************************************************************
'Thu tuc tao Menu tat (click phai chuot tai tab cua worksheet):
Sub AddToPlyMenu()
On Error Resume Next
With Application.CommandBars("Ply")
  .Reset
  '(Type:= msoControlPopup = 10, msoControlButton = 1)
  .Controls.Add(Type:=1, before:=1).Caption = "GIAI"
    With .Controls("GIAI")
      .Style = 3 'Hoac: msoButtonIconAndCaption
      .FaceId = 481 '59
      .OnAction = "YourMacro"
    End With
'=====================================================================================
  .Controls.Add(Type:=1, before:=2).Caption = "PHAP"
    With .Controls("PHAP")
      .Style = 3
      .FaceId = 266 '263 '7 '2126
      .OnAction = "YourMacro"
    End With
'=====================================================================================
  .Controls.Add(Type:=1, before:=3).Caption = "EXCEL"
    With .Controls("EXCEL")
      .Style = 3
      .FaceId = 263 '268 '343
      .OnAction = "YourMacro"
    End With
'=====================================================================================
    .Controls.Add(Type:=1, before:=4).Caption = "LA"
    With .Controls("LA")
      .Style = 3
      .FaceId = 269 '352
      .OnAction = "YourMacro"
      .BeginGroup = True
    End With
'=====================================================================================
  .Controls.Add(Type:=1, before:=5).Caption = "CUA"
    With .Controls("CUA")
      .Style = 3
      .FaceId = 268 '343
      .OnAction = "YourMacro"
    End With
'=====================================================================================
  .Controls.Add(Type:=10, before:=6).Caption = "BAN"
    With .Controls("BAN")
    .Controls.Add(Type:=1, before:=1).Caption = "TUYET"
      With .Controls("TUYET")
        .FaceId = 2131
        .OnAction = "YourMacro"
      End With
  '-------------------------------------------------------------------
    .Controls.Add(Type:=1, before:=2).Caption = "VOI"
      With .Controls("VOI")
        .FaceId = 572
        .OnAction = "YourMacro"
        .BeginGroup = True
      End With
        .BeginGroup = True
    End With
'=====================================================================================
  .Controls("Tab Color").BeginGroup = True
  .Controls("Insert...").Delete
  .Controls("Delete").Delete
  .Controls("Rename").Delete
  .Controls("Move or Copy...").Delete
  .Controls("View Code").Delete
  .Controls("Protect Sheet...").Delete
  .Controls("Unprotect Sheet...").Delete
  .Controls("Hide").Delete
  .Controls("Unhide...").Delete
  .Controls("Select All Sheets").Delete
End With
End Sub
'*****************************************************************************************************
'*****************************************************************************************************
Sub YourMacro()
  MsgBox "Tôi yêu giaiphapexcel.com!"
End Sub
'*****************************************************************************************************
'*****************************************************************************************************
Sub XoaPly()
  Application.CommandBars("Ply").Reset
End Sub

Các bạn muốn đổi thành Menu trên thanh Toolbar hay 1 cái Popup trên bảng tính thì các bản chỉ việc đổi như sau:

With Application.CommandBars("Ply")

thành:

With Application.CommandBars("Worksheet menu bar")

With Application.CommandBars("Cell")

Chỉ vậy thôi.

Lưu ý là các bạn phải nhớ bỏ mấy cái vụ ".Delete" nhé, và xác định rõ vị trí (before:) của Menu để bạn đặt vào.

thêm code này nữa cho chắc ăn:
PHP:
Sub XoaMenuCellPly()
  CommandBars("worksheet menu bar").Reset
  CommandBars("Ply").Reset
  CommandBars("cell").Reset
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
hic, mình chỉ tập tọe được mấy cái đơn giản, vô đây xem thấy các a c e giỏi quá, bái phục luôn. Thực tình đọc mà k hiểu chi hết! Phải học hỏi thêm rất rất nhiều mới mong góp tiếng vô diễn đàn, chứ củ chuối quá đọc gì cũng k hiểu thì biết tới giờ nào mới có đóng góp cho diễn đàn đây! haiz...........-\\/.
 
Upvote 0

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

Back
Top Bottom