Есть ли диалог SaveAs?

Я хочу сохранить вложение с SaveAs файл диалога. Можно ли сделать это с VBA и Outlook?

3 ответа

Решение

Я не думаю, что Outlook позволит вам открыть диалоговое окно файла!

Уродливый, но быстрый и функциональный обходной путь, который я использовал, состоит в том, чтобы временно открыть экземпляр Excel и использовать его GetSaveAsFilename метод.

Set xlApp = CreateObject("Excel.application")
xlApp.Visible = False
strSaveAsFilename = xlApp.GetSaveAsFilename
xlApp.Quit
Set xlApp = Nothing

Тогда вы можете сказать MyAttachment.SaveAsFile(strSaveAsFilename),

Если Excel не обязательно установлен, то вы можете сделать аналогичный трюк, используя Word и метод FileDialog (Word не имеет GetSaveAsFilename). См. Справку VBA на FileDialog для примера.

Возможно, есть более элегантное решение, но вышесказанное сработает...

Не забывайте BrowseForFolder функция:

Function BrowseForFolder(Optional OpenAt As String) As String 

Dim ShellApp As Object 

Set ShellApp = CreateObject("Shell.Application"). _ 
BrowseForFolder(0, "Please choose a folder", 0, OpenAt) 

On Error Resume Next 
BrowseForFolder = ShellApp.self.Path 
On Error GoTo 0 

Select Case Mid(BrowseForFolder, 2, 1) 
Case Is = ":" 
    If Left(BrowseForFolder, 1) = ":" Then 
        BrowseForFolder = "" 
    End If 
Case Is = "\" 
    If Not Left(BrowseForFolder, 1) = "\" Then 
        BrowseForFolder = "" 
    End If 
Case Else 
    BrowseForFolder = "" 
End Select 

ExitFunction: 

Set ShellApp = Nothing 

End Function

Есть два способа смоделировать это поведение (я предполагаю, что Outlook 2003 здесь):

Использовать файл "Сохранить вложения

Этот код вызовет программный пункт "Сохранить вложения" в меню "Файл". Три вспомогательные функции, приведенные ниже, необходимы и должны быть вставлены в один и тот же проект. Выберите или откройте письмо с вложениями и запустите SaveAttachments процедура.

Sub SaveAttachments()

Dim obj As Object
Dim msg As Outlook.mailItem
Dim insp As Outlook.Inspector

Set obj = GetCurrentItem
If TypeName(obj) = "MailItem" Then
  Set msg = obj
  Set insp = msg.GetInspector
  With insp
    .Display
    ' execute the File >> Save Attachments control
    .CommandBars.FindControl(, 3167).Execute
    .Close olDiscard ' or olPromptForSave, or olSave
  End With
End If

End Sub

Function GetCurrentItem() As Object
  Select Case True
  Case IsExplorer(Application.ActiveWindow)
    Set GetCurrentItem = ActiveExplorer.Selection.item(1)
  Case IsInspector(Application.ActiveWindow)
    Set GetCurrentItem = ActiveInspector.CurrentItem
  End Select
End Function
Function IsExplorer(itm As Object) As Boolean
  IsExplorer = (TypeName(itm) = "Explorer")
End Function
Function IsInspector(itm As Object) As Boolean
  IsInspector = (TypeName(itm) = "Inspector")
End Function

Обратите внимание, что если есть несколько вложений, вам будет предложено выбрать, какие из них вы хотите сохранить, прежде чем появится диалоговое окно сохранения:

сохранить вложения с несколькими файлами

Используйте BrowseForFolder

Я использую функцию BrowseForFolder, найденную в VBAX. Это покажет диалог BrowseForFolder Shell.Application:

оболочка приложения для поиска папок

Выберите или откройте письмо с вложениями и запустите SaveAttachments процедура. После выбора папки в диалоговом окне все вложения в электронное письмо будут сохранены в выбранной папке.

Sub SaveAttachments()

  Dim folderToSave As String
  Dim obj As Object
  Dim msg As Outlook.mailItem
  Dim msgAttachs As Outlook.attachments
  Dim msgAttach As Outlook.Attachment

  folderToSave = BrowseForFolder

  If folderToSave <> "False" Then

    Set obj = GetCurrentItem
    If TypeName(obj) = "MailItem" Then
      Set msg = obj
      Set msgAttachs = msg.attachments

      For Each msgAttach In msgAttachs
        msgAttach.SaveAsFile folderToSave & "\" & msgAttach.FileName
      Next msgAttach
    End If

  End If

End Sub

Function GetCurrentItem() As Object
  Select Case True
  Case IsExplorer(Application.ActiveWindow)
    Set GetCurrentItem = ActiveExplorer.Selection.item(1)
  Case IsInspector(Application.ActiveWindow)
    Set GetCurrentItem = ActiveInspector.CurrentItem
  End Select
End Function
Function IsExplorer(itm As Object) As Boolean
  IsExplorer = (TypeName(itm) = "Explorer")
End Function
Function IsInspector(itm As Object) As Boolean
  IsInspector = (TypeName(itm) = "Inspector")
End Function
Другие вопросы по тегам