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,440
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:
ruadangyeu đã viết:
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ử

MÌnh không hiểu ý bác rùa , bác nói rõ hơn xem. Để ẩn có lựa chọn thì chạy file của mình còn ẩn hết thì như Bác Tuấn hướng dẫn chạy ngon mà. hay là Bác muốn mất luôn cái menu ???
 
Upvote 0
Các bác chỉ quá rõ ràng, em là thành viên mới, xin chân thành cảm ơn. Hiện tại em đang bí về cách làm mờ (disable) một số chức năng trong Menu như thế nào? Mong các bác chỉ giúp, em cảm ơn nhiều.
 
Upvote 0
Upvote 0
Cho tôi hỏi, đã ai thử khi Active (Workbook) thì hiện menu còn khi Deactive thì mất menu chưa?
 
Upvote 0
chibi đã viết:
Cho tôi hỏi, đã ai thử khi Active (Workbook) thì hiện menu còn khi Deactive thì mất menu chưa?
Bạn viết 2 macro là Creat_Menu để tạo Menu và Delete_Menu để xoá Menu (Code của Macro này đã có rất nhiều trên diễn đàn rồi!)
Nhấn kép ThisWorkbook và thêm đoạn code sau:
Mã:
Private Sub Workbook_Activate()
Call Creat_Menu
End Sub
'
Private Sub Workbook_Deactivate()
Call Delete_Menu
End Sub
 
Upvote 0
Chào mọi người. Bây giờ có vấn đề này:
Sau khi tạo xong menu rồi, muốn gán cho nó một phím tắt và hiển thị nó bên cạnh Caption giống như menu gốc của Excel thì làm thế nào ví dụ như "New Ctrl+N"
 
Upvote 0
Anh Duyệt ơi,
Em đã làm theo hướng dẫn của anh nhưng sao không thấy kết quả gì hết? Em ngốc quá chăng?
Anh có thể vui lòng cho xin file mẫu được không?
Cảm ơn anh nhiều
 
Upvote 0
Table-Driven Command Bars

Tôi xin giới thiệu các bạn một giải thích mới nữa về việc tạo command bars của Stephen Bullen, Rob Bovey, John Green trong quyển "Professional Excel Development"
Xin các bạn xem file ví dụ. Các bạn có thể đọc phần giải thích cụ thể trong sách chương 8. Đó là sự kết hợp nhiều kỹ thuật.

Lê Văn Duyệt
 

File đính kèm

Upvote 0
xin cho hỏi làm sao bắt được events click vào copy của menu pop up (khi ấn chuột phải vào worksheet)
 
Upvote 0
à mình gặp 1 vấn đề: Khi tạo 1 add-ins có sử dụng Onkey để bắt 1 số phím, sau khi sử dụng thì không sử dụng được phím space mà fai ấn shift+space mới gõ được phím cách. Mong được giúp đỡ.
 
Upvote 0
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
Cho em hỏi một xíu:
Trong trường hợp, nếu em vừa thêm một sheet mới, muốn lập sẵn cho sheet đó một menu chuột phải (tự tạo) thì phải truyền từ module VBE đến sheet đó như thế nào? Tức là menu tự tạo sẽ tự động được thêm vào sheet mới đó. Em cảm ơn các anh chị nhiều!!!
 
Upvote 0
em cũng copy các hướng dẫn tạo munu để lam nhưng sao máy cứ báo lỗi. Em gửi file nay mọi người chỉ giúp em với nhé.
 

File đính kèm

Upvote 0
Cho em hỏi một xíu:
Trong trường hợp, nếu em vừa thêm một sheet mới, muốn lập sẵn cho sheet đó một menu chuột phải (tự tạo) thì phải truyền từ module VBE đến sheet đó như thế nào? Tức là menu tự tạo sẽ tự động được thêm vào sheet mới đó. Em cảm ơn các anh chị nhiều!!!
Bạn vào đây nghiên cứu nè :http://www.giaiphapexcel.com/forum/...xoá-Code-trong-sheet-mới-sau-khi-move-or-copy
 
Upvote 0
Xin vui lòng cho hỏi, hàm nào để biết rằng Menu đó tồn tại hay không?

Ví dụ tôi muốn kiểm tra: Application.CommandBars("Worksheet Menu Bar").Controls("MAIN MENU") có đang tồn tại trên Menu hay không, hàm trả về dạng Boolean, thì phải làm thế nào ạ?

Cảm ơn rất nhiều!!!
 
Upvote 0
Xin vui lòng cho hỏi, hàm nào để biết rằng Menu đó tồn tại hay không?

Ví dụ tôi muốn kiểm tra: Application.CommandBars("Worksheet Menu Bar").Controls("MAIN MENU") có đang tồn tại trên Menu hay không, hàm trả về dạng Boolean, thì phải làm thế nào ạ?

Cảm ơn rất nhiều!!!
Thì vầy thôi:
PHP:
Sub Test()
  Dim MyMenu As CommandBarControl
  On Error Resume Next
  Set MyMenu = Application.CommandBars(1).Controls("Main Menu")
  MsgBox Not MyMenu Is Nothing
End Sub
 
Upvote 0
Thì vầy thôi:
PHP:
Sub Test()
  Dim MyMenu As CommandBarControl
  On Error Resume Next
  Set MyMenu = Application.CommandBars(1).Controls("Main Menu")
  MsgBox Not MyMenu Is Nothing
End Sub

Cám ơn Thầy nhé! Như vậy là em đã biết tạo hàm rồi:

PHP:
Function MenuCheck(chk As String) As Boolean
  Dim MyMenu As CommandBarControl
  On Error Resume Next
  Set MyMenu = Application.CommandBars(1).Controls(chk)
  If Not MyMenu Is Nothing Then MenuCheck = True Else MenuCheck = False
End Function

Và cách sử dụng:

PHP:
Sub Test()
  MsgBox MenuCheck("Main Menu")
End Sub

Một lần nữa cảm ơn Thầy!
 
Upvote 0
Web KT

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

Back
Top Bottom