我有一个Word .dot文件,可以在旧版本的Word中运行,但在Word 2013中运行时失败,错误432。
当我调试代码时,我有一行:
Load customerForm
VBA显示错误:
Run-time error '432': File name or class name not found during Automation operation
该项目" pennyscode"包括"模块1和#34;其中包含正在调试的函数," ThisDocument"以及一个名为" customerForm"。
的表格我尝试将名称更改为" pennyscode.customerForm"但这并没有任何区别。
从Sub_函数调用此代码,该函数从Document_New()调用。
更新
我可以在Load customerForm行上放置一个断点,并证明它是引起问题的行。如果此时我将鼠标移到" customerForm" VBA提出了
customerForm = <Object variable or With block variable not set>
如果我删除/跳过加载行,则下一行是customerForm.Show,并产生相同的错误。
如果我只打开.dotm文件然后使用Alt-F11打开VBA,我可以查看selectCustomer的代码,列表属性/方法和customerForm出现在列表中。
附加说明 我相信在Load函数中它必须调用GetObject,这就是失败。就好像VBA无法找到customerForm对象,即使它出现在项目中。
我已经在下面的Document_New中发布了正在调用的函数的完整代码。
Sub selectCustomer()
Dim Doc As Document
Set Doc = Application.ActiveDocument
If Doc.CustomDocumentProperties.Item("Customer") = "Nothing" Then
Load customerForm
customerForm.Show
Unload customerForm
Doc.Fields.Update
a$ = Doc.CustomDocumentProperties.Item("InvoiceNumber")
a$ = customerForm.pathBox.Value + "\" + a$
Doc.SaveAs (a$)
End If
End Sub
我还在这里发布了完整的.dotm(Excel 2013)和.dot(以前的excel)以及一些示例数据(.xls):
Dropbox/Public/Invoice 2015-16.dotm
Dropbox/Public/Invoice 2015-16.dot
更新 我在这个问题上没有太多运气。任何人都可以建议一种方法来调查这个吗?或者我如何改进有关问题的信息?
答案 0 :(得分:0)
我终于设法解决了这个问题,并且我有一些知识。
首先,调试器将错误显示在Load customerForm行上,但事实并非如此。
customerForm有一个_Initialize函数,可以在显示之前将数据加载到其中。此函数失败但调试器停在错误的位置。
我能够通过在_Initialize子的开头放置断点然后逐步执行代码来更有效地调试它。
一旦我发现这个,我意识到由于路径错误导致代码无法找到XLSX文件,从而导致运行时错误。
一旦我修好了所有路径,我就会遇到第二个错误:运行时错误&#39; 9&#39;这是一个下标问题。这也报告了Load customerForm行,也是由于_Initialize函数的问题。
这是问题的真正根源,并展示了Office 2013与早期版本的Office之间的功能变化。
我的代码正在打开XLSX文件并尝试从中读取数据:
Dim myXL As Object
Dim myWS As Object
Set myXL = GetObject("C:\Test\data.xlsx")
myXL.Application.Visible = True
myXL.Parent.Windows(1).Visible = True
Set myWS = myXL.Application.Worksheets("Customers")
运行时错误9是由Windows属性的索引引起的,因为它们没有窗口。在早期版本的Office中,只有一个窗口,2013年该数组为空。
经过多次搞砸后我尝试添加这一行:
myXL.Activate
访问Windows()数组之前。执行完成后,Windows(1)就存在了,代码就像以前一样工作。
希望这可以帮助其他人解决类似的问题。