查找Excel电子表格的模板路径

v8wbuo2f  于 2023-05-30  发布在  其他
关注(0)|答案(4)|浏览(143)

我有一个Excel电子表格模板与VBA代码(一个'xltm'文件)。
我想在由模板打开的电子表格中查找模板的路径。
问题示例:

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

有没有办法找到原始模板的文件路径?在示例C:\My Stuff中。
我可以让用户在创建文本文件之前保存文件,或者我可以只使用xlsm文件,但模板将最大限度地减少文件格式混乱的机会。我不想每次都要求他们保存文件。他们可能会复制并粘贴大部分数据,然后只需要文本文件,而不是每次都有不同的电子表格。

qmb5sa22

qmb5sa221#

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

你不能

我相信这不是你要找的答案,但不幸的是,这就是答案。
如果在资源管理器中双击模板以创建文件,则AFAIK无法找到该路径或模板名称,就像在MS Word中使用oDoc.AttachedTemplate所做的那样

备选

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

Private Sub Workbook_Open()
    ChDir "C:\Blah Blah" '<~~ Change this to the templates path
End Sub

然后从双击模板创建的新工作簿中,可以使用CurDir获取该路径。

上述方法的缺点

  1. Workbook_Open()代码被转移到新文件中
    1.如果用户改变了模板的位置,那么你将无法得到正确的路径
hlswsv35

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,你必须把它集成到你认为合适的地方。然后,一旦你看到它是如何工作的,你可以使用它,但必要的:

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
e5njpo68

e5njpo683#

问题是,在未保存的工作簿中,Application.ActiveWorkbook.path未定义。下面是一个方法,它公开未保存的工作簿的模板路径。它要求两个批处理(命令)文件与Excel模板位于同一文件夹中。
第一个批处理文件SetVariable.cmd创建环境变量。

@echo off

rem Create an environment variable That Excel macro can read
setx TTxyPATHzz "%cd%"

由于Windows处理环境变量的方式,该值不能立即用于当前控制台会话。(资料来源)
因此,需要第二个命令文件OpenInstance.cmd

@echo off
:: This boot-strap script enables the use of an environment variable which can be read by an Excel macro
:: Because of the way user environment variables are created, run SetVariable the first time you use template.

rem Create an environment variable That Excel macro can read
rem Setting the variable again will allow the location to change.
setx TTxyPATHzz "%cd%"

rem Invoke cmd.exe to open instance of Excel template
FOR /F "usebackq delims==" %%i IN (`dir *.xltm /B`) DO start excel /n "%%i"

在模板的工作簿.激活ThisWorkbook的事件处理程序中,包括以下内容:

Private Sub Workbook_Activate()

   Dim CurrentLocation As String

   CurrentLocation = Environ("TTxyPATHzz")

   ' Your workbook now knows where the template is located.
   
End Sub

指导用户双击SetVariable.cmd一次。之后,双击【OpenInstance】即可。
环境变量的名称是任意选择的,目的是避免意外覆盖现有变量。

aemubtdh

aemubtdh4#

我正在做类似的工作。我使用以下内容作为我的出发点:
MsgBox应用程序.TemplatesPath
https://learn.microsoft.com/en-us/office/vba/api/excel.application.templatespath

相关问题