对在Excel中使用VBA运行时添加的命令按钮的引用

对在Excel中使用VBA运行时添加的命令按钮的引用,excel,vba,button,runtime,Excel,Vba,Button,Runtime,在运行期间,用户可以向工作表1添加任意数量的ActiveX命令按钮。我需要有一个参考这些新的按钮与VBA,但不知道如何 我知道按钮名称将显示的逻辑级数:ex (节点#x2)-2=命令按钮#=i 我需要以某种方式参考这些新创建的按钮,我的想法是这样的: Sheet1.Controls("CommandButton" & i).Select 如果有人知道正确的语法或其他方法,请告知 更新 Public Sub Node_Button_Duplication() ' 'Comments: C

在运行期间,用户可以向工作表1添加任意数量的ActiveX命令按钮。我需要有一个参考这些新的按钮与VBA,但不知道如何

我知道按钮名称将显示的逻辑级数:ex

(节点#x2)-2=命令按钮#=i

我需要以某种方式参考这些新创建的按钮,我的想法是这样的:

Sheet1.Controls("CommandButton" & i).Select
如果有人知道正确的语法或其他方法,请告知

更新

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

' 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


End Sub
跟进

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

Dim shp As Shape

' 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

    Debug.Print Selection.Name

    Set shp = ActiveSheet.Shapes(Selection.Name)

    With shp.OLEFormat.Object.Object
        .Caption = "Test"
        .Left = 15
        .Top = 15
    End With

End Sub
这给了我一个运行时错误“438:对象不支持此属性或方法。我不太明白

shp.OLEFormat.Object.Object
跟进

如果您知道commandbutton的名称,那么您可以像这样更改属性

Option Explicit

Sub Sample()
    Dim shp As Shape

    '~~> Since you already have the name replace "CommandButton1" by
    '~~> the name that you have
    Set shp = ActiveSheet.Shapes("CommandButton1")

    With shp.OLEFormat.Object
        .Object.Caption = "Test"
        .Left = 15
        .Top = 15
    End With
End Sub
您也可以像这样将以上两种方法结合起来

Public Sub Node_Button_Duplication()
    Dim shp As Shape

    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

    '~~> This will give you the name
    Debug.Print Selection.Name

    Set shp = ActiveSheet.Shapes(Selection.Name)

    With shp.OLEFormat.Object
        .Object.Caption = "Test"
        .Left = 15
        .Top = 15
    End With

End Sub
如果需要遍历所有按钮,请使用以下代码

Sub CommanButtons()
    Dim wks As Worksheet
    Dim OLEObj As OLEObject

    '~~> set it as per the relevant sheet
    Set wks = Worksheets("sheet1")

    For Each OLEObj In wks.OLEObjects
        If TypeOf OLEObj.Object Is MSForms.CommandButton Then
            Debug.Print OLEObj.Object.Caption
        End If
    Next OLEObj
End Sub
跟进

如果您知道commandbutton的名称,那么您可以像这样更改属性

Option Explicit

Sub Sample()
    Dim shp As Shape

    '~~> Since you already have the name replace "CommandButton1" by
    '~~> the name that you have
    Set shp = ActiveSheet.Shapes("CommandButton1")

    With shp.OLEFormat.Object
        .Object.Caption = "Test"
        .Left = 15
        .Top = 15
    End With
End Sub
您也可以像这样将以上两种方法结合起来

Public Sub Node_Button_Duplication()
    Dim shp As Shape

    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

    '~~> This will give you the name
    Debug.Print Selection.Name

    Set shp = ActiveSheet.Shapes(Selection.Name)

    With shp.OLEFormat.Object
        .Object.Caption = "Test"
        .Left = 15
        .Top = 15
    End With

End Sub
如果需要遍历所有按钮,请使用以下代码

Sub CommanButtons()
    Dim wks As Worksheet
    Dim OLEObj As OLEObject

    '~~> set it as per the relevant sheet
    Set wks = Worksheets("sheet1")

    For Each OLEObj In wks.OLEObjects
        If TypeOf OLEObj.Object Is MSForms.CommandButton Then
            Debug.Print OLEObj.Object.Caption
        End If
    Next OLEObj
End Sub

假设您有一个名为“cmdOriginal”的命令按钮(OLE对象),您希望复制该按钮并将其粘贴到同一工作表上,并将新按钮的名称和标题更改为“cmdButtonCopy”和“This is a copy”。 新添加的按钮具有OLEObjects集合中最高的索引! 将以下代码放入工作表的“代码”部分

Sub x1()
    Me.OLEObjects("cmdOriginal").Copy
    Me.Paste
    With Me.OLEObjects(Me.OLEObjects.Count)
        .Name = "cmdButtonCopy"
        .Caption = "This is a copy"
    End With
End Sub

假设您有一个名为“cmdOriginal”的命令按钮(OLE对象),您希望复制该按钮并将其粘贴到同一工作表上,并将新按钮的名称和标题更改为“cmdButtonCopy”和“This is a copy”。 新添加的按钮具有OLEObjects集合中最高的索引! 将以下代码放入工作表的“代码”部分

Sub x1()
    Me.OLEObjects("cmdOriginal").Copy
    Me.Paste
    With Me.OLEObjects(Me.OLEObjects.Count)
        .Name = "cmdButtonCopy"
        .Caption = "This is a copy"
    End With
End Sub

用户是如何创建命令按钮的?手动还是通过代码?当用户单击“添加节点”按钮时,ActiveX按钮(在运行时开始时存在)将被复制并粘贴到适当的位置。我需要访问这些新按钮,以便在运行时更改它们的行为。我也考虑过使用VBA重复创建按钮,但不确定哪一个更可取。你能更新上面用于复制和粘贴现有按钮的代码吗?啊,我刚刚意识到。是否与上一个问题中的相同?用户是如何创建命令按钮的?手动还是通过代码?当用户单击“添加节点”按钮时,ActiveX按钮(在运行时开始时存在)将被复制并粘贴到适当的位置。我需要访问这些新按钮,以便在运行时更改它们的行为。我也考虑过使用VBA重复创建按钮,但不确定哪一个更可取。你能更新上面用于复制和粘贴现有按钮的代码吗?啊,我刚刚意识到。它与您上一个问题中的相同吗?我已经知道命令按钮的名称,但我希望以后可以访问它。例如,我将有5个按钮,我希望访问按钮3,但不知道VBA语法。我的猜测与我的问题中给出的类似。按钮编号是一个整数变量。E本质上,我想知道如何将变量连接到“CommandButton”“在类似Sheet1.CommandButton&i.Selected的内容中,访问它意味着什么?选择它?或者类似于
Application.Caller
?我想更改命令按钮的属性,例如标题、宏、删除等。代码很好。此外,我希望有类似ActiveSheet.Shapes(“CommandButton”&Str(I))的东西。选择将整数变量连接到字符串“CommandButton”的位置因此,我可以通过适当的I变量值访问任何按钮。我已经包含了我使用的代码,但给了我一个运行时错误。我已经知道命令按钮的名称,但我希望以后能够访问它。例如,我将有5个按钮,我想访问按钮3,但不知道VBA语法。我的猜测与我的问题类似。按钮编号是一个整数变量。基本上,我想知道如何将变量连接到Sheet1中的“CommandButton”命令。CommandButton&I.select访问它是什么意思?选择它?或者类似于
Application.Caller
?我想更改命令按钮的属性,例如标题、宏、删除等。代码很好。此外,我希望有类似ActiveSheet.Shapes(“CommandButton”&Str(I))的东西。选择将整数变量连接到字符串“CommandButton”的位置,这样我就可以通过适当的I变量值访问任何按钮。我已经包含了我使用的代码,但给出了一个运行时错误