Средство выбора каталога для макроса Visual Basic в MS Outlook 2007

Я написал макрос Visual Basic для архивации вложений для Outlook 2007, но не нашел полностью удовлетворительного способа отображения средства выбора каталога из макроса Outlook. Теперь я мало знаю ни о Windows API, ни о программировании VB(A), но «стандартный» диалог файлов Windows, который я чаще всего вижу в приложениях Microsoft, кажется очевидным выбором, но он не кажется легкодоступным. из макросов Outlook.

В идеале средство выбора каталога должно, по крайней мере, позволять вручную вставлять путь к файлу/URI в качестве отправной точки для навигации, поскольку иногда у меня уже открыто окно проводника для того же каталога.

Каковы наилучшие варианты выбора каталогов в макросах Outlook?

Две вещи, которые я уже пробовал и не нашел полностью удовлетворительными, это (код упрощен и без обработки ошибок и, вероятно, также работает в более старых версиях Outlook):

1) Использование Shell.Application, которое не позволяет мне фактически вставить начальную точку через буфер обмена или выполнять другие операции, такие как переименование папок:

  Set objShell = CreateObject("Shell.Application")
  sMsg = "Select a Folder"
  cBits = 1
  xRoot = 17
  Set objBFF = objShell.BrowseForFolder(0, sMsg, cBits, xRoot)
  path = objBFF.self.Path

2) Использование Office.FileDialog из Microsoft Word 12.0 Object Library (через инструменты/ссылки), а затем использование диалогового окна файла Word, которое каким-то образом появляется навсегда в моей системе Vista и не всегда фактически выводит Word на передний план. Вместо этого иногда Outlook блокируется, и диалоговое окно с файлом остается где-то в фоновом режиме:

  Dim objWord As Word.Application
  Dim dlg As Office.FileDialog
  Set objWord = GetObject(, "Word.Application")
  If objWord Is Nothing Then
     Set objWord = CreateObject("Word.Application")
  End If
  objWord.Activate
  Set dlg = objWord.FileDialog(msoFileDialogFolderPicker)
  path = dlg.SelectedItems(1)

Любые другие идеи?


person Stefan    schedule 02.09.2008    source источник


Ответы (1)


Лучше всего, вероятно, будет использовать для этого Windows32 API. См. эту статью MSDN для примера кода VBA на как взаимодействовать с API.

В статье описывается несколько различных методов, но я бы посоветовал найти в статье «COMDLG32.dll» и выполнить шаги, описанные в этом разделе.

person Tim Lentine    schedule 02.09.2008