VBA: Получите Excel FileDialogOpen, чтобы указать на «Мой компьютер» по умолчанию

Я пытаюсь заставить excels сохранять и открывать диалоговые окна, чтобы по умолчанию открывать «мой компьютер», чтобы пользователь мог выбрать диск оттуда.

У меня есть диалоговые окна для открытия любого пути на любом диске или моих документах и ​​т. Д., Но он не может найти способ открыть его для моего компьютера.

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

MsgBox objFolders("desktop") ChDrive objFolders("desktop") ChDir objFolders("desktop") strFileName = appRemoteApp.Workbooks("Export Template.xlsm").Application.GetSaveAsFilename(objFolders("desktop") & "\Replica Export " & UserName & " " & Format(Date, "yymmdd") & ".xlsm", FileFilter:="Excel Macro Enabled Workbook (*.xlsm), *.xlsm,") 

Кроме того, я нашел это с этого сайта .

Если вы вставляете ::{20D04FE0-3AEA-1069-A2D8-08002B30309D} в адресную строку ::{20D04FE0-3AEA-1069-A2D8-08002B30309D} окон, он переносит вас на мой компьютер, но если я использую это в своем коде VBA

 ChDir "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" 

он говорит, что не может найти каталог или что-то в этом роде. Поэтому не уверен, есть ли работа для этого или что-то еще.

Это тоже не сработало:

 ChDir "C:\WINDOWS\explorer.exe /root,,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" 

Причина, по которой я хочу открыть диалоговые окна для компьютера, заключается в том, что мы будем размещать документ excel на сервере Windows с доступом, хотя RemoteApp и удаленный рабочий стол. Пользователи не будут иметь доступа (прав) к дискам и папкам серверов и т. Д., Они будут иметь доступ только к своим собственным дискам на своих локальных машинах, которые будут отображены и видны под папкой «Мой компьютер» из-за отсутствия лучшего слово. Главный документ на сервере генерирует реплику с использованием кода VBA и затем сохраняется на локальном жестком диске пользователя.

AFAIK нет чистого решения VBA для переопределения исходного поведения. Вы можете использовать альтернативу ответа Роберта Мерна, но он не отображает форму окна, поэтому он менее настраиваемый.

Следуйте этому ответу, если хотите добиться точного эффекта – FileOpenDialog.

Вы можете распечатать все переменные среды с помощью функции Environ $ () . Это не будет показывать какую-либо переменную, прямо указывающую на MyComputer, поэтому вы не можете передать ее в свойство .InitialFileName .

MyComputer не является физическим местоположением , доступ к которому вы можете получить через cmd . Я считаю это абстрактным интерфейсом, и довольно сложно объяснить, как VBA и .InitialFileName используют строку для доступа к местоположению.

Ну, единственное обходное решение проблемы, о которой я могу думать, это использовать внешнюю библиотеку, написанную, например, C #, которая может получить доступ к MyComputer .

Это проще, чем кажется!

Выполните следующие шаги, чтобы создать свой собственный OpenFileDialog.

Вам нужна Visual Studio Express для рабочего стола – ее можно бесплатно скачать и использовать.

После установки – запустите как Administrator ! ( необходимо, чтобы библиотеки регистрировались )

Выберите « File и « New Project . Переименуйте его в CustomOFD и нажмите OK .

введите описание изображения здесь

Щелкните правой кнопкой CustomOFD проект CustomOFD в обозревателе решений и выберите « Add References

Добавьте ссылки на System.Windows.Forms как показано ниже. Img

введите описание изображения здесь

Щелкните правой кнопкой мыши Class1.cs в Обозревателе решений и переименуйте его в CustomOFD.cs .

Дважды щелкните свой CustomOFD и замените код на один снизу

 using System; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Windows.Forms; namespace CustomOpenFileDialog { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("541EDD34-4CDC-4991-82E9-6FC23F904B5B")] public interface ICustomOFD { DialogResult ShowDialog(); string FileName(); } [ClassInterface(ClassInterfaceType.None)] [Guid("E33102F0-B3C0-441C-8E7A-B9D4155A0D91")] public class CustomOFD : ICustomOFD { private OpenFileDialog box = new OpenFileDialog(); public CustomOFD() { box.Multiselect = false; box.Title = "Select file"; box.InitialDirectory = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"; } public DialogResult ShowDialog() { return box.ShowDialog(); } public string FileName() { return box.FileName; } } } 

Примечание. Вы можете создать новый GUID для своего собственного класса, используя Tools => Create GUID и замените его на свой собственный, если хотите …

Щелкните правой кнопкой мыши CustomFileOpenDialog в Обозревателе решений и выберите Properties

введите описание изображения здесь

В окне «Свойства» перейдите на вкладку «Приложение» и нажмите « Assembly Info и отметьте поле « Make COM-Visible

введите описание изображения здесь

Затем перейдите на вкладку Build и отметьте Register for COM interop

введите описание изображения здесь

Щелкните правой кнопкой мыши проект и выберите « Build из меню».

Теперь перейдите на вкладку «Вывод», показывая, где библиотека была скомпилирована

обычно его

 c:\users\administrator\documents\visual studio 2012\Projects\CustomOpenFileDialog\CustomOpenFileDialog\bin\Debug\CustomOpenFileDialog.dll 

ОК. Теперь сохраните и закройте VS.

Откройте Excel и перейдите в VBE ALT + F11 и вставьте стандартный модуль

Нажмите « Tools в строке меню и выберите « References

Нажмите кнопку « Browse и перейдите к файлу CustomOpenFileDialog.tlb и нажмите «ОК», чтобы добавить в список ссылок

Скопируйте код для модуля

 Option Explicit Sub Main() Dim ofd As New CustomOFD Set ofd = New CustomOFD ofd.ShowDialog Debug.Print ofd.Filename End Sub 

введите описание изображения здесь


наконец, запустите суб и наслаждайтесь компьютером как место по умолчанию для настраиваемого окна OpenFileDialog!

введите описание изображения здесь

Я не вижу способа использовать GetSaveAsFilename или подобные диалоги для открытия на компьютере или на моем компьютере .

Можно запросить пользователя выбрать папку с помощью VB Script. Отображаемый корневой компьютеркомпьютер, и пользователь может выбрать папку. Затем файл можно сохранить в выбранной папке программно.

 Sub Test() MsgBox BrowseForFolder(MyComputer) End Sub 

http://technet.microsoft.com/library/ee176604.aspx

 Function MyComputer() As Variant Dim objShell As Object, objFolder As Object Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.Namespace(&H11&) MyComputer = objFolder.self.Path Set objShell = Nothing Set objFolder = Nothing End Function 

http://www.vbaexpress.com/kb/getarticle.php?kb_id=405

 Function BrowseForFolder(Optional OpenAt As Variant) As Variant 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 Set ShellApp = Nothing End Function 
 .InitialFileName = "Computer" 

Работает для меня с FileDialog(msoFileDialogFolderPicker)

Протестировано в Windows Vista – Excel 2007

Давайте будем гением компьютера.