Пользовательское меню правой кнопки мыши - OnAction работает сразу, а не по нажатию кнопки - PullRequest
0 голосов
/ 23 сентября 2011

Я создаю пользовательское меню в Excel, которое состоит из различных подменю. Это для выбора различных предметов техники, и есть около 250 возможных результатов.

В любом случае, я построил меню и хочу, чтобы .Caption вводился в ячейку при использовании меню. Я поместил .OnAction в соответствующие кнопки, но, к сожалению, .OnAction активируется при открытии файла, а не при нажатии кнопки. Таким образом, все 250 с лишним .Captions быстро вводятся в одну и ту же ячейку в быстрой последовательности.

Быстрое редактирование - важный бит находится внизу BuildMenus, где .OnAction вызывает функцию AddStuff. Я знаю, что он работает на Workbook_Activate, поэтому он запускается сразу, но везде, где я смотрел онлайн, делает то же самое.

Private Sub Workbook_Activate()
BuildMenus
End Sub

Private Sub BuildMenus()
'Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim AmountOfCats As Integer
Dim ThisIsMyCell As String
ThisIsMyCell = ActiveCell.Address
'this is where we would set the amount of categories. At the moment we'll have it as 15
AmountOfCats = 15
Dim cBut As CommandBarControl
Dim Cats As CommandBarControl
Dim SubCats As CommandBarControl
Dim MenuDesc As CommandBarButton
On Error Resume Next
With Application
    .CommandBars("Cell").Controls("Pick Machinery/Plant...").Delete
End With
Set cBut = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Temporary:=True)
cBut.Caption = "Pick Machinery/Plant.."
With cBut
    .Caption = "Pick Machinery/Plant..."
    .Style = msoButtonCaption
End With
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim SC As Integer
Dim AmountOfMenus As Integer
SC = 1
Dim MD As Integer
MD = 1
Dim MyCaption As String
For i = 0 To AmountOfCats - 1
    Set Cats = cBut.Controls.Add(Type:=msoControlPopup, Temporary:=True)
    Cats.Caption = Categories(i + 1)
    Cats.Tag = i + 1
    For j = 0 To (SubCatAmounts(i + 1) - 1)
        Set SubCats = Cats.Controls.Add(Type:=msoControlPopup, Temporary:=True)
        SubCats.Caption = SubCatArray(SC)
        SubCats.Tag = j + 1
        AmountOfMenus = MenuAmounts(SC)
        For k = 0 To AmountOfMenus - 1
            Set MenuDesc = SubCats.Controls.Add(Type:=msoControlButton)
            With MenuDesc
                .Caption = MenuArray(MD)
                .Tag = MD
                MyCaption = .Caption
                .OnAction = AddStuff(MyCaption)
            End With
            MD = MD + 1
        Next
        SC = SC + 1
    Next
Next
On Error GoTo 0
End Sub

Function AddStuff(Stuff As String)
Dim MyCell As String
MyCell = ActiveCell.Address
ActiveCell.Value = Stuff
End Function

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

OnAction ожидает строковое значение: вместо этого вы вызываете ваш саб AddStuff при создании вашего меню ...

.OnAction = "AddStuff """ & MyCaption & """"

- это то, что вы хотите (при условии, что я правильно понял свои цитаты)

0 голосов
/ 26 сентября 2011

Я ошибся с моим AddStuff - я вызывал его как функцию, когда вместо этого должен был быть макрос (или обычное подпрограмма). Небольшая модификация кода .OnAction Тима Уильямса

MyButton.OnAction = "AddStuff(""" & MyButton.Caption & """)"

сделал свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...