Làm sao gắn các lệnh Macro vào nút phải chuột?

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi
Liên hệ QC

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Việc lập các macro để làm việc theo ý mình là rất phổ biến, nhưng gắn nó vào các nút lệnh thì có cái ưu điểm là đẻ ấn nút, nhưng cái nhược điểm của nút lệnh là khi kéo màng hình xuống dưới nhiều quá, (hoặc số liệu dài qua ben phải, kéo màng hình qua bên phải nhiều quá sẽ không còn thấy nút lệnh để ấn vào).

Mình có ý định muốn gắn các Macro vào nút phải chuột, nghĩa là khi nhấp phải chuột thì sẽ có mục "My Macro"/"Macro 1, Macro 2, Macro 3....
Khi đó ta cứ chọn vào đó để thực hiện Macro mà không còn phụ thuộc vào nút lệnh
Mong GPE chỉ giúp. cảm ơn các bạn GPE nhiều.
 
Thì bạn gắn vào sự kiên (Event) right_click là được. Nhưng theo mình, cách này không hay vì:
-Chỉ được 1 Macro.
-Tranh chấp với chức năng click phải chuột.

Bạn nên gắn bằng phím tắt là hay hơn cả và dễ làm. Nó hỗ trợ bằng Option của Macro
Hoặc dùng Onkey để gán cho các phím Fn ít sử dụng.
 
Upvote 0
Việc lập các macro để làm việc theo ý mình là rất phổ biến, nhưng gắn nó vào các nút lệnh thì có cái ưu điểm là đẻ ấn nút, nhưng cái nhược điểm của nút lệnh là khi kéo màng hình xuống dưới nhiều quá, (hoặc số liệu dài qua ben phải, kéo màng hình qua bên phải nhiều quá sẽ không còn thấy nút lệnh để ấn vào).

Mình có ý định muốn gắn các Macro vào nút phải chuột, nghĩa là khi nhấp phải chuột thì sẽ có mục "My Macro"/"Macro 1, Macro 2, Macro 3....
Khi đó ta cứ chọn vào đó để thực hiện Macro mà không còn phụ thuộc vào nút lệnh
Mong GPE chỉ giúp. cảm ơn các bạn GPE nhiều.
Thử code này xem
1> Trong Module:
PHP:
Private Sub BuildPopupMenu()
  With Application.CommandBars("Cell").Controls.Add(1, , , 1)
    .Caption = "My Macro 1"
    .OnAction = "Test1"
  End With
End Sub
PHP:
Private Sub ResetPopupMenu()
  Application.CommandBars("Cell").Reset
End Sub
PHP:
Private Sub Test1()
  MsgBox "Test Popup menu"
End Sub
2> Trong Sheet
PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
    Run ("ResetPopupMenu"): Run ("BuildPopupMenu")
  Else
    Run ("ResetPopupMenu")
  End If
End Sub
PHP:
Private Sub Worksheet_Deactivate()
  Run ("ResetPopupMenu")
End Sub
 

File đính kèm

Upvote 0

Hay quá đi anh ndu ơi, nhưng như vậy là mình phải chọn trước vùng nào đó là sẽ xuất hiện Macro nào đó tương ứng (chỉ 1 Macro thôi).

1. Mình có thể làm xuất hiện nhiều hơn 1 Macro dc ko ndu?

2. Hoăc là các Macro nằm trong nhóm My Macro?
My Macro -> Macro 1
My Macro -> Macro 2
My Macro -> Macro 3

3. Có cách nào không phụ thuộc vào Vùng của execl không? nghĩa là chọn vào cell nào thì nút phải chuột cũng xuất hiện lệnh?
 
Lần chỉnh sửa cuối:
Upvote 0
Thử code này xem nhé, có thể dùng làm Add-Ins để sử dụng chung cho nhiều bảng tính! Nội dung 2 file đính kèm như nhau chỉ khác một file là Add-Ins (.xla) còn file kia (.xls) chỉ có tác dụng cho nó mà thôi.

TTP
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Thì bạn gắn vào sự kiên (Event) right_click là được. Nhưng theo mình, cách này không hay vì:
-Chỉ được 1 Macro.
-Tranh chấp với chức năng click phải chuột.

Bạn nên gắn bằng phím tắt là hay hơn cả và dễ làm. Nó hỗ trợ bằng Option của Macro
Hoặc dùng Onkey để gán cho các phím Fn ít sử dụng.
Minh cũng đã làm bằng phiếm tắt, nhưng khi chép file qua nhiều máy, có máy lại ấn nút tắt lại không dùng được, không biết tại sao nữa. nên mình ko có làm
Còn gắn vào các phím chức năng Fn thì chưa biết gì, hehe
 
Upvote 0
Hay quá đi anh ndu ơi, nhưng như vậy là mình phải chọn trước vùng nào đó là sẽ xuất hiện Macro nào đó tương ứng (chỉ 1 Macro thôi).

1. Mình có thể làm xuất hiện nhiều hơn 1 Macro dc ko ndu?

2. Hoăc là các Macro nằm trong nhốm My Macro?
My Macro -> Macro 1
My Macro -> Macro 2
My Macro -> Macro 3

3. Có cách nào không phụ thuộc vào Vùng của execl không? nghĩa là chọn vào cell nào thì nút phải chuột cũng xuất hiện lệnh?
Thí nghiệm đơn giản với 1 Popup Item, muốn "NHIỀU" thì bạn tự nghĩ ra đi ---> Chẳng hạn thêm 1 vòng lập duyệt qua các "TÊN" rồi Add
Ẹc... Ẹc... Tôi nghĩ không khó đối với bạn!
-------------
Tôi ví dụ 5 macro nhé
PHP:
Private Sub BuildPopupMenu()
  Dim i As Long
  For i = 1 To 5
    With Application.CommandBars("Cell").Controls.Add(1, , , i)
      .Caption = "My Macro " & i
      .OnAction = "Test" & i
    End With
  Next i
End Sub
PHP:
Private Sub ResetPopupMenu()
      Application.CommandBars("Cell").Reset
End Sub
PHP:
Private Sub Test1()
  MsgBox "Test Popup menu 1"
End Sub
PHP:
Private Sub Test2()
  MsgBox "Test Popup menu 2"
End Sub
PHP:
Private Sub Test3()
  MsgBox "Test Popup menu 3"
End Sub
PHP:
Private Sub Test4()
  MsgBox "Test Popup menu 4"
End Sub
PHP:
Private Sub Test5()
  MsgBox "Test Popup menu 5"
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thí nghiệm đơn giản với 1 Popup Item, muốn "NHIỀU" thì bạn tự nghĩ ra đi ---> Chẳng hạn thêm 1 vòng lập duyệt qua các "TÊN" rồi Add
Ẹc... Ẹc... Tôi nghĩ không khó đối với bạn!
File này ok lăm anh oi. Nhưng lỡ đâu Macro nhiều quá, menu phải chuột nó dài xuống thấy cũng không được đẹp.
Anh có thể gôm các macro lại theo nhóm được không?
VD
Nhom 1 -> Macro 1
Nhom 1 -> Macro 2
Nhom 1 -> Macro 3
để cho menu phai chuot no ngắn gọn, nhìn đẹp hơn.
Cảm ơn anh nhiều
 
Upvote 0
File này ok lăm anh oi. Nhưng lỡ đâu Macro nhiều quá, menu phải chuột nó dài xuống thấy cũng không được đẹp.
Anh có thể gôm các macro lại theo nhóm được không?
VD
Nhom 1 -> Macro 1
Nhom 1 -> Macro 2
Nhom 1 -> Macro 3
để cho menu phai chuot no ngắn gọn, nhìn đẹp hơn.
Cảm ơn anh nhiều

Menu ngữ cảnh (có submenu) khi right click cell có thể sử dụng dạng Add-Ins và có thể dùng Shortcut key.

TTP.
 

File đính kèm

Upvote 0
Mình ví dụ sử dụng onkey. Bạn nhấn các phím: F9;F10;F11;F12 xem sao

PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "{F9}"
Application.OnKey "{F10}"
Application.OnKey "{F11}"
Application.OnKey "{F12}"
End Sub
'----------------------------------------------------
Private Sub Workbook_Open()
Application.OnKey "{F9}", "Tb1"
Application.OnKey "{F10}", "Tb2"
Application.OnKey "{F11}", "Tb3"
Application.OnKey "{F12}", "Tb4"
End Sub
 

File đính kèm

Upvote 0
File này ok lăm anh oi. Nhưng lỡ đâu Macro nhiều quá, menu phải chuột nó dài xuống thấy cũng không được đẹp.
Anh có thể gôm các macro lại theo nhóm được không?
VD
Nhom 1 -> Macro 1
Nhom 1 -> Macro 2
Nhom 1 -> Macro 3
để cho menu phai chuot no ngắn gọn, nhìn đẹp hơn.
Cảm ơn anh nhiều
Cũng chẳng khó gì... Giờ gom 5 cái vào 1 nhóm nhé
PHP:
Private Sub BuildPopupMenu()
  Dim i As Long
  With Application.CommandBars("Cell").Controls.Add(msoControlPopup, , , 1)
    .Caption = "My Group"
    For i = 1 To 5
      With .Controls.Add(msoControlButton, , , i)
        .Caption = "My Macro " & i
        .OnAction = "Test" & i
      End With
    Next i
  End With
End Sub
Bạn chú ý:
- Tôi đưa code ở mức đơn giản nhất đề bạn có thể tùy biến theo ý mình
- Đoạn có dòng msoControlPopup là Group (bạn có thể thay chữ này thành số 10)
- Đoạn có dòng msoControlButton là các Button "con" nằm trong Group (bạn có thể thay chữ này thành số 1)
Hy vọng bạn có thể hiểu được!
 

File đính kèm

Upvote 0
Cũng chẳng khó gì... Giờ gom 5 cái vào 1 nhóm nhé
Bạn chú ý:
- Tôi đưa code ở mức đơn giản nhất đề bạn có thể tùy biến theo ý mình
- Đoạn có dòng msoControlPopup là Group (bạn có thể thay chữ này thành số 10)
- Đoạn có dòng msoControlButton là các Button "con" nằm trong Group (bạn có thể thay chữ này thành số 1)
Hy vọng bạn có thể hiểu được!
Em thấy 2 cấu trúc msoControlPopup Group và con giống nhau quá, không phân biệt đâu là cái nào. Nên em thử làm thêm 1 cấp độ tiếp xem sao, ai gì bị lỗi, mà không hiểu tại sao lỗi?
PHP:
Private Sub BuildPopupMenu()
  Dim i1 As Long: Dim i2 As Long
  ''-- Cap do cell
  With Application.CommandBars("Cell").Controls.Add(msoControlPopup, , , 1)
    .Caption = "My Group1"
    For i1 = 1 To 2
      ''-- Cap do trong nhom 1
      With .Controls.Add(msoControlButton, , , i1)
        .Caption = "My Group2 " & i1
        For i2 = 1 To 3
        ''-- Cap do trong nhom 2
          With .Controls.Add(msoControlButton, , , i2)
            .Caption = "My Macro " & i2
            .OnAction = "Test" & i2
          End With
        Next i2
      End With
    Next i1
  End With
End Sub
 
Upvote 0
Em thấy 2 cấu trúc msoControlPopup Group và con giống nhau quá, không phân biệt đâu là cái nào. Nên em thử làm thêm 1 cấp độ tiếp xem sao, ai gì bị lỗi, mà không hiểu tại sao lỗi?
PHP:
Private Sub BuildPopupMenu()
  Dim i1 As Long: Dim i2 As Long
  ''-- Cap do cell
  With Application.CommandBars("Cell").Controls.Add(msoControlPopup, , , 1)
    .Caption = "My Group1"
    For i1 = 1 To 2
      ''-- Cap do trong nhom 1
      With .Controls.Add(msoControlButton, , , i1)
        .Caption = "My Group2 " & i1
        For i2 = 1 To 3
        ''-- Cap do trong nhom 2
          With .Controls.Add(msoControlButton, , , i2)
            .Caption = "My Macro " & i2
            .OnAction = "Test" & i2
          End With
        Next i2
      End With
    Next i1
  End With
End Sub
Đương nhiên là sai rồi, sửa thành vầy thử xem:
PHP:
Private Sub BuildPopupMenu()
  Dim i1 As Long, i2 As Long
  With Application.CommandBars("Cell").Controls.Add(msoControlPopup, , , 1)
    .Caption = "My Group1"
    For i1 = 1 To 2
      ''-- Cap do trong nhom 1
      With .Controls.Add(msoControlPopup, , , i1)
        .Caption = "My Group2 " & i1
        For i2 = 1 To 3
        ''-- Cap do trong nhom 2
          With .Controls.Add(msoControlButton, , , i2)
            .Caption = "My Macro " & i2
            .OnAction = "Test" & i2
          End With
        Next i2
      End With
    Next i1
  End With
End Sub
Tôi đã nói ở trên:
msoControlButton: Chỉ là cái nút để bấm ---> Vậy nó phải là các Item cuối cùng
msoControlPopup: Chính là nhóm
(tạm hiểu như thế nhé)
Ở cấp độ 2, bạn Add 1 Button thì làm sao nó có mũi tên xổ ngang được, đúng không?
 
Lần chỉnh sửa cuối:
Upvote 0
Menu ngữ cảnh (có submenu) khi right click cell có thể sử dụng dạng Add-Ins và có thể dùng Shortcut key.

TTP.
File của bạn quá tốt, mình ko biet nói gì hơn là cảm ơn, để mình sẽ thêm 1 cấp độ nhóm thứ 2 nữa xem có được không?
Nói thêm cho các bạn xem post này là phím tắt để thực hiện lệnh trong file của Trương Tam Phong là: Ctrl + Shift + ...
Rất cảm ơn bạn nhiều.

Việc gắn macro vào nút phải chuột, có 2 cách làm, cách của ndu và cách của bạn cái nào cũng hiệu quả hết, chỉ khác nhau là code của ndu thì vị trí hàng số mấy trong nút phải chuột ta có thể lựa chọn được. còn của bạn mình đang nguyen cứu ko biết nó có nằm được lên trên của nút phải chuột hay ko. hay là lúc nào cũng ở dưới cùng, cái hay của bạn là có thể tạo thành file Add-Ins.
 
Lần chỉnh sửa cuối:
Upvote 0
Việc gắn macro vào nút phải chuột, có 2 cách làm, cách của ndu và cách của bạn cái nào cũng hiệu quả hết, chỉ khác nhau là code của ndu thì vị trí hàng số mấy trong nút phải chuột ta có thể lựa chọn được. còn của bạn mình đang nguyen cứu ko biết nó có nằm được lên trên của nút phải chuột hay ko. hay là lúc nào cũng ở dưới cùng, cái hay của bạn là có thể tạo thành file Add-Ins.
Trương tiền bối là cao thủ VBA rồi, điều đó khỏi cần bàn... nhưng không phải như ý kiến bạn vừa nếu đâu... Phương pháp chỉ có 1 (từ MS mà ra) chỉ là cách biểu diển có khác nhau thôi, và cái nào cũng có thể làm thành AddIn được cả
Ý đồ của tôi là đưa code ở dạng đơn giản nhất để bạn có thể hiểu ---> Vì nếu mang về xài mà chẳng hiểu gì thì làm sao bạn chỉnh sửa (khi có trục trặc)
Bạn nên tham khảo thêm các code về CommandBars để hiểu và tùy biến ---> Hay nhất là tìm trên google các Ebook bằng tiếng Anh (chịu khó mà đọc), bạn sẽ biết thêm về các tham số để có thể chỉnh nó nằm trên hay dưới tùy thích (thậm chí là thêm Icon vào cho sinh động)...
Nói thật với bạn chứ trước khi bạn hỏi câu này, tôi cũng chưa từng xài Popup kiểu NHÓM như bạn yêu cầu đâu... vừa mới tìm hiểu và post code lên đấy thôi
 
Upvote 0
Trương tiền bối là cao thủ VBA rồi, điều đó khỏi cần bàn... nhưng không phải như ý kiến bạn vừa nếu đâu...

Em không dám làm cao thủ đâu, khả năng vẫn chỉ ở mức amateur mà thôi. Em thấy Bác tiến bộ rõ rệt đó, cố lên bác!

chỉ khác nhau là code của ndu thì vị trí hàng số mấy trong nút phải chuột ta có thể lựa chọn được. còn của bạn mình đang nguyen cứu ko biết nó có nằm được lên trên của nút phải chuột hay ko. hay là lúc nào cũng ở dưới cùng

Do mình cố tình đặt các lệnh mới ở dưới cùng trong thực đơn ngữ cảnh mà, bạn có thể thêm tham số vào để đặt bất kỳ nơi đâu mình muốn:

PHP:
Set MyControl = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Before:=1)
    MyControl.Caption = "My Commnands ..."
    MyControl.BeginGroup = True
    For i = 1 To 3
        Set subControl = MyControl.Controls.Add
                subControl.Caption = "Command " & i
                subControl.OnAction = "Module1.Lenh" & i
Next i

Before:=1 là đặt nhóm lệnh mới trên cùng --> thay số 1 bằng số khác để thử
MyControl.BeginGroup = True để thêm đường chia cách giữa các nhóm lệnh


TTP.
 
Upvote 0
Before:=1 là đặt nhóm lệnh mới trên cùng --> thay số 1 bằng số khác để thử
MyControl.BeginGroup = True để thêm đường chia cách giữa các nhóm lệnh
TTP.
Vấn đề về code thì đọc kỹ lại thì thấy bản chất cua code của 2 anh là 1, chỉ khác nhau cách trình bày thôi. vậy là đã ok rồi.
.BeginGroup = True - thêm đường phân cách ở phía trên lệnh, vd mình để các lệnh macro o trên cùng của menu ngử cảnh, thì
HTML:
Lenh 1
Lenh 2
------
Cut
Copy
.....
Như vậy yêu cầu là thêm đường phân cách ở dưới nút lệnh 2, sao mình tìm trong danh sách sổ xuống ko thấy có.
 
Upvote 0
Tôi đang nghĩ tại sao bạn không làm luôn thành 1 menu nhỉ (menu trên nằm trên Toolbar)... Mổi lần dùng phải Right Click có vẽ không tiện lắm
PHP:
Private Sub BuildMenu()
  Dim i As Long
  On Error Resume Next
  With Application.CommandBars.Add("My Menu", 4, False, True)
    .Enabled = True: .Visible = True: .Position = msoBarTop
    With .Controls.Add(4)
      For i = 1 To 5
        .AddItem "Macro " & i
        .Parameter = "MyMenu"
      Next
      .OnAction = "TestControl"
    End With
  End With
End Sub
PHP:
Private Sub TestControl()
  With Application.CommandBars.ActionControl
    If .Parameter = "MyMenu" Then
      Run "Test" & .ListIndex
    End If
  End With
End Sub
PHP:
Private Sub Workbook_Open()
  Run "BuildMenu"
End Sub
Đương nhiên là có 5 code Test1, Test2... Test5 để thử nghiệm
Bạn thử file này xem ---> Có thể tạo thành AddIn đấy
 

File đính kèm

Upvote 0
Tôi đang nghĩ tại sao bạn không làm luôn thành 1 menu nhỉ (menu trên nằm trên Toolbar)... Mổi lần dùng phải Right Click có vẽ không tiện lắm
Đương nhiên là có 5 code Test1, Test2... Test5 để thử nghiệm
Bạn thử file này xem ---> Có thể tạo thành AddIn đấy
Vấn đề này mình đã nghĩ đến nhưng sợ là mỗi file làm 1 menu trên Toolbar mà nhiều file thế là menu nhiều lên, gây rối nùi. Chứ nếu biêt menu này chỉ xuất hiện khi mở file này, khi tắt file thì nó cũng tắt theo thì quá là hay rồi.
Cách làm menu của anh ndu là rất tiện lợi, chắc em chuyển sang cách này quá.
Nếu đã làm được cái menu, sao mình không làm cái biểu tượng nút trên menu luôn. chứ nhấp nút sổ xuống thấy cũng bất tiện.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu đã làm được cái menu, sao mình không làm cái biểu tượng nút trên menu luôn. chứ nhấp nút sổ xuống thấy cũng bất tiện.
Làm nút trên menu càng dể hơn so với Dropdown menu ấy chứ
Bạn cứ nghiên cứu gần giống như đã từng làm với Popup menu ấy ---> Nghiên cứu từ bài đầu tiên, tôi tin rằng bạn sẽ làm được!
-------------
Gữi thêm cho bạn trang web này tham khảo:
http://www.erlandsendata.no/english/index.php?d=endownloadcommandbars
Có hàng đóng kiểu và cả file ví dụ, tha hồ nghiên cứu
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom