Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
String VBA:循环为范围内的每个单元格创建命令按钮,使用单元格特定参数调用.OnAction过程_String_Vba_Button_Parameters_Arguments - Fatal编程技术网

String VBA:循环为范围内的每个单元格创建命令按钮,使用单元格特定参数调用.OnAction过程

String VBA:循环为范围内的每个单元格创建命令按钮,使用单元格特定参数调用.OnAction过程,string,vba,button,parameters,arguments,String,Vba,Button,Parameters,Arguments,我需要帮助编写一些循环,以便为范围内的每个单元格创建命令按钮。 我实现了创建我需要的任意多个按钮。我的问题是为它们中的每一个设置.OnAction属性。 每个按钮都将通过LotusNotes向指定的地址发送电子邮件,邮件的主题和正文存储在相邻的单元格中。该代码已经生效,下面是发送电子邮件的过程: Sub Send(ByVal MailAddress, Subject, Message As String) Dim Maildb As Object Dim MailDoc As Object D

我需要帮助编写一些循环,以便为范围内的每个单元格创建命令按钮。
我实现了创建我需要的任意多个按钮。我的问题是为它们中的每一个设置.OnAction属性。
每个按钮都将通过LotusNotes向指定的地址发送电子邮件,邮件的主题和正文存储在相邻的单元格中。该代码已经生效,下面是发送电子邮件的过程:

Sub Send(ByVal MailAddress, Subject, Message As String)

Dim Maildb As Object
Dim MailDoc As Object
Dim Body As Object
Dim Session As Object

    Set Session = CreateObject("Lotus.NotesSession")
    Call Session.Initialize
    'Call Session.Initialize("password")
    UserName = Session.UserName
    Set Maildb = Session.GetDatabase("", "C:\Lotus\Notes\Data\names.nsf")
    'Set Maildb = Session.GetDatabase("", MailDbName)
    If Not Maildb.IsOpen = True Then Call Maildb.Open
    Set MailDoc = Maildb.CreateDocument
    Call MailDoc.ReplaceItemValue("Form", "Memo")
    Call MailDoc.ReplaceItemValue("SendTo", MailAddress)
    Call MailDoc.ReplaceItemValue("Subject", Subject)
    Set Body = MailDoc.CreateRichTextItem("Body")
    Call Body.AppendText(Message)
    MailDoc.SaveMessageOnSend = True
    Call MailDoc.ReplaceItemValue("PostedDate", Now())
    Call MailDoc.Send(False)

    Set Maildb = Nothing
    Set MailDoc = Nothing
    Set Body = Nothing
    Set Session = Nothing
End Sub
现在,我要做的是在工作簿打开时创建按钮,遍历我工作表的第一个编译列。接下来,我将在向图纸添加/删除行时添加/删除按钮。为此,我目前有以下代码:

Private Sub Workbook_Open()

   Dim L As Integer
   Dim t As Range
   Dim btn As Button
   Dim arg As String

   Application.ScreenUpdating = False
   ActiveSheet.Buttons.Delete
   Sheets(1).Activate
   L = Application.WorksheetFunction.CountA(Range("C:C"))
   For i = 2 To L
        Set t = ActiveSheet.Range(Cells(i, 1), Cells(i, 1))
        Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top + 5, t.Width, 20)
        'arg = "'Invia  Range("J1").Value , Cells(i, t.Column + 2).Value , Cells(i, t.Column+3).Value '"
        With btn
           .OnAction = arg
           .Caption = "Invia"
           .Name = "Btn" & i
        End With
   Next i
End Sub
我的问题是我无法以正确的方式写入要传递给OnAction属性的字符串。 这应该是对Send过程的调用,包含3个参数: 1) 邮件地址:在单元格J1中找到(静态) 2) 主题:在循环的当前行(i)的C列中找到 3) 正文:在循环的当前行(i)的D列中找到

不能让它工作。 我对VBA很陌生,我对所有这些引号、单引号和双引号都很着迷。
有人能帮帮我吗?
Mhanks提前通知,

Marco

更容易在OnAction子菜单中抓取按钮的名称(使用
Application.Caller
),然后使用该名称确定要采取的操作。在本例中,您可以解析出
i
的值,然后从工作表中获取所需的信息。谢谢,这就是我要找的技巧。工作得很有魅力!这应该是普遍接受的答案。它显示了如何使用单一的'字符使一件困难的事情成为可能
arg = "'Send ""{1}"", ""{2}"", ""{3}"" '" 

arg = Replace(arg,"{1}", Range("J1").Value)
arg = Replace(arg,"{2}", Cells(i, t.Column + 2).Value)
arg = Replace(arg,"{3}", Cells(i, t.Column+3).Value)

.OnAction = arg