【问题标题】:How do I dynamically create a button on my Active Sheet?如何在我的活动工作表上动态创建一个按钮?
【发布时间】:2017-12-16 17:10:32
【问题描述】:

所以我在我的工作簿中创建了一个主菜单,如果用户单击一个按钮,则会创建一个新工作表并打开以供用户查看一些数据。

现在,我想动态地(通过 VBA 代码)在当前活动的工作表上创建一个按钮,其中包含让用户关闭工作表的数据(本质上是删除 ActiveSheet 并返回到主菜单)

我尝试查看 VBA 帮助以获取有关按钮控件的信息,但我只能找到有关 CommandButton 的信息(我相信它只能在用户窗体中使用)。

  • 我的这种看法有错吗?CommandButton 也可以在用户窗体之外使用吗?
  • 或者是否有我找不到的 Button 对象?

我搜索了这个主题,只找到了这篇文章,但它不起作用。如果有帮助,我正在使用 Excel 2010。 How to add a button programmatically in VBA next to some sheet cell data?

【问题讨论】:

  • 为简单起见,您应该使用表单的按钮。
  • 有表单控件和activex,两者都可以添加到工作表中(并且都有一个命令按钮)。如上所述,使用 Form 控件更简单。您可以通过开发者标签探索这些外观。

标签: vba excel


【解决方案1】:

解决此问题的一种方法是使用模板。使用所述按钮创建工作表。在工作表模块中你使用这个:

Private Sub CommandButton1_Click()
    Me.Delete
    ThisWorkbook.Worksheets("MainMenu").Activate
End Sub

在创建工作表时,您会像这样使用此模板:

Public Sub CopySheet()

    ThisWorkbook.Worksheets("Template").Copy After:=Sheets(Sheets.Count)

    With ActiveSheet
        .Name = "Your Name"
    End With

    'Fill with data etc....

End Sub

复制的模板现在有您的删除按钮。还有其他方法可以解决,但这可能是最简单的。

P.s.:要向工作表添加按钮,请在开发人员选项卡中向工作表“添加”表单或 active-X 控件。使用哪一个与模板无关。

【讨论】:

  • 您的命令按钮代码是否需要重定向行以确保用户登陆主菜单选项卡?
  • @QHarr 很好,我过度阅读了那部分。假设他的“主菜单”是一个工作表,而不是该工作簿中唯一需要激活它的另一个工作表,是的。
【解决方案2】:

这是另一种方式...

Sub CreateSheetAddButton()

    ' Set the worksheet to a new sheet
    Dim ws As Worksheet
    With ThisWorkbook
        Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
    End With

    Dim btn As Button
    ' Add a button and assign an onaction macro
    With ws
        .Name = "YourName"
        Set btn = .Buttons.Add(71.25, 26.25, 107.25, 63.75)
    End With

    With btn
        .OnAction = "DeleteWS"
        .Caption = "Delete Current Sheet"
        .Name = "btnDel"
    End With

    ' Clean up
    Set ws = Nothing
    Set btn = Nothing

End Sub

Sub DeleteWS()

    Dim ws As Worksheet, wsMain As Worksheet
    Set ws = ThisWorkbook.ActiveSheet
    Set wsMain = ThisWorkbook.Worksheets("Main")

    With ws
        Application.DisplayAlerts = False
        ws.Delete
        wsMain.Activate
        Application.DisplayAlerts = True
    End With

    ' Clean up
    Set ws = Nothing
    Set wsMain = Nothing

End Sub

【讨论】:

  • 好,简单的例子。一个建议让它多一点 OOP(如果我可以的话):将创建的按钮设置为 Button-Object 而不是“选择”。
  • @Chrowno - 非常感谢。使用对象编辑答案
  • 成功了!但是,我无法理解为什么 VBA 甚至在线都没有关于“按钮”对象的文档。当我手动输入代码时,即使是 VBA 自动完成功能也没有给我任何关于“按钮”的建议。似乎“按钮”应该是“工作表”的成员,但检查“工作表”上的文档也没有表明“按钮”的存在。这有什么原因吗?另外,是否有关于“按钮”对象的任何文档供参考?
  • 它是OleoObjects-Collection的一部分
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多