当没有Object时,VBA for Excel会抛出"对象变量或未设置块变量"

7yp*_*oid 10 vb6 excel vba excel-vba excel-2013

在我的代码中,我声明了这些变量:

Dim Field_Name, Datatype, row As Integer
Run Code Online (Sandbox Code Playgroud)

然后,在For循环中,我有这个代码:

Field_Name = Worksheets(i).UsedRange.Find("Field Name").Column
Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
row = Worksheets(i).UsedRange.Find("Field Name").row + 1
Run Code Online (Sandbox Code Playgroud)

但是,该代码抛出"对象变量或未设置块变量"运行时错误.根据API,Range.Column和Range.row属性是只读的Long.我已经尝试将变量的数据类型设置为Long,但没有成功.看起来VBA期待我这样做

Set Field_Name = Worksheets(i).UsedRange.Find("Field Name").Column
Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
Set row = Worksheets(i).UsedRange.Find("Field Name").row + 1
Run Code Online (Sandbox Code Playgroud)

但是,所述变量不是对象,因此这样做会抛出"Object required"编译错误.

任何有关这方面的帮助将不胜感激.如果您不确定如何修复它,那么获取单元格的列号和行号的任何变通方法或替代方法都将非常感激.

小智 11

即使这是一个老问题,我也想说些什么.

我在使用该.Find方法时遇到同样的问题.我来到这个问题,所以其他人也会这样做.

我找到了一个解决问题的简单方法:

什么Find时候找不到它返回的指定字符串Nothing.之后直接调用任何内容Find都会导致此错误.所以,你.Column.row将抛出一个错误.

在我的情况下,我想要一个Offset找到的单元格并以这种方式解决它:

Set result = Worksheets(i).Range("A:A").Find(string)
    If result Is Nothing Then
        'some code here
    ElseIf IsEmpty(result.Offset(0, 2)) Then
        'some code here
    Else
        'some code here
    End If
Run Code Online (Sandbox Code Playgroud)


Joh*_*eph 5

简化答案:

您的.Find调用引发错误。

只需在该行中添加“ Set”即可解决该问题。即..

Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column
Run Code Online (Sandbox Code Playgroud)

如果没有“设置”,则试图将“无”分配给变量。“无”只能分配给一个对象。

您可以在这里停止阅读,除非您想了解关于代码的所有其他(有效的,值得的)大惊小怪的事情。

为了解释所有(必要的)代码检查,您的Dim语句是错误的。前两个变量没有被“类型化”,并最终成为变量。具有讽刺意味的是,这就是我刚才描述的解决方案起作用的原因。

如果您决定清理该Dim语句,则将DataType声明为变量。

Dim DataType as variant
Run Code Online (Sandbox Code Playgroud)

  • @BigBen`Find("whatever").AnyChainedMemberCall`实际上是OP抛出错误91的地方;这里的第一部分部分关闭,变量甚至看不到赋值的发生,因为在评估 RHS 时会引发错误。OP 的变量名称具有误导性,这没有帮助。声明为“As Integer”的行号也是一个应该指出的潜在问题;16 位整数数据类型长期以来一直无法适应工作表中的行数。但是对于 OP 的声明,“Set DataType = ...”不是一个完全后期绑定的语句吗? (2认同)

Cap*_*ABC 2

下面的代码怎么样:

    For i = 1 to 1 ' change to the number of sheets in the workbook
    Set oLookin1 = Worksheets(i).UsedRange
    sLookFor1 = "Field Name"
    Set oFound1 = oLookin1.Find(What:=sLookFor1, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)

    If Not oFound1 Is Nothing Then
    Field_Name = oFound1.Column
    RRow = oFound1.Row +1

' code goes here

    Else
    Msgbox "Field Name was not found in Sheet #" & i
    End If

    Set oLookin2 = Worksheets(i).UsedRange
    sLookFor2 = "Datatype"
    Set oFound2 = oLookin2.Find(What:=sLookFor2, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)

    If Not oFound2 Is Nothing Then
    DataType = oFound2.Column

' code goes here

    Else
    Msgbox "Datatype was not found in Sheet #" & i
    End If
    Next i
Run Code Online (Sandbox Code Playgroud)

  • + 1 BirdsView:这应该可以。如果您声明变量并缩进代码,这可能会是锦上添花;) (4认同)