VBA,找不到对象 424 错误 - 如何调试?



>我在 Excel 2010 上使用 VBA,但遇到了可怕的 424 错误。但是调试器不会指向任何有助于解决问题的内容。是否有能够缩小问题范围的好做法?我已经检查了拼写,所有表格都在正确的工作表上,并且命名的列在那里。

提前感谢您提供的任何建议。

Sub Finding_Zone()
Dim Data_Table As ListObject
Dim Freq_Table As ListObject
Dim i As Long
Dim x As Long
Dim Zone_Value As Long
Set Data_Table = Sheets("Sheet2").ListObjects("Table2")
Set Freq_Table = Sheets("Sheet2").ListObjects("Table3")
For i = 1 To Range(Data_Table).Rows.Count
Zone_Value = data.Table.DataBodyRange.Cells(i, Data_Table.ListColumns("Zone").Index)

For x = 1 To Len(Zone_Value)
Set Result = Freq_Table.ListColumns("Summary Code").DataBodyRange.Find(Zone_Value)
If Result Is Nothing Then
Zone_Value = Left(Zone_Value, Len(Zone_Value) - 1)
Else
Data_Table.DataBodyRange.Cells(i, Data_Table.ListColumns("Modified Zone").Index) = Zone_Value
End If
Next x
Next i

End Sub

如前所述,Option Explicit会捕获data.Table拼写错误,从而导致Object Not Found错误。但是,这些附加点应该可以帮助您优化代码。


  • Len(Zone_Value)不会返回区域编号中的位数,而是始终返回4- 使用的字节数(Long的存储大小(。有关更多详细信息,请参阅 MSDN - 数据类型摘要。For x = 1 To Len(Zone_Value)将循环 4 次,Len(Zone_Value) - 1将等于 3,无论Zone_Value有多少位数字。因此,也许可以使用CstrZone_Value投射到String,然后检查其长度。

请考虑以下示例代码,显示分配给DoubleLongIntegerString变量时的1长度。

Sub TestLength()
Dim a As Double, b As Long, c As Integer, d As String
a = 1
b = 1
c = 1
d = "1"
Debug.Print "Length of a: " & Len(a)
Debug.Print "Length of b: " & Len(b)
Debug.Print "Length of c: " & Len(c)
Debug.Print "Length of d: " & Len(d)
End Sub

输出为:

Length of a: 8
Length of b: 4
Length of c: 2
Length of d: 1

另一个想法:

  • Zone_Value = data.Table.DataBodyRange.Cells(i, Data_Table.ListColumns("Zone").Index).添加ListColumn变量可能更简单、更易于理解,而不是多次引用Index

Dim Zone_Column As ListColumn: Set Zone_Column = Data_Table.ListColumns("Zone")


您修改后的代码实现了这两个建议,可能如下所示:

Option Explicit
Sub Finding_Zone()
Dim Data_Table As ListObject: Set Data_Table = Sheets("Sheet2").ListObjects("Table2")
Dim Freq_Table As ListObject: Set Freq_Table = Sheets("Sheet2").ListObjects("Table3")
Dim Zone_Column As ListColumn: Set Zone_Column = Data_Table.ListColumns("Zone")
Dim Summary_Column As ListColumn: Set Summary_Column = Freq_Table.ListColumns("Summary Code")
Dim Mod_Zone_Column As ListColumn: Set Mod_Zone_Column = Data_Table.ListColumns("Modified Zone")
Dim i As Long, x As Long
Dim Zone_Value As Long
Dim Result As Range
Dim tmpStr As String
With Zone_Column.DataBodyRange
For i = 1 To .Rows.Count
Zone_Value = .Cells(i, 1).Value
tmpStr = CStr(Zone_Value)
For x = 1 To Len(tmpStr)
Set Result = Summary_Column.DataBodyRange.Find(Zone_Value)
If Result Is Nothing Then
If Len(CStr(Zone_Value)) > 1 Then
Zone_Value = CLng(Left(CStr(Zone_Value), Len(CStr(Zone_Value)) - 1))
End If
Else
Mod_Zone_Column.DataBodyRange.Cells(i, 1) = Zone_Value
Exit For
End If
Next x
Next i
End With
End Sub

Option Explicit必须未指定,大本钟看到了拼写错误:

Zone_Value = data.Table.DataBodyRange...data.Table是什么?您的ListObjectData_Table.- 大本钟

应该Data_Table.

Option Explicit您在VBA 中添加代码的每个模块放在模块的顶部。

然后代码将拒绝编译,因为未声明变量data(该选项强制您声明每个变量(。

因此,表达式data.Table.DataBodyRange在运行时被计算为在名为data的对象上查找Table成员的成员,该对象由 VBA 即时声明(由于缺少Option Explicit(作为值为Empty的隐式Variant,即...不是对象

因此,对象是必需的,因为您无法对非对象进行成员调用

橡皮鸭会告诉你丢失Option Explicit,事实上data没有被声明,也从未被分配,并且在没有被分配的情况下使用。还可以帮助您使缩进更加一致;-(

免责声明:我管理该开源项目

最新更新