在Excel中使用VBA访问表单控件的事件过程

问题描述 投票:0回答:2

有没有办法为表单控件定义事件过程,例如ActiveX对象的情况?

我有一个 GUI,当前由用户添加/删除 ActiveX 命令按钮,但在尝试将项目添加到添加了每个按钮的全局集合时遇到 Error 91。我最好的猜测是因为这种令人讨厌的现象。根据项目的当前状态,如果我能够定义其事件过程,我最好的选择是切换到使用表单控制按钮。如果没有,我可能需要以某种方式保存全局变量并在操作 ActiveX 控件对象后读回它们。

forms events vba global
2个回答
2
投票

如果您只想添加按钮并捕获点击,您可以为它们分配一个通用宏,并根据按钮的名称(您在创建按钮时设置,并且可以通过

Application.Caller
在被调用的过程中)

Sub AddButtons()

    With ActiveSheet.Buttons.Add(100, 100, 50, 50)
        .Name = "button1"
        .OnAction = "ClickHandler"
    End With
    With ActiveSheet.Buttons.Add(200, 100, 50, 50)
        .Name = "button2"
        .OnAction = "ClickHandler"
    End With


End Sub

Sub ClickHandler()
    Dim bName As String

    bName = Application.Caller
    Select Case bName
        Case "button1": MsgBox "Clicked First button"
        Case "button2": AnotherSub 
    End Select

End Sub

0
投票

一个propriedade

onAction
,没有vba,recebe uma string com o nome da função que deve ser chamada。 Portanto,声音听起来很有趣,然后又很有趣,但它是
Application.Caller
的 chamando através。

Para descobrir o valor dos seus botões específicos, você podeexperimentar um pouco usando

debug.Print
, ou setar o nome (e aí aí ajusta o
Select
conforme os nomesrespectivos).

Dim dadosArray() As String
' Os valores em dadosArray estão definidos em outra parte do código

Sub MenuSuspenso()
  Dim i As Long, j As Integer
  Dim menuItemIndex As Integer
  menuItemIndex = 1

  Application.CommandBars("Cell").Reset
  
  For i = LBound(dadosArray, 1) To UBound(dadosArray, 1)
      For j = LBound(dadosArray, 2) To UBound(dadosArray, 2)
          With Application.CommandBars("Cell").Controls.Add(Type:=msoControlButton, Before:=menuItemIndex)
              .Caption = dadosArray(i, j)
              .OnAction = "MinhaFuncao"
          End With
          menuItemIndex = menuItemIndex + 1
          indice = indice + 1
      Next j
  Next i
  Else
      MsgBox "Nenhum dado encontrado."
  End If
  Application.CommandBars("Cell").ShowPopup
End Sub

Sub MinhaFuncao()
  debug.Print Application.Caller
  Select Case Application.Caller
    Case "button1": MsgBox "Clicked First button"
    Case "button2": AnotherSub 
  End Select
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.