在vbscript中查找Excel电子表格模板

时间:2014-11-06 08:31:56

标签: excel vba excel-vba excel-template

根据我从谷歌搜索中可以看出,我以前没有想过这个问题,并且它非常具体。

我有一个嵌入了vba代码的excel电子表格模板(' xltm'文件),我想找到模板打开的电子表格中模板的路径。如果这没有意义,我会给出一个问题的例子:

用户通过双击模板文件打开新的电子表格。模板文件位于C:\ My Stuff'举个例子。 他们填写单元格,然后在询问他们想要调用它之后单击创建文本文件的按钮。 然后代码使用' Application.ActiveWorkbook.path'将文件保存在电子表格打开的相同位置(C:\ My Stuff)。 导致权限错误,因为电子表格尚未保存,因此,没有路径。 所以我的问题是:有没有办法找到原始模板的文件路径?在示例中,这将是C:\ My Stuff。

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

希望这是有道理的,并且感谢你提前得到任何答案。

2 个答案:

答案 0 :(得分:4)

  

所以我的问题是:有没有办法找到原始模板的文件路径?在示例中,这将是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()代码转移到新文件
  2. 如果用户更改了模板的位置,那么您将无法获得正确的路径

答案 1 :(得分:0)

有一种方法可以完成您想要的...。原始模板的名称或路径未知,因为Excel会为其创建一个即时副本以创建新工作簿,并且不会使用该信息公开任何属性。但是,可以通过一个唯一的标签来标识模板,然后可以在新工作簿中对其进行访问。而且标签不必像秘密单元格,隐藏的工作表或隐藏的文本框那样时髦。它使用了一个很少提及的Excel内置功能,称为CustomDocumentProperties

要执行此操作,可能需要一些您可能不熟悉的额外VBA代码。具体来说,VBA项目引用MSO.DLL(又名Microsoft Office X对象库),其中“ X”是office的版本。就我而言,它是Office 2007,即版本12,所以它是Microsoft Office 12.0 Object Library

要为模板添加标签,只需向其添加自定义文档属性。可以在打开工作簿的同时直接在Excel主窗口中完成此操作,如下所示:

点击Office Button> Prepare> Properties,如下所示:

enter image description here

这将打开带有各种文本框(例如作者,标题等)的黄色“文档属性”栏:

enter image description here

然后单击Document Properties> Advanced Properties ...

enter image description here

这将打开Workbook Properties窗口:

  • 点击Custom标签。
  • 输入属性名称。
  • 输入属性值。
  • 单击Add按钮。

enter image description here

新的自定义属性将显示在Propertie的列表中。点击OK按钮:

enter image description here

现在我提到了一点额外的VBA ...

打开VBA编辑器窗口,单击Tools> References,然后添加Microsoft Office X Object Library的引用(假设您还没有),其中X是您的Office版本。如果它没有出现在列表中,则必须浏览它,并且它可能存在于不同的位置,具体取决于您的Windows和Office版本。

这是您已经拥有它的 IF 的显示方式。在我的情况下,它已经在 中,并且已选中该框:

enter image description here

如果您向下滚动到列表中间的Microsoft项目,但没有找到,请戳按浏览按钮。请注意,如果列表中,但是您错过了它,则再次添加它不会有任何伤害。再加上有时候,这样做比将清单盯着五分钟更容易。

在我的32位dev-beater盒上,路径如下。我认为这对于具有64位办公室的64位Windows也应该是相同的,但是我不确定。

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

在具有32位Office的64位Windows台式机上,它是:

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