Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用表中不同行的值运行Excel宏?_Excel_Vba - Fatal编程技术网

如何使用表中不同行的值运行Excel宏?

如何使用表中不同行的值运行Excel宏?,excel,vba,Excel,Vba,我正在编写一个Excel宏,用于从电子表格中的数据发送电子邮件。数据位于一个表中,每列提供不同的变量来创建电子邮件(收件人:、抄送:、主题、附件等) 我有宏在表的一行上执行我想要的操作。我的问题是: 如何缩放VBA代码以使其适用于表格的每一行?我希望每行中都有一个超链接,以便使用该行中的数据运行宏。下面是我的代码的一个小片段作为示例: Sub SendMail() Dim xContractNumber As String xContractNumber = Worksheets("Progra

我正在编写一个Excel宏,用于从电子表格中的数据发送电子邮件。数据位于一个表中,每列提供不同的变量来创建电子邮件(收件人:、抄送:、主题、附件等)

我有宏在表的一行上执行我想要的操作。我的问题是:

如何缩放VBA代码以使其适用于表格的每一行?我希望每行中都有一个超链接,以便使用该行中的数据运行宏。下面是我的代码的一个小片段作为示例:

Sub SendMail()
Dim xContractNumber As String
xContractNumber = Worksheets("Program Info").Range("L10").Value
End Sub

在上面的示例中,我想要一个超链接,它使用“程序信息”表第10行中的数据运行宏。。。以及另一个按钮或链接,该按钮或链接将使用第11行中的数据运行宏,依此类推。

此答案尝试将所有人已经给出的许多好答案和注释结合起来。下面的代码以浓缩的方式包含按钮和超链接的功能

此代码可以放在一个单独的模块中:

Sub SendMailByButton()
  SendMailForRow ActiveSheet.Buttons(Application.Caller).TopLeftCell.Row
End Sub

Sub SendMailForRow(ByVal r As Long)
  If r < 1 Then Exit Sub 'Failsafe in case the row number is invalid

  Dim xContractNumber As String, xValueInColumnM As String, xValueInColumnN As String

  xContractNumber = ActiveSheet.Cells(r, 12).Value 'Col 12 is col "L"
  xValueInColumnM = ActiveSheet.Cells(r, 13).Value
  xValueInColumnN = ActiveSheet.Cells(r, 14).Value
  '...etc.
  '...Rest of code to send the actual email
End Sub
每个手动超链接必须链接到其所在的同一单元格(即,链接到“本文档中的位置”,单元格引用设置为其当前单元格)

问题仍然是,您需要为表中的每一行手动创建一个按钮或超链接,这可能是一个麻烦,特别是如果有许多行,或者如果行的数量将来可能会增加的话

避免此问题的一种方法是在表格顶部有一个额外的按钮,允许用户为每行数据自动创建按钮和/或超链接(如果表格缩小,则删除多余的按钮或超链接)。这可能需要您发布一个单独的问题

另一种规避此问题的方法是完全放弃按钮,而是使用带有本机函数的Excel公式(替换“常规”链接)。在这种情况下,将不再需要上面的FollowHyperlink事件处理程序,但您需要添加以下函数(它可以位于
SendMailForRow
将驻留的同一模块中)

然后,您必须在每一行(在您想要超链接的列中)创建一个Excel公式,如下所示

输入此公式将在单元格中自动生成超链接,并在单击超链接时通知Excel执行函数
SendMailByHLink
。“#”后面的函数应该返回链接的目标,这就是为什么
SendMailByHLink
返回
ActiveCell
,以确保焦点保持在该单元格上(如果愿意,可以返回另一个单元格,如
ActiveCell.Offset(,-2)
以便在单击链接后,用户被带回到同一行中的单元格2列)。在将
ActiveCell
返回Excel之前,
SendMailByHLink
将执行电子邮件发送代码

使用超链接公式的好处在于,您可以轻松地在表中的所有行上下复制/粘贴公式。因此,如果表的大小增加,用户所要做的就是将超链接公式复制/粘贴到新行中。如果表格缩小,用户还可以删除多余的超链接公式。如果数据被保存,Excel甚至可以自动复制公式


抱歉给你额外的解释。如果你专注于代码块,你会发现解决方案比看起来更简单。

是按钮还是超链接?超链接可以很好地工作我已经有了一个按钮解决方案:)你可以使用这种策略来获得按下按钮的行号OK,按钮也起作用:)小旁注-如果超链接公式出现在P5中,那么您可以只执行ROW()。@BigBen,您完全正确!加入P5太过分了。ROW()足以获取公式单元格的当前行。谢谢。@BigBen,事实证明,我在超链接公式中使用Excel的行函数是错误的。我修改了答案,这样超链接公式将调用VBA函数,而无需向其传递行号,由于该函数可以从
ActiveCell
@NoahBridge中自己获取行,因此非常感谢您,这个答案非常有助于我更接近于解决这个问题,也有助于我更多地了解VBA。@NoahBridge我找到了缺少的链接。我所有的代码都在PERSONAL.XLSB工作簿上(我保存了所有全局宏)。一旦我将代码移动到活动工作簿上的一个模块,它就工作了。非常感谢你!
'This event is fired when the hyperlink is clicked
Private Sub Worksheet_FollowHyperlink(ByVal target As Hyperlink)
  On Error Resume Next
  SendMailForRow target.Range.Row
End Sub
Function SendMailByHLink()
  SendMailForRow ActiveCell.Row
  Set SendMailByHLink = ActiveCell
End Function
=HYPERLINK("#SendMailByHLink()", "Send email")