【发布时间】:2018-01-18 20:18:58
【问题描述】:
我正在开发一个 VBA 宏,我想为每一行添加按钮。我想为每个按钮分配相同的宏,每行具有不同的参数。按钮运行的宏是一个简单的宏,它根据按钮所在行的信息生成一封电子邮件,并将其保存到用户的 Outlook 草稿文件夹中。
我遇到的问题是,当我将电子邮件代码归类为函数时,它会立即运行,而不是将其分配给按钮。当我将它归类为子时,我收到一个编译错误,指出“编译错误:预期的函数或变量”
主宏代码如下:
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
我也可以发布电子邮件的代码,但我不认为它应该是相关的,因为我希望除非单击按钮,否则根本不运行该代码。
感谢您的宝贵时间!
【问题讨论】:
-
我过去曾推荐过此方法,但有时我更喜欢使用格式化为看起来像按钮的单元格并捕获工作表的
Selection_Change事件,而不是使用表单按钮。然后,您可以拥有一个使用Target的宏来获取您所在的特定行。 -
你的函数
newhireEmail在哪里? -
我在上一个答案中没有说,但是您也可以使用
Application.Caller来获取按钮的名称并让您的每个按钮都指向同一个宏 - 它比创建更干净每个按钮都有一个新的子按钮。 -
只是为了重新考虑您的项目,如前所述,我将有一个电子邮件按钮并使用行中的一个单元格进行选择。第一条评论是正确的,因为行中的太多按钮将成为文件大小和屏幕刷新的怪物。不是你不能做,而是你不应该做。做出选择,然后使用可重复使用的代码对该目标采取行动。