【问题标题】:Searching For Newly Added Command Button Procedure in VBA Excel在 VBA Excel 中搜索新添加的命令按钮过程
【发布时间】:2012-05-26 10:50:13
【问题描述】:

Reference

我正在尝试通过在 VBE 中的 sheet1 中查找过程语句的行号,然后将代码添加到下一行,将代码(子例程调用)添加到 Sheet1 中的过程。下面的代码试图实现这一点。

' This will search for and modify the appropriate Node#button_Click() subroutine
    With ActiveWorkbook.VBProject.VBComponents("Sheet1").CodeModule
            ProcLineNum = .ProcStartLine("Node" & NumNodes & "Button" & "_Click", 0)
            .InsertLines ProcLineNum + 1, "load_node_form(" & DQUOTE & "Node " & NumNodes & DQUOTE & ")"
    End With

整个子程序如下:

Public Sub Node_Button_Duplication()
'
'Com: Copies and pastes Node 1's button to the appropriate column

Dim shp As Shape
Dim code As String
Dim ProcLineNum As Long
Const DQUOTE = """"

' Copy Node 1 button and paste in appropriate location

    ActiveSheet.Shapes("CommandButton1").Select
    Selection.Copy
    Cells(5, 10 + 7 * (NumNodes - 1) - 1).Select
    ActiveSheet.Paste
    Selection.ShapeRange.IncrementLeft 47.25
    Selection.ShapeRange.IncrementTop -13.5


    Set shp = ActiveSheet.Shapes(Selection.Name)

    With shp.OLEFormat.Object
        .Object.Caption = "Node" & Str(NumNodes)
        .Name = "Node" & NumNodes & "Button"
    End With

' This will search for and modify the appropriate Node#button_Click() subroutine
    With ActiveWorkbook.VBProject.VBComponents("Sheet1").CodeModule
            ProcLineNum = .ProcStartLine("Node" & NumNodes & "Button" & "_Click", 0)
            .InsertLines ProcLineNum + 1, "load_node_form(" & DQUOTE & "Node " & NumNodes & DQUOTE & ")"
    End With

End Sub

子程序将复制并粘贴一个按钮(“CommandButton1”),重命名它,然后尝试分配一个子程序调用。查找过程的问题是,一旦创建了新按钮,“CommandButton#_Click() 过程不会出现在 VBE 中,直到我从编辑器中选择它,因此当我的代码尝试搜索时会导致错误对于那个程序。

【问题讨论】:

  • 只是一个想法,但我想有更简单的方法来做你正在做的事情。基本上,创建一个菜单项来执行您的按钮操作,并使菜单项上下文相关,例如,作用于活动行。并不是说我对您的项目一无所知,而是我早期做过一个需要管理许多按钮的项目,然后了解到有更好的方法。
  • 可能有一种更简单的方法——这只是我正在探索的一种途径。基本上最终效果是用户可以添加任意数量的按钮,每个按钮都将加载相同的表单,但按下哪个按钮决定了表单中某些字段的填充,例如button1 将加载 form1 将显示 button1 数据,button2 将加载 form1 将显示 button2 数据等。
  • 除非出于某种原因您真的需要它们,否则我会跳过命令按钮 (ActiveX),而使用更简单的“表单类型”按钮甚至是简单的形状。您可以设置一个宏来处理所有调用,并根据按钮的名称决定要做什么(使用Application.Caller 在宏中获取此信息)
  • 表单按钮对按钮事件的控制似乎比 ActiveX 按钮少。我试图定义表单按钮的行为,但我所能做的就是为其分配一个宏。如果表单按钮可以为我提供与按钮事件属性相同的代码控制,那么我可能会进一步研究表单按钮。但似乎 ActiveX 让我无需太多探索就可以控制...

标签: excel vba button command


【解决方案1】:

这是你正在尝试的吗?

Option Explicit

Public Sub Node_Button_Duplication()
    Dim shp As Shape
    Dim code As String
    Dim ProcLineNum As Long, NumNodes As Long

    Const DQUOTE = """"

    ActiveSheet.Shapes("CommandButton1").Select
    Selection.Copy
    Cells(5, 10 + 7 * (NumNodes - 1) - 1).Select
    ActiveSheet.Paste
    Selection.ShapeRange.IncrementLeft 47.25
    Selection.ShapeRange.IncrementTop -13.5

    Set shp = ActiveSheet.Shapes(Selection.Name)

    With shp.OLEFormat.Object
        .Object.Caption = "Node" & Str(NumNodes)
        .Name = "Node" & NumNodes & "Button"
    End With

    With ActiveWorkbook.VBProject.VBComponents( _
    ActiveWorkbook.Worksheets("Sheet1").CodeName).CodeModule
        .InsertLines Line:=.CreateEventProc("Click", "Node" & NumNodes & "Button") + 1, _
        String:=vbCrLf & _
        "load_node_form(" & DQUOTE & "Node " & NumNodes & DQUOTE & ")"
    End With
End Sub

【讨论】:

  • 我从上面的代码中得到一个“运行时错误'9':下标超出范围”错误。
  • 你有一张名为“Sheet1”的工作表
  • 英雄!一如既往的感谢!很高兴您的帮助!
猜你喜欢
  • 1970-01-01
  • 2015-10-19
  • 2015-06-11
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多