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

时间:2014-03-29 18:29:13

标签: excel vba excel-vba vb6 excel-2013

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

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

但是,该代码抛出" Object变量或者没有设置块变量"运行时错误。根据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

但是,所说的变量不是对象,所以这样做会抛出"对象所需的"编译错误。

对此的任何帮助将不胜感激。如果您不确定如何修复它,那么我们将非常感谢您获取单元格的列号和行号的任何变通方法或替代方法。

4 个答案:

答案 0 :(得分:10)

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

使用.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

答案 1 :(得分:4)

简化回答:

您的.Find电话正在抛出错误。

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

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

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

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

用所有(保证的)代码批评来解释,你的Dim语句很糟糕。前两个变量没有被“打字”,最终变成了变体。具有讽刺意味的是,这就是我刚才描述的解决方案有效的原因。

如果您决定清理该Dim语句,请将DataType声明为变体...

Dim DataType as variant

答案 2 :(得分:1)

以下代码如何:

    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

答案 3 :(得分:1)

这是一个古老的老帖子-但是当我无法弄清为什么突然无法将PDF导出导入到我的excel工作表时,我碰到了它。

对我来说,问题是我试图匹配的行被合并了-首先对整个工作表进行了简单的取消合并,并且它就像一种魅力。

      '////// Select and open file
  FieldFileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*") 'pick the file
  Set frBook = Workbooks.Open(FieldFileName, UpdateLinks:=0, ReadOnly:=True, AddToMru:=False)
  For Each mySheet In frBook.Worksheets
    mySheet.Cells.UnMerge
  Next mySheet