【问题标题】:VBA for Excel throws "Object variable or with block variable not set" when there is no Object没有对象时,VBA for Excel 会抛出“对象变量或未设置块变量”
【发布时间】:2014-05-09 05:29:42
【问题描述】:

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

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

但是,该代码会引发“对象变量或未设置块变量”运行时错误。根据 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

但是,所述变量不是对象,所以这样做会引发“需要对象”编译错误。

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

【问题讨论】:

  • 将您的“Dim”更改为三个 Dim,每个 Dim 只有一个变量名称和类型。然后再试一次。如果仍然有错误,那么它在哪一行?参考:msdn.microsoft.com/en-us/library/office/…
  • 您的错误最可能的问题是Find 返回Nothing,即字符串"Field Name""Datatype" 未找到
  • 看看你的其余代码会很好,因为有时“未闭合”循环或 with 语句会导致这种错误。但我同意 simoco 的观点,因为您的 Find 可能什么也没找到。
  • 另外,一旦你解决了这个错误,你应该重新考虑将你的变量声明为整数类型。 Column 应该没问题,但是如果您使用的是 Excel 2007+ 版本,则有超过 32,768 行;因此,如果您感兴趣的行更靠后,您将收到溢出错误。
  • 另一个批评:Dim Field_Name, Datatype, row As Integer 仅将“行”声明为整数;另外两个将是 Variant 类型。查看帮助以获取有关 Dim 语句的信息。

标签: vba excel vb6 excel-2013


【解决方案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

【讨论】:

    【解决方案2】:

    虽然这是个老问题,但我也想说点什么。

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

    【讨论】:

    • 非常感谢您的回答,这恰到好处。问题是什么都没有。
    • 感谢@matroid 指出这一点。我什至没有注意到宏记录器添加了 .Activate 导致语句总是失败。
    • 我在没有方法链接的情况下得到错误,rng.find("Doesn't exist") 导致对象未设置。
    【解决方案3】:

    简单回答:

    您的 .Find 调用引发了错误。

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

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

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

    您可以停止阅读此处,除非您想了解您的代码的所有其他(有效、值得)大惊小怪。

    为了解释所有(有根据的)代码批评,您的 Dim 语句很糟糕。前两个变量没有被“输入”并最终成为变体。具有讽刺意味的是,这就是我刚才描述的解决方案有效的原因。

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

    Dim DataType as variant
    

    【讨论】:

    • @BigBen Find("whatever").AnyChainedMemberCall 实际上是抛出 ​​OP 错误 91 的地方;这里的第一部分部分关闭,变量甚至没有看到赋值发生,因为在评估 RHS 时会引发错误。 OP 的变量名具有误导性,这无济于事。声明As Integer 的行号也是一个潜在的问题,应该指出;很长一段时间以来,16 位整数数据类型无法适应工作表中的行数。但是有了 OP 的声明,Set DataType = ... 不是完全后期绑定的声明吗?
    • Set Datatype = Worksheets(i).UsedRange.Find("Datatype").Column 是一个即时错误。 SetColumn 不属于同一行。对Dim DataType As Variant 的建议也不会改变OP 的任何内容。 Find 返回一个Range,所以Find 的结果应该分配给一个Range 变量,不是一个Variant
    【解决方案4】:

    下面的代码呢:

        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
    

    【讨论】:

    • + 1 BirdsView:这应该可以。如果您声明变量并缩进代码,这可能是锦上添花;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多