没有对象时,Excel的VBA引发“对象variables或块variables未设置”

在我的代码中,我已经声明了这些variables:

Dim Field_Name, Datatype, row As Integer 

然后,在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 

但是,该代码会抛出“对象variables或块variables未设置”运行时错误。 根据API,Range.Column和Range.row属性是一个只读Long。 我试图使我的variables的数据types为长,但没有成功。 看来,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 

但是,所述variables不是对象,因此会抛出“Object required”编译错误。

任何帮助,将不胜感激。 如果您不确定如何解决这个问题,那么任何解决方法或替代方法来获取单元格的列号和行号将不胜感激。

尽pipe这是一个古老的问题,我也想说一些。

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

我find了一个简单的解决scheme:

Find找不到指定的string时,它返回Nothing 。 在Find之后直接调用任何东西都会导致这个错误。 所以,你的.Column或者.row会抛出一个错误。

在我的情况下,我想要一个find的单元格的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 

那么下面的代码呢?

  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 

简体回答:

您的.Find调用正在抛出错误。

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

 Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column 

没有“设置”,你正试图给variables分配“空”。 “Nothing”只能分配给一个对象。

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

为了解释所有(有根据的)代码评论,你的Dim语句是不好的。 前两个variables没有被“键入”,最后变成了变体。 具有讽刺意味的是,这就是我刚描述的解决scheme的原因。

如果您决定清理Dim语句,则将DataType声明为变体…

 Dim DataType as variant