2008-09-02 13 views
2

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

В идеале, сборщик каталогов должен, по крайней мере, разрешить вручную вставить путь к файлу/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) 

Другие идеи?

ответ

2

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

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