4

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

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

问题示例:

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

有没有办法找到原始模板的文件路径?在示例 C:\My Stuff.

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

4

2 回答 2

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. 如果用户更改模板的位置,那么您将无法获得正确的路径
于 2014-11-06T08:42:32.527 回答
1

有一种方法可以做你想做的……有点。无法知道原始模板的名称或路径,因为 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图:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

这将打开Workbook Properties窗口:

  • 单击Custom选项卡。
  • 键入属性名称。
  • 键入属性值。
  • 单击Add按钮。

在此处输入图像描述

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

在此处输入图像描述

现在对于我提到的那一点额外的VBA......

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

如果您已经拥有它,这就是它的显示方式。就我而言,它已经存在并且已选中该框:

在此处输入图像描述

如果您向下滚动到列表中间的 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
于 2019-06-22T21:23:45.373 回答