VBA: заставить Excel FileDialogOpen указывать на "Мой компьютер" по умолчанию
Я пытаюсь получить отличные сохранения и открыть диалоговые окна, чтобы открыть "мой компьютер" по умолчанию, чтобы пользователь мог выбрать диск оттуда.
У меня есть диалоговые окна для открытия любого пути на любом диске или моих документах и т. Д., Но я не могу найти способ открыть его для моего компьютера.
Это код, который я использую в данный момент, и он отлично работает для известного пути:
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}
в адресную строку проводников Windows вы попадете на мой компьютер, но если я использую это в своем коде VBA
ChDir "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
он говорит, что не может найти каталог или что-то. Так что не уверен, есть ли способ обойти это или что-то.
Это тоже не сработало:
ChDir "C:\WINDOWS\explorer.exe /root,,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
Причина, по которой я хочу, чтобы диалоговые окна были открыты для компьютера, заключается в том, что мы будем размещать документ Excel на сервере Windows с доступом через RemoteApp и удаленный рабочий стол. Пользователи не будут иметь доступа (прав) к дискам и папкам серверов и т. Д., Они будут иметь доступ только к своим собственным дискам на своих локальных машинах, которые будут сопоставлены и будут видны в папке "Мой компьютер" на серверах из-за отсутствия лучшего слово. Главный документ на сервере генерирует реплику с использованием кода VBA и затем сохраняется на локальном жестком диске пользователя.
3 ответа
AFAIK, нет никакого чистого решения VBA, чтобы переопределить оригинальное поведение. Вы можете использовать альтернативу из ответа Роберта Мернса, но она не показывает форму окна, поэтому она менее настраиваема.
Следуйте этому ответу, если вы хотите добиться точного эффекта - FileOpenDialog.
Вы можете распечатать все переменные среды, используя функцию Environ$(). Это не покажет какую-либо переменную, непосредственно указывающую на MyComputer, поэтому вы не можете передать ее в .InitialFileName
имущество.
MyComputer не является физическим местоположением, к которому вы можете получить доступ через cmd. Я думаю об этом как об абстрактном интерфейсе, и довольно сложно объяснить, как VBA и .InitialFileName
использует строку для доступа к местоположению.
Ну, единственное решение проблемы, о которой я могу подумать, это использовать внешнюю библиотеку, написанную, например, на C#, которая может получить доступ к MyComputer.
Это проще, чем кажется!
Выполните следующие шаги, чтобы создать свой Custom OpenFileDialog.
Вам нужна Visual Studio Express For Desktop - ее можно бесплатно скачать и использовать.
После установки - запустить как Administrator
! (библиотекам необходимо зарегистрироваться)
Выбрать File
а также New Project
, Переименуйте его в CustomOFD
и и ударил OK
,
Щелкните правой кнопкой мыши CustomOFD
Спроектируйте в Обозревателе решений и выберите Add References
Добавить ссылки на System.Windows.Forms
как показано на рисунке ниже
Щелкните правой кнопкой мыши 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
Вкладка и отметка Зарегистрироваться для COM-взаимодействия
Щелкните правой кнопкой мыши проект и выберите 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