【问题标题】:How to add a command button in VBA?如何在 VBA 中添加命令按钮?
【发布时间】:2015-10-19 11:20:09
【问题描述】:

我正在尝试向 Excel 工作簿添加一个按钮,以便它显示在每个工作表中。对我最初的问题的一个很好的回答给了我一个宏来在每张纸上创建按钮:

Sub AddButtons()
    Dim ws As Excel.Worksheet
    Dim btn As Button

    For Each ws In ThisWorkbook.Worksheets
        Set btn = ws.Buttons.Add(X, Y, W, H)
        [set btn properties]
    Next ws
End Sub

我现在无法设置按钮属性,以便按钮在按下时打印工作表。这里又是我的打印宏:

 Dim WS_Count As Integer
 Dim i As Integer

 ' Set WS_Count equal to the number of worksheets in the active workbook.
 WS_Count = ActiveWorkbook.Worksheets.Count
 'allows user to set printer they want to use
 Application.Dialogs(xlDialogPrinterSetup).Show
 ' Begin the loop.
 For i = 5 To WS_Count
   Worksheets(i).Activate
   With ActiveWorkbook.Worksheets(i).PageSetup
     .PrintArea = "A1:O48"
     .Orientation = xlLandscape
     .Zoom = False
     .FitToPagesTall = 1
     .FitToPagesWide = 1
   End With
   ActiveWorkbook.Worksheets(i).PrintOut

关于如何将此宏合并到按钮属性中(传递变量和创建新的打印子)有一些很好的建议,但是我对 VBA 很陌生,并且未能成功地使其工作。理想情况下,我会有一个按钮宏来创建按钮,每次按下它时都会为每张纸调用打印宏。

最后一件事,我正在尝试更改按钮代码,使其仅将按钮添加到表 5 之后。如果有人也知道如何做到这一点,那就太好了?

任何建议都很有帮助,非常感谢!

【问题讨论】:

    标签: vba excel button


    【解决方案1】:

    试试这个:

    Sub AddButtons()
        Dim ws As Excel.Worksheet
        Dim btn As Button
    
        For Each ws In ThisWorkbook.Worksheets
            Set btn = ws.Buttons.Add(X, Y, W, H)
            btn.OnAction = "MySub"    ' MySub is executed when btn is clicked
            ' Substitute the name of your printing subroutine
            btn.Caption = "Print"
            'set additional btn properties as needed
        Next ws
    End Sub
    

    XY 确定位置,WH 确定按钮大小。

    【讨论】:

    • 谢谢!这为每个页面添加了一个按钮!当我添加按钮属性时,我可以只输入我的 vba 打印代码,还是有办法设置代码,使其仅在按下时激活??
    • @Cam 您应该创建一个新的子,并让该子包含您要打印的代码。 sub 应该需要一个在按下按钮时调用的变量(搜索有关将变量传递给 subs 的信息)。然后在每个按钮中都有代码“Call MyPrintSub(BUTTON_VARIABLE)”。然后你不需要单独从每个按钮复制代码,你只需要从每个按钮调用 sub。这样可以更轻松地编辑所有按钮。
    • 对不起,我对 VBA 和编码还很陌生,我认为你说的很有道理,但我不明白如何实现。你有这方面的代码示例吗? @Grade'Eh'Bacon
    • @Cam 尝试查看这些资源;如果您在执行建议时遇到困难,请提出一个新问题,突出您尝试过的和失败的:stackoverflow.com/a/6252348/5090027stackoverflow.com/questions/2804327/…
    【解决方案2】:

    这将添加一个按钮(表单控件)并为其分配一个现有宏。

    Sub test()
        Dim cb As Shape
        Set cb = Sheet1.Shapes.AddFormControl(xlButtonControl, 10, 10, 100, 25)
        cb.OnAction = "PrintMacro"
    End Sub
    

    Private Sub PrintMacro()
        MsgBox "Test" ' for testing pursposes
        ' you actually put your print code here
    End Sub
    

    现在只添加 Sheet 5 以后的按钮,您可以尝试:

    1. 生成所有工作表名称的列表(如果只有几个)

      Dim shname
      For Each shname In Array("Sheet 5", "Sheet 6", "Sheet 7")
          test Sheets(shname) ' note that you'll have to use below test sub
      Next
      
    2. 反过来做。列出要排除的内容并测试每个工作表是否在列表中。

      Dim sh As Worksheet
      Dim xcludesheet: xcludesheet = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")
      For Each sh In Worksheets
          If IsError(Application.Match(sh.Name, xcludesheet, 0)) Then
              test Sheets(sh.Name)
          End If
      Next
      

    您将在上述示例中使用的测试子。

    Sub test(ws As Worksheet)
        Dim cb As Shape
        Set cb = ws.Shapes.AddFormControl(xlButtonControl, 10, 10, 100, 25)
        cb.OnAction = "PrintMacro"
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 2011-07-27
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多