Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找Excel电子表格';s模板路径_Excel_Vba_Excel Template - Fatal编程技术网

查找Excel电子表格';s模板路径

查找Excel电子表格';s模板路径,excel,vba,excel-template,Excel,Vba,Excel Template,我有一个带有VBA代码的Excel电子表格模板(“xltm”文件) 我想在模板打开的电子表格中找到模板的路径 问题的例子: 用户通过双击模板文件在“C:\My Stuff”中打开一个新的电子表格 他们填写单元格,然后单击一个按钮,在询问如何调用文本文件后创建一个文本文件 然后,代码使用Application.ActiveWorkbook.path将文本文件保存在电子表格打开时的同一位置 这会导致权限错误,因为电子表格尚未保存,因此没有路径 有没有办法找到原始模板的文件路径?在示例C:\My

我有一个带有VBA代码的Excel电子表格模板(“xltm”文件)

我想在模板打开的电子表格中找到模板的路径

问题的例子:

  • 用户通过双击模板文件在“C:\My Stuff”中打开一个新的电子表格
  • 他们填写单元格,然后单击一个按钮,在询问如何调用文本文件后创建一个文本文件
  • 然后,代码使用
    Application.ActiveWorkbook.path
    将文本文件保存在电子表格打开时的同一位置
  • 这会导致权限错误,因为电子表格尚未保存,因此没有路径
有没有办法找到原始模板的文件路径?在示例C:\My Stuff中

我可以让用户在创建文本文件之前保存该文件,或者我可以只使用xlsm文件,但模板可以最大限度地减少弄乱文件格式的可能性。我不想每次都让他们保存文件。他们可能会复制并粘贴大部分数据,然后只需要文本文件,而不是每次都需要不同的电子表格

所以我的问题是:有没有办法找到原始模板的文件路径?在本例中,这将是C:\My Stuff

你不能。

我相信这不是你想要的答案,但不幸的是,这就是答案

如果您在资源管理器中双击模板以创建文件,那么您可能无法找到该路径或模板名称,就像您在
MS Word
中使用
oDoc.AttachedTemplate

备选方案

在模板中,将此代码放入
ThisWorkbook

Private Sub Workbook_Open()
    ChDir "C:\Blah Blah" '<~~ Change this to the templates path
End Sub
Private子工作簿\u Open()

ChDir“C:\Blah Blah”有一种方法可以做你想做的事……某种程度上。无法知道原始模板的名称或路径,因为Excel会即时复制该模板以创建新工作簿,并且不会公开包含该信息的任何属性。但是,模板可以通过一个唯一的标记来标识,然后可以在新工作簿中访问该标记。而且标签不必是任何像秘密单元格、隐藏工作表或隐藏文本框这样的时髦东西。它使用了一个很少提及的Excel内置功能,名为
CustomDocumentProperties

要做到这一点,需要一些您可能不熟悉的额外VBA代码。具体来说,是对MSO.DLL(也称为Microsoft Office X对象库)的VBA项目引用,其中“X”是Office的版本。在我的例子中,它是Office2007,版本12,所以它是Microsoft Office 12.0对象库

要给模板添加标记,只需向其添加自定义文档属性。在打开工作簿时,可以直接从Excel主窗口执行此操作,如下所示:

单击
办公室按钮
准备
属性
,如下所示:

这将打开黄色文档属性栏,其中包含各种文本框,如作者、标题等:

然后单击
文档属性
高级属性

这将打开
工作簿属性
窗口:

  • 单击
    自定义
    选项卡
  • 键入属性名
  • 键入属性值
  • 单击添加按钮

新的自定义属性将出现在属性列表中。单击
OK
按钮:

现在对于我提到的额外VBA

打开VBA编辑器窗口,单击
Tools
References
,然后添加对
Microsoft Office X对象库的引用(假设您还没有),其中X是您的Office版本。如果它没有出现在列表中,您将不得不浏览它,根据您的Windows和Office版本,它可能位于不同的位置

如果你已经有了它,它就是这样出现的。在我的情况下,它已经存在,并且复选框已选中:

如果你向下滚动到列表中间的微软项目,你找不到它,戳浏览按钮。请注意,如果它在列表中,但您错过了它,再次添加它不会有任何影响。此外,有时候这样做比盯着清单看五分钟更容易

在我的32位dev beater box上,路径如下所示。我认为64位Windows和64位office也应该如此,但我不确定

C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL

在带有32位Office的64位Windows桌面计算机上,它是:

C:\ProgramFiles(x86)\Common Files\Microsoft Shared\OFFICE12\MSO.DLL

如果不是Office版本,请记住将Office 12更改为Office版本。完成后,单击
OK
按钮

现在是代码

在VBA项目资源管理器中,双击此工作簿
,然后添加以下代码。如果您已经打开了一个
子工作簿
,则必须将其集成到您认为合适的子工作簿中。然后,一旦您了解了它的工作原理,您可以在必要时使用它:

Private Sub Workbook_Open()
    Dim xl      As Excel.Application
    Dim wb      As Excel.Workbook
    Dim dcps    As Office.DocumentProperties
    Dim dcp     As Office.DocumentProperty
    Dim tname   As String
    Const dq As String = """"
    Set xl = Excel.Application
    Set wb = xl.ActiveWorkbook
    Set dcps = wb.CustomDocumentProperties
    Set dcp = dcps.Item("ThisTemplateName")
    tname = dcp.Value
    MsgBox "This workbook was created from the template named " & dq & tname & dq & "..!"
End Sub

谢谢,你说得对,这不是我想要的答案,但至少我知道现在做不到。我将尝试您建议的解决方案。@JamesR或者,在部署模板文件之前,您可以将模板文件中的路径硬编码为隐藏工作表单元格中的简单字符串,而不是将其硬编码为具有副作用的宏。。