我正在研究一个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
我也可以发布电子邮件的代码,但我不相信它应该是相关的,因为我理想的是,除非点击按钮,否则根本不会运行该代码。
感谢您的时间!
答案 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