【问题标题】:VBA Excel 2010 - How to assign a macro to a command button that was made with a macroVBA Excel 2010 - 如何将宏分配给使用宏创建的命令按钮
【发布时间】:2016-04-14 11:39:22
【问题描述】:

我有一个创建命令按钮的宏,但是我无法将任何宏分配给 VBA 中的按钮

查看了this 链接,但它是一个用户表单(但我还不够好,无法更改它以适应我的需要)

我目前正在处理的代码如下,我猜我需要在With 语句中添加一些内容,但我不知道会是什么

Dim MyR As Range, MyB As OLEObject
Dim MyR_T As Long, MyR_L As Long


    Set MyR = Range("I3") 'just an example - you get that from your own script
    MyR_T = MyR.Top         'capture positions
    MyR_L = MyR.Left        '...
    'create button
    Set MyB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False)

    'set main button properties
    With MyB
        .Name = "MyPrecodedButton"          'important - code must exist ... see below
        .Object.Caption = "Load UseForm"
        .Top = MyR_T
        .Left = MyR_L
        .Width = 130
        .Height = 30
        .Placement = xlMoveAndSize
        .PrintObject = True                 'or false as per your taste
    End With

【问题讨论】:

  • 实际上知道为什么需要动态按钮会很有趣,也许最好有一个列表框和一个按钮。但我只是古玩,我不想质疑你的设计;)
  • @Doktor OSwaldo ,我不介意它是否受到质疑,如果有其他方法可以做到这一点,我会调查它,但我需要动态按钮的原因是(这里的人是 [侮辱])所以当创建新数据集时,会有一个供人们立即使用的按钮,我们的许多 Excel 文档都有 50 多张。我已经能够使用表单按钮来做到这一点,但是众所周知这里的人会破坏宏
  • 你有没有想过用鼠标选择移动一个按钮,或者我做了什么,例如鼠标双击处理程序?
  • 无权访问计算机 atm,如果您可以创建按钮数组,则该按钮的索引将传递给事件处理程序。因此,您可以从同一个事件处理程序中唯一标识每个按钮

标签: vba excel macros


【解决方案1】:

因此,从您发布的您自己的链接中,您的代码将如下所示:

Set UF = ActiveWorkbook.VBProject.VBComponents("Name_of_the_userform")

With UF.CodeModule
    .InsertLines 2, _
                 "Private Sub " & MyB.Name & "_Click()" & Chr(13) & _
                 "****HERE COMES YOUR FUNCTION CALL FOR THE BUTTON****" & Chr(13) & _
                 "End Sub"
End With

但这仅适用于 activeX 按钮。它所做的是相当黑客......所以如果你有更好的解决方案,我不会推荐这个。它的作用是:每个 ActiveX 按钮都有一个 onclick 函数,其语法如下:“ButtonName_Click()” 如果您在代码中的某处放置此行,它将在单击时执行。现在代码的作用(如您发布的链接中)是将这些函数写入用户表单代码。

【讨论】:

  • 我不确定,但通过这一行 Set MyB = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _ Link:=False, DisplayAsIcon:=False) 我认为他正在添加表单按钮,它不是 ActiveX,因此它没有显式调用函数 name_Click()。还是我错了?
  • @Paul Ogilvie 我只是在帮助他调整自己的链接。我没说这是最好的方法
  • @Doktor OSwaldo ,我对您的代码试图做什么只有一个模糊的概念(在 Sub 中创建一个 Sub?),老实说,我知道如何使其适应按钮的代码
  • @Mr.Burns activeX 按钮具有默认行为,点击时它们调用函数“buttonName”_Click9()。所以他坚持,你会写宏,这会创建另一个宏。
  • @Mr.伯恩斯我编辑并试图解释它的作用,记住这不是我推荐你的,但我认为你正在寻找这个,因为你发布了链接
【解决方案2】:

使用.onAction方法

类似的东西

Sheets("someVeryFunnySheetName").buttons("someSeriousButtonName").onAction = "macroName"

这是一个示例,如果您想将参数传递给该宏(我认为 axleOutputSHeetCounter 是一个整数)

With chartSheet.Buttons("closeOutputSheet")
    .OnAction = "'Module7_Axle.closeOutputSheet """ & axleOutputSheetCounter & """'"
    .Characters.text = "Delete sheet"
    .Characters.Font.Size = 16
End With

编辑:对于 activeX 按钮 here,您可以找到具有相同问题和有效解决方案的问题

【讨论】:

  • 我尝试了.OnAction 方法,它们不适用于命令按钮,认为它适用于表单控制按钮,我正在使用命令按钮,所以其他人不能轻易弄乱我的宏/工作表
  • @Mr.Burns 这就是您需要 activeX 按钮而不是表单按钮的原因吗? (我很久以前切换到表单按钮,在 MS 辉煌更新后,它 f*cked 了所有 activeX 对象)
  • 是的,要编辑 ActiveX 按钮,您需要在禁用宏的情况下加载文档,而且这里没有多少人知道,所以他们不能对我的按钮执行任何操作,表单按钮您可以右键单击它们并更改您的需要(或删除它们)
  • @Mr.Burns no no :) 我认为问题是,在安全更新后,所有 activeX 对象都开始抛出错误。您需要删除一些临时文件并重新制作所有工作表。向客户解释这很有趣:)
  • 我之所以接受你的回答是因为它的可行性,更容易根据用户的需要来暗示、理解和改变
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2014-04-02
相关资源
最近更新 更多