【问题标题】:VBA, object not found 424 error - how to debug?VBA,找不到对象 424 错误 - 如何调试?
【发布时间】:2018-08-16 14:34:18
【问题描述】:

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

【问题讨论】:

  • 当使用 F8 单步执行时,它不会在特定行上失败吗?
  • Zone_Value = data.Table.DataBodyRange... 中的data.Table 是什么?你的ListObjectData_Table
  • 是否有理由需要将 Data_Table 包含在范围内(没有指定的父级)而不是使用 Data_Table.Range.Rows.Count
  • 当我调试它时,它会突出显示 Sub Finding_Zone()
  • @BigBen - 现在改变了。谢谢。

标签: excel vba debugging error-handling


【解决方案1】:

正如所指出的,Option Explicit 会发现 data.Table 错字,这会导致 Object Not Found 错误。但是,这些附加点应该可以帮助您优化代码。


  • Len(Zone_Value) 不会返回您的区域编号中的位数,而是始终返回 4 - 使用的字节数(Long 的存储大小)。有关更多详细信息,请参阅MSDN - Data Type SummaryFor 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

【讨论】:

  • Len 的好消息,+1!
  • 太棒了。非常感谢您的 cmets。
【解决方案2】:

Option Explicit 必须是未指定的,Big Ben saw the typo:

Zone_Value = data.Table.DataBodyRange... 中的 data.Table 是什么?您的ListObjectData_Table。 – 大笨钟

应该是Data_Table

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

然后代码将拒绝编译,因为变量data 没有声明(选项强制你声明每个变量)。

因此,表达式data.Table.DataBodyRange 在运行时被评估为一个成员调用,在名为data 的对象上查找Table 成员,该对象声明于-the-fly 由 VBA(因为缺少 Option Explicit)作为隐含的 Variant,其值为 Empty,这是...不是对象

因此,需要对象,因为您不能对 非对象进行成员调用

Rubberduck 会告诉你缺少的Option Explicit,事实上data 没有被声明也从未被分配,并且在没有被分配的情况下被使用。还可以帮助您使indentation 更加一致;-)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多