在VBA中生成ActiveX命令按钮并将代码分配给它们

发布于 2025-02-03 10:54:33 字数 1466 浏览 2 评论 0原文

我正在研究一个任务,其中它需要动态生成ActiveX命令按钮并自动为其分配某些代码。每次关闭工作表时,都需要删除命令按钮(已完成),但是该按钮的代码仍保留。

因此,我正在尝试查找将代码分配给命令按钮的代码,然后检查是否存在相同的子,然后将其删除并创建具有所需代码的相同名称的新sub。

我的代码是

Public WS As Worksheet


Sub MyButton()

Dim j, p, q As Integer
Dim ShButton As OLEObject
Dim rng As Range
Dim Code As String

Set WS = ThisWorkbook.Worksheets("Sheet1")

j = 0
p = 1
q = 3

For j = 29 To WS.Cells(Rows.Count, "E").End(xlUp).Row
    Set rng = WS.Range("C" & j)

    Set ShButton = WS.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, _
            Left:=rng.Left, Top:=rng.Top, Width:=rng.Width, Height:=rng.RowHeight * 3 / 4)
    
    WS.OLEObjects("CommandButton" & q).Object.Caption = "My Button " & p
    WS.OLEObjects("CommandButton" & q).Object.WordWrap = True
    
    
    ' ##Need code to Check Duplicate sub and delete it if exists

    Code = ""
    Code = "Private Sub CommandButton" & q & "_Click()" & vbCrLf
    Code = Code & "MsgBox " & Chr(34) & "Worksheet name is " & Chr(34) & " & ActiveSheet.Name" & vbCrLf  ' ##Demo Code
    Code = Code & "End Sub"
    Debug.Print Code
    
    With ActiveWorkbook.VBProject.VBComponents(Worksheets("Sheet1").CodeName).CodeModule
        .insertlines .CountOfLines + 1, Code
    End With
    
    
    
    
    p = p + 1
    q = q + 1
Next j

End Sub

只是以编程为命令按钮添加代码,然后删除先前的同名代码也会做

I'm working on a task where it needs to generate ActiveX Command Buttons dynamically and assign certain code to them automatically. Each time I close the Worksheet, the command button needs to be deleted (it is completed), but code for that button remains.

So I'm trying to find code which will assign a code to the command button while checking if same sub exists, if it exists then delete it and create new sub with same name having the code I need.

My code is

Public WS As Worksheet


Sub MyButton()

Dim j, p, q As Integer
Dim ShButton As OLEObject
Dim rng As Range
Dim Code As String

Set WS = ThisWorkbook.Worksheets("Sheet1")

j = 0
p = 1
q = 3

For j = 29 To WS.Cells(Rows.Count, "E").End(xlUp).Row
    Set rng = WS.Range("C" & j)

    Set ShButton = WS.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, _
            Left:=rng.Left, Top:=rng.Top, Width:=rng.Width, Height:=rng.RowHeight * 3 / 4)
    
    WS.OLEObjects("CommandButton" & q).Object.Caption = "My Button " & p
    WS.OLEObjects("CommandButton" & q).Object.WordWrap = True
    
    
    ' ##Need code to Check Duplicate sub and delete it if exists

    Code = ""
    Code = "Private Sub CommandButton" & q & "_Click()" & vbCrLf
    Code = Code & "MsgBox " & Chr(34) & "Worksheet name is " & Chr(34) & " & ActiveSheet.Name" & vbCrLf  ' ##Demo Code
    Code = Code & "End Sub"
    Debug.Print Code
    
    With ActiveWorkbook.VBProject.VBComponents(Worksheets("Sheet1").CodeName).CodeModule
        .insertlines .CountOfLines + 1, Code
    End With
    
    
    
    
    p = p + 1
    q = q + 1
Next j

End Sub

OR Simply to add a code to command button programmatically and delete the previous same name code will do also

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猥琐帝 2025-02-10 10:54:33

感谢@funthomas的建议。根据您的建议,我尝试将简单的按钮和gonaction命令添加到它,并且它也简化了我的代码(我不再需要为此创建新的子),

我将共享代码i i修改后,

   For i = 1 To UBound(arrFile)
    strtRow = 29
    Set ParamWS = ThisWorkbook.Worksheets("Sheet1")
    ' My other code is here to print data starting from Row 29(each row in each loop)

    Set rng = ParamWS.Range("C" & strtRow)
    p = strtRow - 28
    Set ShButton = ParamWS.Buttons.Add(Left:=43.5, Top:=rng.Top + 10, Width:=92, Height:=46)

    With ShButton
      .OnAction = "Module3.create_sheetFromButton"
      .Caption = "Single Button" & p
      .Name = strtRow
    End With

    strtRow = strtRow + 1

   Next i

我在主代码末尾删除了所有按钮,也没有为按钮创建任何新的子(得益于oncation的建议),所以我不知道需要检查重复的子。

Thanks @funthomas for your suggestion. As per your suggestion, I've tried adding simple button and OnAction Command to it, and it simplified my code also (I no longer needed to create new sub for this)

I'll share the code I've modified

   For i = 1 To UBound(arrFile)
    strtRow = 29
    Set ParamWS = ThisWorkbook.Worksheets("Sheet1")
    ' My other code is here to print data starting from Row 29(each row in each loop)

    Set rng = ParamWS.Range("C" & strtRow)
    p = strtRow - 28
    Set ShButton = ParamWS.Buttons.Add(Left:=43.5, Top:=rng.Top + 10, Width:=92, Height:=46)

    With ShButton
      .OnAction = "Module3.create_sheetFromButton"
      .Caption = "Single Button" & p
      .Name = strtRow
    End With

    strtRow = strtRow + 1

   Next i

I'm deleting all the buttons at the end of my main code, also I'm not creating any new sub for buttons (Thanks to the suggestion of OnAction), so I don't need to check for duplicate sub.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文