我有一个Excel电子表格模板与VBA代码(一个'xltm'文件)。
我想在由模板打开的电子表格中查找模板的路径。
问题示例:
- 用户通过双击“C:\My Stuff”中的模板文件打开一个新的电子表格。
- 他们填写单元格,然后单击一个按钮,在询问他们如何称呼它之后创建一个文本文件。
- 然后,代码使用
Application.ActiveWorkbook.path
将文本文件保存在打开电子表格的同一位置。 - 这将导致权限错误,因为电子表格尚未保存,因此没有路径。
有没有办法找到原始模板的文件路径?在示例C:\My Stuff中。
我可以让用户在创建文本文件之前保存文件,或者我可以只使用xlsm文件,但模板将最大限度地减少文件格式混乱的机会。我不想每次都要求他们保存文件。他们可能会复制并粘贴大部分数据,然后只需要文本文件,而不是每次都有不同的电子表格。
4条答案
按热度按时间qmb5sa221#
所以我的问题是有没有办法找到原始模板的文件路径?在本例中,这将是C:\My Stuff。
你不能
我相信这不是你要找的答案,但不幸的是,这就是答案。
如果在资源管理器中双击模板以创建文件,则AFAIK无法找到该路径或模板名称,就像在
MS Word
中使用oDoc.AttachedTemplate
所做的那样备选
在模板中,将此代码放入
ThisWorkbook
中然后从双击模板创建的新工作簿中,可以使用
CurDir
获取该路径。上述方法的缺点
Workbook_Open()
代码被转移到新文件中1.如果用户改变了模板的位置,那么你将无法得到正确的路径
hlswsv352#
有一种方法可以做你想做的事...算是吧无法知道原始模板的名称或路径,因为Excel会即时复制该模板以创建新工作簿,并且不会公开包含该信息的任何属性。但是,模板可以由唯一的标记标识,然后可以在新工作簿中访问该标记。标签不需要是任何时髦的东西,比如秘密单元格、隐藏工作表或隐藏文本框。它使用了一个很少提到的Excel内置功能,称为
CustomDocumentProperties
。要做到这一点,需要一些额外的VBA代码,您可能不熟悉。具体来说,是对MSO.DLL的VBA项目引用,即Microsoft Office X对象库,其中“X”是Office的版本。在我的例子中,它是Office 2007,版本12,所以它是
Microsoft Office 12.0 Object Library
。要给予模板一个标记,只需向它添加一个自定义文档属性。这可以在打开工作簿时直接从Excel主窗口完成,如下所示:
点击
Office Button
>Prepare
>Properties
,如下图所示:这将打开黄色的文档属性栏,其中包含各种文本框,如作者、标题等:
然后单击
Document Properties
>Advanced Properties
...这将打开
Workbook Properties
窗口:Custom
选项卡。Add
按钮。新的自定义属性将出现在
Propertie
列表中。单击OK
按钮:现在对于我提到的额外的VBA位...
打开VBA编辑器窗口,单击
Tools
>References
,然后添加Microsoft Office X Object Library
的引用(假设您还没有它),其中X是您的Office版本。如果它没有出现在列表中,您将不得不浏览它,它可能位于各种位置,具体取决于您的Windows和Office版本。这就是它的样子 * 如果 * 你已经有了它。在我的例子中,它已经在那里 * 并且 * 复选框被选中:
如果您向下滚动到列表中间的Microsoft项目,并且没有找到它,请点击浏览按钮。请注意,如果它 * 在列表中,但您错过了它,再次添加它不会有任何影响。另外,有时候这样做比盯着列表看五分钟更容易。
在我的32位dev-beater盒子上,路径如下。我认为这对于64位Windows和64位Office也应该是一样的,但我不确定。
C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL
在我的64位Windows桌面计算机上,使用32位Office,它是:
C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE12\MSO.DLL
请记住将
OFFICE12
更改为您拥有的Office版本(如果不是)。一旦你有了它,点击OK
按钮。现在代码...
在VBAProject Explorer中,双击
ThisWorkbook
并添加以下代码。如果你已经有了一个Sub Workbook_Open
,你必须把它集成到你认为合适的地方。然后,一旦你看到它是如何工作的,你可以使用它,但必要的:e5njpo683#
问题是,在未保存的工作簿中,Application.ActiveWorkbook.path未定义。下面是一个方法,它公开未保存的工作簿的模板路径。它要求两个批处理(命令)文件与Excel模板位于同一文件夹中。
第一个批处理文件SetVariable.cmd创建环境变量。
由于Windows处理环境变量的方式,该值不能立即用于当前控制台会话。(资料来源)
因此,需要第二个命令文件OpenInstance.cmd。
在模板的工作簿.激活ThisWorkbook的事件处理程序中,包括以下内容:
指导用户双击SetVariable.cmd一次。之后,双击【OpenInstance】即可。
环境变量的名称是任意选择的,目的是避免意外覆盖现有变量。
aemubtdh4#
我正在做类似的工作。我使用以下内容作为我的出发点:
MsgBox应用程序.TemplatesPath
https://learn.microsoft.com/en-us/office/vba/api/excel.application.templatespath