我试图自动生成一些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函数绝对可行,只需要比我更多的工作......
答案 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文件),并且需要大量的实验来降低风险。不小心破坏了你的文件。如果您正在寻找一个简单而简单的解决方案,那么绝对不推荐 - 但这是可能的。