如何在Excel VBA中访问Word公共变量

时间:2016-01-25 13:15:58

标签: excel vba excel-vba ms-word word-vba

我试图自动生成一些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的公共变量。 Userinfo模块中的Utilities子填充user。这两个例程都是在没有任何VBA投诉的情况下运行的。我希望能够访问Excel VBA中的user变量,但是我收到以下错误

  

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

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

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

2 个答案:

答案 0 :(得分:4)

在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)

答案 1 :(得分:3)

另一种选择 - 如果您只能在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代码来添加或更改VBA代码。

我做了一些测试,只需复制vbaProject.bin文件就可以将代码从一个文档移植到另一个文档,并且这个概念有效。如果您有兴趣了解有关此文件的更多信息,this topic可能会有用。

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