Object 单元格范围中的应用程序定义或对象定义错误visual basic

Object 单元格范围中的应用程序定义或对象定义错误visual basic,object,excel,for-loop,excel-2010,vba,Object,Excel,For Loop,Excel 2010,Vba,下面的代码有一些问题。我在启动第二个for循环时遇到了应用程序定义或对象定义的错误。第二个循环范围的格式似乎是导致问题的原因。删除Sheets()对象可以消除错误,但是脚本从错误的工作表中读取,并且不返回任何数据 这段代码的目标是在数据的垂直数组上循环,然后如果找到与下拉列表中的选择匹配的内容,它将在数据的水平数组上循环,如果找到“是”值,则返回颜色更改 If Not Intersect(Target, Range("countryProductCell")) Is Nothing Then

下面的代码有一些问题。我在启动第二个for循环时遇到了应用程序定义或对象定义的错误。第二个循环范围的格式似乎是导致问题的原因。删除Sheets()对象可以消除错误,但是脚本从错误的工作表中读取,并且不返回任何数据

这段代码的目标是在数据的垂直数组上循环,然后如果找到与下拉列表中的选择匹配的内容,它将在数据的水平数组上循环,如果找到“是”值,则返回颜色更改

If Not Intersect(Target, Range("countryProductCell")) Is Nothing Then
    lastcolumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
    Dim cellRow As Integer
    cellRow = Target.Row
    Dim defaultCellColumn As Integer
    defaultCellColumn = 4
    i = 5
    j = 1
    k = 1
    If Not Cells(cellRow, defaultCellColumn).Value = "(Select Title)" Then
        For Each countryCell In Range(Cells(cellRow, defaultCellColumn + 1), Cells(cellRow, lastcolumn))
            If countryCell.Value = "Use Default" Then
                countryCell.Interior.ColorIndex = 3
            End If
        Next
        For Each nameCell In Sheets("Active Product Catalog").Range("ProductNames")
            If nameCell.Value = Cells(cellRow, defaultCellColumn).Value Then
                'Error on the line below!
                For Each purchaseableCell In Sheets("Active Product Catalog").Range(Cells(nameCell.Row, 10), Cells(nameCell.Row, 27))
                    If purchaseableCell.Value = "Yes" Then
                        'If Purchaseable, Change Color
                        Sheets("Home Template").Cells(cellRow, defaultCellColumn + j).Interior.ColorIndex = 35
                    End If
                    j = j + 1
                Next
            End If
            k = k + 1
        Next
    ElseIf Cells(cellRow, defaultCellColumn).Value = "(Select Title)" Then
        If Target.Value = "(Select Title)" Then
            Target.Interior.Color = Cells(Target.Row, Target.Column - 1).Interior.Color
            For Each countryCell In Range(Cells(cellRow, defaultCellColumn + 1), Cells(cellRow, lastcolumn))
                If countryCell.Value = "Use Default" Then
                    countryCell.Interior.ColorIndex = 2
                End If
                i = i + 1
            Next
        ElseIf Target.Value = "Use Default" Then
            Target.Interior.ColorIndex = 2
        ElseIf Application.VLookup(ActiveSheet.Cells(cellRow, Target.Column), Sheets("Active Product Catalog").Range("E:AK"), Target.Column, False) = "Yes" Then
            Target.Interior.ColorIndex = 35
        ElseIf Not Application.VLookup(ActiveSheet.Cells(cellRow, Target.Column), Sheets("Active Product Catalog").Range("E:AK"), Target.Column, False) = "Yes" Then
            Target.Interior.ColorIndex = 3
        End If
    End If
End If

您需要限定代码中的单元格引用。失败的原因是,您正在使用一张图纸(活动图纸)中的两个单元格引用,并要求VBA在另一张图纸(活动产品目录)中定义范围。试着这样做:

Sheets("Active Product Catalog").Range(Sheets("Active Product Catalog").Cells(nameCell.Row, 10), Sheets("Active Product Catalog").Cells(nameCell.Row, 27))

如果创建工作表对象或使用With语句,您可能会发现阅读起来更容易一些。

您需要限定代码中的单元格引用。失败的原因是,您正在使用一张图纸(活动图纸)中的两个单元格引用,并要求VBA在另一张图纸(活动产品目录)中定义范围。试着这样做:

Sheets("Active Product Catalog").Range(Sheets("Active Product Catalog").Cells(nameCell.Row, 10), Sheets("Active Product Catalog").Cells(nameCell.Row, 27))

如果您创建一个工作表对象或使用With语句,您可能会发现它更容易阅读。

正如@steveo40所说,但更广泛地说,永远不要使用
Range()
Cells()
不包含限定的工作表引用:否则,您总是依赖当前活动的工作表:这会使您的代码容易出错,很难追踪。@steveo40所说的,但更广泛地说,永远不要使用
范围()
单元格()
不包含合格的工作表引用:否则,您总是依赖当前活动的工作表:这使您的代码容易出错,很难跟踪。