查找Excel电子表格';s模板路径
我有一个带有VBA代码的Excel电子表格模板(“xltm”文件) 我想在模板打开的电子表格中找到模板的路径 问题的例子:查找Excel电子表格';s模板路径,excel,vba,excel-template,Excel,Vba,Excel Template,我有一个带有VBA代码的Excel电子表格模板(“xltm”文件) 我想在模板打开的电子表格中找到模板的路径 问题的例子: 用户通过双击模板文件在“C:\My Stuff”中打开一个新的电子表格 他们填写单元格,然后单击一个按钮,在询问如何调用文本文件后创建一个文本文件 然后,代码使用Application.ActiveWorkbook.path将文本文件保存在电子表格打开时的同一位置 这会导致权限错误,因为电子表格尚未保存,因此没有路径 有没有办法找到原始模板的文件路径?在示例C:\My
- 用户通过双击模板文件在“C:\My Stuff”中打开一个新的电子表格
- 他们填写单元格,然后单击一个按钮,在询问如何调用文本文件后创建一个文本文件
- 然后,代码使用
将文本文件保存在电子表格打开时的同一位置Application.ActiveWorkbook.path
- 这会导致权限错误,因为电子表格尚未保存,因此没有路径
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或者,在部署模板文件之前,您可以将模板文件中的路径硬编码为隐藏工作表单元格中的简单字符串,而不是将其硬编码为具有副作用的宏。。