将具有多个参数的宏指定给按钮VBA

时间:2018-01-18 20:18:58

标签: excel vba excel-vba

我正在研究一个VBA宏,我想在每一行添加按钮。我想为每个按钮分配相同的宏,每行有不同的参数。按钮运行的宏是一个简单的宏,它根据按钮所在行的信息生成一封电子邮件,并将其保存到用户的outlook drafts文件夹中。

我遇到的问题是,当我将电子邮件代码归类为函数时,它会立即运行,而不是将其分配给按钮。当我将它归类为子时,我收到一个编译错误,指出'编译错误:预期函数或变量'

主宏的代码如下:

Sub addButtons()
    Dim lastCol As Integer
    Dim lastRow As Integer
    Dim r As Range
    Dim btn As Button
    Dim uid As String
    Dim rDate As String
    Dim i As Integer

    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    rDate = Str(Date)
    rDate = Replace(rDate, "/", "D")

    For i = 2 To lastRow
        Set r = ActiveSheet.Range(Cells(i, lastCol), Cells(i, lastCol))
        Set btn = ActiveSheet.Buttons.Add(r.Left, r.Top, r.Width, r.Height)
        uid = ActiveSheet.Cells(i, 1).Text
        With btn
            .OnAction = newhireEmail(i, rDate)
            .Caption = "Email " & uid & "?"
            .name = "btn" & (i - 1)
        End With
    Next i

    r.EntireColumn.ColumnWidth = 15
End Sub

我也可以发布电子邮件的代码,但我不相信它应该是相关的,因为我理想的是,除非点击按钮,否则根本不会运行该代码。

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

这可能不是你提出的问题的答案,但我确实想提出几种不同的方法来解决这个问题。

更轻量级的方法之一是订阅工作表扩展的事件(并且您不需要)。例如,当我有一个令人惊讶的类似过程时,我订阅了工作表双击事件。当我双击一个单元格时,它从该行编译信息,并将其传递给电子邮件子程序。

如果你想要一个更直观的线索,但你不想要一个按钮,请考虑使用超链接。这是一个两步过程,但是当我完成这个过程时,它比大量的按钮更快,更有效。 (注意:每个工作表限制为65,530个超链接。如果您需要更多超链接,这将无效。)

首先,生成超链接:

Sub AddHyperlinks()
    Dim lastCol As Long
    Dim lastRow As Long
    Dim s As Worksheet

    Set s = ActiveSheet


    lastCol = s.Cells(1, Columns.Count).End(xlToLeft).Column + 1
    lastRow = s.Cells(s.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        s.Hyperlinks.Add Anchor:=s.Cells(i, lastCol), _
        Address:="", _
        SubAddress:=s.Cells(i, lastCol).Address, _
        TextToDisplay:="Send Email"
    Next i
End Sub

接下来,在相应的工作表中订阅FollowHyperlinks事件,然后在那里生成代码。超链接目标将引用超链接的单元格地址,您可以从中获取任何所需的数据:

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    'Submit whatever code you want here
    MsgBox Target.SubAddress
End Sub