3

我试图让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}到 Windows 资源管理器地址栏中,它会将您带到我的计算机,但如果我在我的 VBA 代码中使用它

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

它说它找不到目录或其他东西。所以不确定是否有解决这个问题的方法。

这也不起作用:

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

我希望将对话框打开到计算机的原因是我们将在 Windows 服务器上托管 excel 文档,并通过 RemoteApp 和远程桌面进行访问。用户将无权访问(权限)服务器驱动器和文件夹等,他们只能访问其本地计算机上自己的驱动器,这些驱动器将被映射并在服务器“我的电脑”文件夹下可见,因为没有更好的单词。服务器上的主文档使用 VBA 代码生成副本,然后保存到用户本地硬盘驱动器。

4

3 回答 3

5

AFAIK 没有纯 VBA 解决方案来覆盖原始行为。您可以使用 Robert Mearns 答案中的替代方法,但它不显示 windows 窗体,因此它的可定制性较低。

如果您想达到确切的效果 - FileOpenDialog,请遵循此答案。

您可以使用 Environ$() 函数打印所有环境变量。这不会显示任何直接指向MyComputer的变量,因此您不能将其传递给.InitialFileName属性。

MyComputer不是您可以通过cmd访问的物理位置。我认为它是一个抽象接口,很难解释 VBA 和使用字符串如何访问位置。.InitialFileName

好吧,我能想到的唯一解决方法是使用可以访问MyComputer的外部库,例如 C# 编写的。

这比听起来容易!

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

你需要一个Visual Studio Express For Desktop——它可以免费下载和使用。

安装后 - 运行为Administrator!(图书馆需要注册

选择FileNew Project。将其重命名为CustomOFDand 并点击OK.

在此处输入图像描述

在解决方案资源管理器中右键单击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;
        }
    }
}

Tools注意:您可以使用=>为您自己的类生成一个新的 GUID,Create GUID并用您自己的 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

在此处输入图像描述


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

在此处输入图像描述

于 2013-11-12T13:57:51.030 回答
3

我看不到使用GetSaveAsFilename或类似对话框在ComputerMy Computer上打开的方法。

可以提示用户使用 VB 脚本选择文件夹。显示的根目录是计算机,用户可以选择一个文件夹。然后可以以编程方式将该文件保存到选定的文件夹中。

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
于 2013-11-12T13:38:58.430 回答
0
.InitialFileName = "Computer"

为我工作FileDialog(msoFileDialogFolderPicker)

在 Windows Vista - Excel 2007 上测试

于 2015-09-03T16:33:17.257 回答