【问题标题】:Passing variable between subs with user form使用用户表单在 subs 之间传递变量
【发布时间】:2014-07-03 15:32:48
【问题描述】:

我有一个用户表单,它模仿电子邮件表单(收件人、抄送、附件、正文、主题等),并添加了一个填充有名称列表的列表框。用户选择一个名称,“收件人:”列表框将填充适当的电子邮件地址。接下来 FileDialogOpen 弹出,用户选择附件(附件框填充所选文件的名称)。这对我来说很棘手。

选择附件后,用户可以填写“主题”和“正文”,然后单击调用 SendEmail 子的“确定”按钮,但实际附件路径无法传递,因为该子 (GetFiles) 已经完成。如何存储稍后为 SendEmail 子调用的文件路径?这是我已经拥有的sn-ps。

Sub GetFiles() 'Multi File picker dialog box

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
Dim vSelectedItems As Variant

Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = True
GetFile = Application.FileDialog(msoFileDialogOpen).Show

If GetFile <> 0 Then
    For i = 1 To Application.FileDialog(msoFileDialogOpen).SelectedItems.Count
        strPath = Application.FileDialog(msoFileDialogOpen).SelectedItems(i)
    Next i
End If
With fd
For Each vSelectedItems In .SelectedItems
    Items = vrtSelectedItems
Me.AttachBox.AddItem vSelectedItems

Next vSelectedItems
End With

在用户确认要发送电子邮件的信息正确后,单击“确定”按钮附加的发送电子邮件。

Private Sub OKButton_Click()
Dim OutApp As Object
Dim OutMail As Object
Dim sEmail As Variant
Dim myArray As Variant

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

myArray = ListBox1.List(ListBox1.ListIndex, 0) 'retrieving name selected and adding          email addresses
Set found = Cells.Find(What:=myArray, After:=ActiveCell, LookIn:=xlFormulas, Lookat:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False)

Set sEmail = Range(found.Offset(0, 1), found.End(xlToRight))
sEmail.Copy

sRecipient = ""
For Each Item In sEmail
       sRecipient = sRecipient & ";" & Item.Value
Next

On Error Resume Next
With OutMail
    .To = sRecipient
    .CC = CC.Value
    .BCC = ""
    '.FROM = ""
    .Subject = Subject.Value
    .Body = Body.Value
     For Each vSelectedItems In GetFile 'no passing of file paths :(
        .Attachments.Add Item
     Next vSelectedItems
    .Send
End With
On Error GoTo 0

Set OutMail = Nothing
Set OutApp = Nothing

Range("A1").Activate
Call CancelButton_Click
End Sub

答案可能会盯着我看,但我既不是专家也不是新手。提前致谢。

【问题讨论】:

标签: excel vba


【解决方案1】:

尝试在 GetFiles 子之外声明 vSelectedItems 变量。这将使变量在模块级别可用,以便 OKButton_Click() 子可以访问它。

Private vSelectedItems as Variant

Sub GetFiles()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = True
    GetFile = Application.FileDialog(msoFileDialogOpen).Show

    If GetFile <> 0 Then
        ReDim vSelectedItems(Application.FileDialog(msoFileDialogOpen).SelectedItems.Count)
        For Each Item In Application.FileDialog(msoFileDialogOpen).SelectedItems
            vSelectedItems(i) = Item
            Me.AttachBox.AddItem vSelectedItems(i)
            i = i + 1
        Next Item
    End If

End Sub

Private Sub OKButton_Click()

    <... code ...>

    .Body = Body.Value
    For Each Item In vSelectedItems
        .Attachments.Add Item
    Next Item
    .Send

    <... code ...>

End Sub

【讨论】:

  • 谢谢,我明白了这个概念,但我认为我的新问题在于 For Each In 中的 For Each vSelectedItems In GetFile 'no passing of file paths :( .Attachments.Add Item Next vSelectedItems。 “In”应该引用什么?
  • 这需要更改为遍历 vSelectedItems 数组:对于 vSelectedItems 中的每个项目
  • 我认为真正的问题是,一旦用户选择了文件,宏基本上就会停止,因此用户可以验证/编辑 Body/Subject 字段中的信息,并且 vSelectedItems 变量为空。宏使用 OKButton_Click 启动备份。我是否正确并假设变量为空?我考虑过将文件路径临时存储在不同的工作表上,并在 OKButton_Click 中调用它们。无论如何,感谢您的帮助和建议。干杯!
  • 我发现 vSelectedItems 变量没有被 GetFiles 子填充。我已经更新了上面的代码。 vSelectedItems 将是一个数组,其大小将取决于所选文件的数量。 For Each 循环将使用文件路径填充数组,并将文件路径添加到 AttachBox。然后 OK_Button_Click 子可以访问 vSelectedItems 数组
  • 非常感谢!除了一件事之外,这一切都差不多了。它只附加一个文件。我可以单步执行 OK_Button,并且可以看到 For Each Item 循环两次(我选择了两个文件),但只有 GetFiles For Each 中的最后一个文件被填充在数组中。奇怪的是它知道数组大小但只看到最后一个文件路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多