在Excel的 VBA类模块中创建Word文档的故障排除
由于种种原因,我现在正在把一些代码重构为更面向对象的方式。我立刻遇到了以下问题:当类模块的 Create 方法创建新的Word文档时,它并未被赋值给 doc 变量(或我尝试的其他任何设置变量的方式都不行)。它会从类模块的代码跳出,回到主执行流程。
Option Explicit
Private doc As Word.Document
Private Sub Class_Initialize()
'pass
End Sub
Private Sub Class_Terminate()
'pass
End Sub
Public Function Create(ByVal TemplateFilePath As String) As FilledDocument
Dim result As FilledDocument
Set result = New FilledDocument
Set doc = g_WordApp.Documents.Add(Template:=TemplateFilePath, NewTemplate:=False, DocumentType:=0)
Set Create = result
End Function
下面是我为弄清楚到底发生了什么而写的测试代码:
Private Sub Test_FilledDocument()
Dim TestClass As FilledDocument
Dim TestTemplatePath As String
Set g_WordApp = CreateObject("Word.Application")
g_WordApp.Visible = True
TestTemplatePath = "test_template.dotx"
Set TestClass = MSEFilledDocument.Create(TestTemplatePath)
Debug.Print TestClass.docxFilledDocument.Name
End Sub
请注意,g_WordApp 是在其他地方定义的Public变量。
请注意,文档是由 Create 方法创建的,但它并未被赋值给变量,最后一行(Set Create = result) 不会执行),因此我也无法对它做任何处理。我的目标是让一个类以特定方式创建并操作文档,但由于我目前不能将创建的文档设置为所创建对象的属性,进展就不大。
希望得到帮助和面向对象编程方面的见解!
解决方案
从你贴出的代码来看,尚不清楚你的具体意图是什么,但举个例子,在 Create 中你创建并返回了类 FilledDocument 的一个实例,但你对该对象没有做任何处理?
我最好的猜测是你想要的更像下面这样:
类模块 FilledDocument
Option Explicit
Private doc As Word.Document
Private Sub Class_Initialize()
'pass
End Sub
Private Sub Class_Terminate()
'pass
End Sub
'Create a document based on `TemplateFilePath` ; return True if successful
Public Function LoadTemplate(ByVal TemplateFilePath As String) As Boolean
'check the template exists before trying to load it
If Len(Dir(TemplateFilePath)) > 0 Then
Set doc = g_WordApp.Documents.Add(Template:=TemplateFilePath, NewTemplate:=False, DocumentType:=0)
LoadTemplate = True
End If
End Function
'return the name of the associated document
Public Property Get DocName() As String
DocName = doc.Name
End Property
在普通模块中的测试代码:
Option Explicit
Public g_WordApp As Word.Application
Private Sub Test_FilledDocument()
Dim TestClass As FilledDocument
Dim TestTemplatePath As String
Set g_WordApp = CreateObject("Word.Application")
g_WordApp.Visible = True
TestTemplatePath = "C:\Temp\test_template.dotx"
Set TestClass = New FilledDocument
If TestClass.LoadTemplate(TestTemplatePath) Then
Debug.Print TestClass.DocName
Else
Debug.Print "Template not loaded!"
End If
End Sub
如果不是这样,那么也许你可以更详细地解释你的使用场景。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。