【问题标题】:How to access a Word public variable in Excel VBA如何在 Excel VBA 中访问 Word 公共变量
【发布时间】:2016-01-25 13:15:57
【问题描述】:

我正在尝试自动生成一些由 Excel VBA 完成所有工作的报告。我的雇主有一套标准化的模板,所有文件都应该从中生成。我需要从 Excel VBA 填充这些模板之一。 Word 模板广泛使用 VBA。

这是(部分)我的 Excel VBA 代码:

Sub GenerateReport() ' (Tables, InputDataObj)
  ' code generating the WordApp object (works!)

  WordApp.Documents.Add Template:="Brev.dot"

  ' Getting user information from Utilities.Userinfo macro in Document
  Call WordApp.Run("Autoexec") ' generating a public variable
  Call WordApp.Run("Utilities.UserInfo")
  ' more code
End sub

在 Word VBA Autoexec 模块中,定义并声明了一个名为 user 的公共变量。来自Utilities 模块的Userinfo 子填充user。这两个例程都在没有任何 VBA 投诉的情况下运行。然后我希望能够访问我的 Excel VBA 中的 user 变量,但我收到以下错误

编译错误:尚未在此上下文中创建变量。

如何在 Excel VBA 中访问 Word VBA 变量?我认为它或多或少是一样的?

编辑:user 变量是用户定义的Type,只有String 属性。复制填充user 变量的 Word VBA 函数是绝对可行的,只是比我认为的需要更多的工作......

【问题讨论】:

  • UserInfo变成一个函数,给它一个返回值,可以赋值给Excel中的一个变量
  • @MacroMan UserInfo 内置在模板中,我无法篡改...
  • 您可以创建自己的 UDF 来返回变量
  • @Holene 如果您可以修改设置全局变量的应用程序的代码(或在开始时将其设置为这样做),这很容易,但在此情况,您似乎无法做到这一点。
  • "UserInfo 内置在模板中,我无法篡改..." 在这种情况下,您无法访问 Word 中生成的信息。但是,“代码也需要在其他计算机上工作,并且模板是为所有工作用户设置的”不需要阻止你。有一些方法可以解决这个问题,不会影响使用代码的其他人,例如写入文档 VARIABLE(这是文档中的字符串存储,没有人可以看到并且不会影响任何内容)。

标签: vba excel ms-word


【解决方案1】:

在 Word 模块中:

Public Function GetUserVariable() As String '// or whatever data type
    GetUserVariable = user
End Function

在 Excel 模块中:

myUser = WordApp.Run("GetUserVariable")

或者,您可以复制变量值 - 因为它被称为 user 我怀疑它正在返回有关文档的用户或作者的一些信息。在这种情况下,您可能会遇到以下情况之一:

'// Username assigned to the application
MsgBox WordApp.UserName

'// Username defined by the system
MsgBox Environ$("USERNAME")

'// Name of the author of the file specified
MsgBox CreateObject("Shell.Application").Namespace("C:\Users\Documents").GetDetailsOf("MyDocument.doc", 9)

【讨论】:

  • 这只能通过 Excel VBA 完成吗? Excel VBA 之类的东西将模块添加到 Word 文档中,执行并返回 user 变量?
  • 除非您有权访问受保护的 VBProject 对象模型 - 出于安全原因默认禁用该模型。
  • 我怀疑这些模板是几年前制作的,也许是 2000 年中期。如何确认它不起作用?
  • 尝试从 Excel 中运行此程序:Set wApp = GetObject(, "Word.Application"): Set wDoc = wApp.Documents(1): Set vPrj = wDoc.VBProject,您很可能会收到错误消息,指出程序访问不受信任
  • 如 cmets 中所述 - 如果您告诉我们变量 user 返回什么,我们可以提供可在 Excel 中使用的替代解决方案?
【解决方案2】:

另一种选择 - 如果您只能在 Utilities.UserInfo 子代码中添加一行代码(在设置您的公共变量之后):

ActiveDocument.Variables("var_user") = user

然后您可以在 Excel 中轻松访问它:

Sub GenerateReport() ' (Tables, InputDataObj)
  ' code generating the WordApp object (works!)

  'I am assuming your WordApp object is public, as you don't declare it.
  'Capture the new document object    
  Dim newdoc as Object
  set newdoc = WordApp.Documents.Add(Template:="Brev.dot")

  ' Getting user information from Utilities.Userinfo macro in Document
  Call WordApp.Run("Autoexec") ' generating a public variable
  Call WordApp.Run("Utilities.UserInfo")

  'Get and show the value of "user"
  Dim user as String
  user = newdoc.Variables("var_user")
  msgbox, user
End Sub

这是假设user是一个字符串。

编辑:由于要求仅在 Excel VBA 上工作,我肯定会尝试 Scott 和 MacroMan 建议的方法 - 如果可能的话,在 Excel 中复制 Word 宏的相同功能。

我假设您已经排除了使用原始模板的编辑副本、设置在公共文件夹中的可能性...

为了完整起见,还有另一种可能性:实际上可以在没有 VBProject 对象模型的情况下通过“蛮力”在 Word 文档中注入 VBA 代码。如果您将 Word 文档重命名为 .zip 文件并打开它,您会注意到其中有一个 \word\vbaProject.bin 文件。此文件包含文档的 VBA 项目,原则上可以通过修改或替换来添加或更改 VBA 代码。

我做了一些测试,通过简单地复制 vbaProject.bin 文件将代码从一个文档移植到另一个文档,并且这个概念有效。如果您有兴趣了解有关此文件的更多信息,this topic 可能会有所帮助。

但是请注意,使用这种技术做您想做的事情会有些复杂(对于初学者来说,这将涉及从您的 Excel VBA 更新 zip 文件),并且需要大量的实验来降低风险意外损坏您的文件。如果您正在寻找一种简单易行的解决方案,则绝对不推荐使用 - 但这是可能的。

【讨论】:

  • 请注意,使用这种技术,如果保存了文档,文档变量“var_user”的值也会随之保存,之后无需重新运行宏即可访问(只需打开文档并检查其 Document.Variables 集合)。
  • 还要注意 Word 很难将 DocVariables 设置为空值;如果它们可能发生,您必须使用特殊字符序列来指示它们。
  • 用这个方法绝对不错,但是我不能碰Word VBA。该代码也需要在其他计算机上运行,​​并且为工作中的所有用户设置了模板...
  • 但是 Word VBA 密码是否受到保护,或者您至少可以阅读它吗?
  • 编辑了答案以增加对此事的进一步思考,
猜你喜欢
  • 1970-01-01
  • 2014-03-15
  • 2021-03-27
  • 2015-10-27
  • 2018-11-27
  • 1970-01-01
  • 2014-04-05
  • 2015-04-20
  • 1970-01-01
相关资源
最近更新 更多