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

问题描述 投票:0回答:4

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

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

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

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

vba excel vb6 excel-2013
4个回答
20
投票

我在使用

.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

15
投票

简单回答:

您的 .Find 调用引发错误。

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

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

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

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

解释一下所有(有保证的)代码批评,你的 Dim 语句很糟糕。前两个变量没有被“键入”并最终作为变体。讽刺的是,这就是我刚才描述的解决方案有效的原因。

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

Dim DataType as variant

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

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
© www.soinside.com 2019 - 2024. All rights reserved.