Tri*_*tan 3 excel vba excel-vba fileopendialog savefiledialog
我试图获得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,")
Run Code Online (Sandbox Code Playgroud)
另外,我从这个网站找到了这个.
如果您粘贴::{20D04FE0-3AEA-1069-A2D8-08002B30309D}到Windows资源管理器地址栏,它会将您带到我的计算机,但如果我在我的VBA代码中使用它
ChDir "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
Run Code Online (Sandbox Code Playgroud)
它说无法找到目录或其他东西.所以不确定是否有解决这个问题的工作.
这也不起作用:
ChDir "C:\WINDOWS\explorer.exe /root,,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
Run Code Online (Sandbox Code Playgroud)
我想让对话框对计算机开放的原因是我们将在Windows服务器上托管excel文档,并通过RemoteApp和远程桌面进行访问.用户将无法访问(权限)服务器驱动器和文件夹等,他们只能访问本地计算机上自己的驱动器,这些驱动器将被映射并在服务器"我的电脑"文件夹下可见,因为缺少更好的字.服务器上的主文档使用VBA代码生成副本,然后保存到用户本地硬盘驱动器.
小智 5
AFAIK没有纯VBA解决方案来覆盖原始行为.您可以使用Robert Mearns答案的替代方案,但它不会显示窗体,因此它的可定制性较差.
如果要获得确切的效果,请按照此答案 - FileOpenDialog.
您可以使用Environ $()函数打印所有环境变量.这不会显示任何直接指向MyComputer的变量,因此您无法将其传递给.InitialFileName属性.
MyComputer不是您可以通过cmd访问的物理位置.我认为它是一个抽象的接口,很难解释VBA如何使用字符串来访问某个位置..InitialFileName
好吧,我能想到的唯一解决方法就是使用一个外部库来编写可以访问MyComputer的 C#.
它比听起来更容易!
您需要一个Visual Studio Express For Desktop - 它可以免费下载和使用.
安装后 - 运行为Administrator!(图书馆必须注册)
选择File和New Project.将其重命名为CustomOFD并点击OK.

CustomOFD在解决方案资源管理器中右键单击项目,然后选择Add References
添加对System.Windows.Formsimg的引用,如下所示

右键单击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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用Tools=> 为您自己的类生成一个新GUID,Create GUID并将其替换为您自己的类,如果您想...
右键单击CustomFileOpenDialog解决方案资源管理器中的,然后选择Properties

在"属性"窗口中,转到"应用程序"选项卡,然后单击Assembly Info并勾选Make COM-Visible框

然后转到Build选项卡并勾选注册COM互操作

右键单击项目,然后Build从菜单中选择
现在查看Output选项卡,因为它显示了编译库的位置
通常是它
c:\users\administrator\documents\visual studio 2012\Projects\CustomOpenFileDialog\CustomOpenFileDialog\bin\Debug\CustomOpenFileDialog.dll
Run Code Online (Sandbox Code Playgroud)
好.现在保存并关闭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
Run Code Online (Sandbox Code Playgroud)

最后,运行sub并享受计算机作为自定义OpenFileDialog框的默认位置!
