Код командной строки работает в стандартном модуле, но не в модуле «ThisWorkbook» - PullRequest
0 голосов
/ 31 января 2019

У меня есть процедура, которая создает CommandBar с 5 элементами управления.Первая кнопка управления работает отлично, но макросы, вызываемые 3-мя подкнопками второй кнопки управления, при нажатии кнопки показывают следующую ошибку: Cannot run the macro Heavy MX C D check status 2018 Rev 28 2019 Rev 1 January 2019 Working.xlsb'!SubName'. The macro may not be available in this workbook or all macros may be disabled. Я гарантировал, что все макросы включены, поэтому проблема не возникает.

При этом мои элементы управления / кнопки настраиваются следующим образом:

  • Первый элемент управления: кнопка, называемая Получить транзакции .Этот элемент управления отлично работает в модуле ThisWorkbook и в стандартном модуле.
  • Второй элемент управления: всплывающее окно с именем Действия листа , в котором находятся три кнопки субконтроля.Вот в чем проблема.У меня есть подпроцедуры, которые вызываются свойством OnAction при нажатии любой из 3 подкнопок, но я получаю вышеупомянутую ошибку.Каждый саб вызывается каждой из 3 кнопок, расположенных непосредственно под сабвуфером CreateToolbar в модуле ThisWorkbook.Я уже пробовал следующие форматы для OnAction безуспешно:

    • OnAction = "SubName"
    • OnAction = "'SubName'"
    • OnAction = ' & ThisWorkbook.Name & "'!SubName"

Изображения элементов управления:

enter image description here

enter image description here

Ниже мой код:

Private Sub CreateToolbar()
'called from Workbook Open event procedure
 Dim Cbar As CommandBar
 Dim CbarControl As CommandBarControl
 Dim CbarControlSub1 As CommandBarControl
 Dim CbarControlSub2 As CommandBarControl
 Dim CbarControlSub3 As CommandBarControl

 'Get rid of any existing toolbar
 Application.CommandBars(sToolbarName).Delete

 '*************************************************************
 'This works as inteneded
 Set Cbar = Application.CommandBars.Add(Name:=sToolbarName)
    'Create the new toolbar
    With Cbar
            'Add a toolbar command button
            With .Controls.Add(Type:=msoControlButton)
                .OnAction = "'" & ThisWorkbook.Name & "'!GetTransactions"
                .ShortcutText = "Ctrl+Shift+G"
                .Caption = "Get Transactions"
                .Style = msoButtonCaption
                .TooltipText = "Click to Import and Categorize transactions."
            End With

        .Visible = True
        .Position = msoBarTop

    End With

    Application.MacroOptions Macro:="GetTransactions", _
                         HasShortcutKey:=True, _
                         ShortcutKey:="G"

    Application.OnKey "^+g", "GetTransactions"
    '*************************************************************


   '*************************************************************
   'This is where I am having issues
   Set CbarControl = Cbar.Controls.Add(Type:=msoControlPopup)
   CbarControl.Caption = "Sheet Actions"

   Set CbarControlSub1 = CbarControl.Controls.Add(Type:=msoControlButton)
        With CbarControlSub1
           .Style = msoButtonIconAndCaption
           .Caption = "Filter For New Transations"
           .OnAction = "FilterForNewTrans"
           .BeginGroup = True
        End With

        Set CbarControlSub2 = CbarControl.Controls.Add(Type:=msoControlButton)
        With CbarControlSub2
           .Style = msoButtonIconAndCaption
           .Caption = "Clear Transaction Filter"
           .OnAction = "ClearFilter"
           .BeginGroup = True
        End With

        Set CbarControlSub3 = CbarControl.Controls.Add(Type:=msoControlButton)
        With CbarControlSub3
               .Style = msoButtonIconAndCaption
               .Caption = "Clear Row Fill Color"
               .OnAction = "ClearFillColor"
               .BeginGroup = True
        End With
   '*************************************************************

End Sub

Любые идеи, предложения или ответы будут с благодарностью.

1 Ответ

0 голосов
/ 04 февраля 2019

Мне никогда не удавалось заставить код работать в модуле ThisWorkbook, однако я заставил его работать в стандартном модуле.Я вытащил подпрограмму CreateToolbar вместе с подпрограммами для кнопок в стандартный модуль и оставил их как частные.В модуле ThisWorkbook, который запускается на Workbook_Open, я изменил Call CreateToolbar на Application.Run "'" & ThisWorkbook.Name & "'!CreateToolbar", и он работает как положено.Для Subs, которые запускаются при нажатии кнопки, я использовал Application.OnKey "somekeycombination", "SomeSubName".

Ниже приведен окончательный код для CommandBar с дополнительными кнопками:

Private Sub CreateToolbar()
 'called from Workbook Open event procedure
 Dim Cbar As CommandBar 'ToolBar

 Dim CbarControl_1 As CommandBarControl
 Dim CbarControl_2 As CommandBarControl
 Dim CbarControl_3 As CommandBarControl

 Dim ControlSubA1 As CommandBarControl
 Dim ControlSubA2 As CommandBarControl

 Dim ControlSubB1 As CommandBarControl
 Dim ControlSubB2 As CommandBarControl
 Dim ControlSubB3 As CommandBarControl
 Dim ControlSubB4 As CommandBarControl
 Dim ControlSubB5 As CommandBarControl


  'Get rid of any existing toolbar
  On Error Resume Next
  Application.CommandBars(ToolbarName).Delete

    '**************************************
    'Add the Toolbar
    '**************************************
    Set Cbar = Application.CommandBars.Add(Name:=ToolbarName)
    With Cbar
           .Visible = True
          .Position = msoBarTop
    End With
    '**************************************

'********************************************************************
'Button1
'********************************************************************
     Set CbarControl_1 = Cbar.Controls.Add(Type:=msoControlPopup)
         CbarControl_1.Caption = "Get Transactions"
    '**************************
    'SubButton1: Ctrl+Shift+G
    '**************************
            Set ControlSubA1 = CbarControl_1.Controls.Add(Type:=msoControlButton)
                With ControlSubA1
                   .Style = msoButtonIconAndCaption
                   .Caption = "Import/Categorize ALL RECENT transactions"
                   .OnAction = "GetCurrMonTransactions"
                   .ShortcutText = "Ctrl+Shift+G"
                   .BeginGroup = True
                   Application.OnKey "^+g", "GetCurrMonTransactions"
                End With

    '**************************
    'SubButton2: Ctrl+Shift+P
    '**************************
            Set ControlSubA2 = CbarControl_1.Controls.Add(Type:=msoControlButton)
                With ControlSubA2
                   .Style = msoButtonIconAndCaption
                   .Caption = "Import/Categorize PREVIOUS MONTH'S transactions"
                   .OnAction = "GetPrevMonthTransactions"
                   .ShortcutText = "Ctrl+Shift+P"
                   .BeginGroup = True
                   Application.OnKey "^+p", "GetPrevMonthTransactions"
                End With
    '********************************************************************
    '********************************************************************


'********************************************************************
'Button 2: Ctrl+Shift+U
'********************************************************************
    Set CbarControl_2 = Cbar.Controls.Add(Type:=msoControlButton)
           With CbarControl_2
               .OnAction = "'" & ThisWorkbook.Name & "'!UploadTransToSQL"
               .Caption = "Save To SQL"
               .ShortcutText = "Ctrl+Shift+U"
               .Style = msoButtonCaption
               .TooltipText = "Click to Export updated transactions to the SQL Server"
               Application.OnKey "^+u", "UploadTransToSQL"
           End With
    '********************************************************************
    '********************************************************************


'********************************************************************
'Button 3
'********************************************************************
    Set CbarControl_3 = Cbar.Controls.Add(Type:=msoControlPopup)
    CbarControl_3.Caption = "Sheet Actions"

        '************************* 
        'SubButton1: Ctrl+Shift+F
        '*************************
        Set ControlSubB1 = CbarControl_3.Controls.Add(Type:=msoControlButton)
            With ControlSubB1
               .Style = msoButtonIconAndCaption
               .Caption = "Filter For New Transations"
               .OnAction = "FilterForNewTrans"
               .ShortcutText = "Ctrl+Shift+F"
               .BeginGroup = True
               Application.OnKey "^+f", "FilterForNewTrans"
            End With

        '************************* 
        'SubButton2: Ctrl+Shift+O
        '*************************
        Set ControlSubB2 = CbarControl_3.Controls.Add(Type:=msoControlButton)
            With ControlSubB2
               .Style = msoButtonIconAndCaption
               .Caption = "Filter for Old Updated Transactions"
               .OnAction = "FilterForOldUpdates"
               .ShortcutText = "Ctrl+Shift+O"
               .BeginGroup = True
               Application.OnKey "^+o", "FilterForOldUpdates"
            End With

        '*********************** 
        'SubButton3: Ctrl+Alt+c
        '***********************
        Set ControlSubB3 = CbarControl_3.Controls.Add(Type:=msoControlButton)
            With ControlSubB3
                .Style = msoButtonIconAndCaption
                .Caption = "Clear Transaction Filters"
                .OnAction = "ClearFilter"
                .ShortcutText = "Ctrl+Alt+c"
                .BeginGroup = True
                Application.OnKey "^%c", "ClearFilter"
            End With

    '************************
    'SubButton4: Ctrl+Alt+r
    '************************
        Set ControlSubB4 = CbarControl_3.Controls.Add(Type:=msoControlButton)
            With ControlSubB4
               .Style = msoButtonIconAndCaption
               .Caption = "Clear Row Fill Color"
               .OnAction = "ClearFillColor"
               .ShortcutText = "Ctrl+Alt+r"
               .BeginGroup = True
               Application.OnKey "^%r", "ClearFillColor"
            End With

    '************************ 
    'SubButton5: Ctrl+Alt+a
    '************************
        Set ControlSubB5 = CbarControl_3.Controls.Add(Type:=msoControlButton)
            With ControlSubB5
               .Style = msoButtonIconAndCaption
               .Caption = "Toggle formula Auto-Calculations"
               .OnAction = "TurnOnAutoCalc"
               .ShortcutText = "Ctrl+Alt+a"
               .BeginGroup = True
               Application.OnKey "^%a", "TurnOnAutoCalc"
            End With
'********************************************************************
'********************************************************************

End Sub

И код в модуле ThisWorkbook:

Private Sub Workbook_Open()

    Application.Run "'" & ThisWorkbook.Name & "'!CreateToolbar"

End Sub


'When this workbook is the active workbook, the toolbar will be enabled and show up
Private Sub Workbook_Activate()
    On Error Resume Next
    With Application.CommandBars(ToolbarName)
         .Enabled = True
         .Visible = True
     End With
End Sub


'When the user activates another workbook, this disables the command bar
Private Sub Workbook_Deactivate()
    On Error Resume Next
    With Application.CommandBars(ToolbarName)
         .Enabled = False
         .Visible = False
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...