VBA:默认情况下,让Excel FileDialogOpen指向"我的电脑"

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#.

它比听起来更容易!

按照以下步骤创建自定义OpenFileDialog.

您需要一个Visual Studio Express For Desktop - 它可以免费下载和使用.

安装后 - 运行为Administrator!(图书馆必须注册)

选择FileNew 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框的默认位置!

在此输入图像描述

  • 嗨 Mehow,令人敬畏的细节人 - 非常感谢。我要好好试试这个。它是我和 C# 的第一次。但是你真的有一步一步的指导,哇。. . 会让你知道我的表现。再次感谢。 (2认同)