Excel VBA“;应用程序定义或对象定义错误“;

Excel VBA“;应用程序定义或对象定义错误“;,excel,vba,Excel,Vba,我有下面一行VBA代码,用于按标题名称查找列,并将整个列作为一个范围: Set w1 = wbk.Sheets("Sheet1") Set parentRange = w1.Rows(1).Find("portfolioName").Offset(1).Resize(num_rows - 1, 1) 它在一个工作簿中工作得非常好,但是当我在新工作簿中尝试它时,会出现以下错误: <Application-defined or object-defined error> 要么是找不到

我有下面一行VBA代码,用于按标题名称查找列,并将整个列作为一个范围:

Set w1 = wbk.Sheets("Sheet1")
Set parentRange = w1.Rows(1).Find("portfolioName").Offset(1).Resize(num_rows - 1, 1)
它在一个工作簿中工作得非常好,但是当我在新工作簿中尝试它时,会出现以下错误:

<Application-defined or object-defined error>

要么是找不到portfolioName(如果您禁用了“option compare text”(选项比较文本),则可能会遇到区分大小写的问题),要么是没有正确定义num_行。给那两个人检查一下

Dim f1 As Range, f2 As Range

Set w1 = wbk.Sheets("Sheet1")
'find first instance
Set f1 = w1.Rows(1).Find("portfolioName",lookat:=xlWhole)
If Not f1 Is Nothing then
    'find second instance
    Set f2 = f1.offset(0, 1).Resize(1, w1.Columns.Count - f1.Column).Find("portfolioName",lookat:=xlWhole)
    If not f2 is nothing then
        'set range based on f2
        Set parentRange = w1.Range(f2.Offset(1, 0), _
                                   w1.cells(rows.count,f2.column).end(xlup))

    end if
end if

在您发布的代码中,您可以从ColA获得行数,但这似乎不可靠?在上面的代码中,它只选择搜索词第二个实例下的所有数据。

此新工作簿是否有名为
“Sheet1”
的工作表?也可能是
.Find()
只是不返回任何内容,因此范围
parentRange
不会以值结束…失败时
num_rows
的值是多少?
范围。如果找不到要查找的内容,Find
将返回
Nothing
,这将抛出错误91,因为您不能执行任何操作。另外,
Range.Find
“记住”其在调用之间的可选参数值,因此在宏调用之间手动执行Ctrl+F并调整内容将使宏的行为不同-您应该为每个可选参数提供一个值。@看起来num_rows是1,我相信正是这一点导致了马修所说的射程为零。我不知道为什么会出现这种情况,我更新了文章,介绍了num_行的计算方法,并在另一个工作表中使用。有时链接调用是问题的原因。要找到问题代码的根源,请将链接调用拆分为单独的调用。例如,
Set parentRange=w1.Rows(1).查找(“portfolioName”).Offset(1).调整大小(num_Rows-1,1)
。首先,
w1。行(1)
不能不正确,因为总是有第一行。接下来,
Find(…)
-这个函数返回
Range
。将返回值赋给它自己的变量。下一步(如果
Find
工作正常),您将获取
Offset(1)
,到目前为止,诸如此类……您介意解释一下此代码的功能吗?为什么resize的第二个参数硬编码为200/这意味着什么?要查找
f2
,您需要查看
f1
的右侧(从
f1
右侧的单元格开始)-我刚硬编码了200,作为执行此操作时可能需要检查的最大列数,但是,如果您想检查行的其余部分,则
Resize(1,ws.Columns.Count-f1.Column)
会执行此操作。它会给我另一个运行时错误,在Set parentRange行上显示Object Required。我遗漏了什么吗?对不起,那行应该有
f2.列
Dim f1 As Range, f2 As Range

Set w1 = wbk.Sheets("Sheet1")
'find first instance
Set f1 = w1.Rows(1).Find("portfolioName",lookat:=xlWhole)
If Not f1 Is Nothing then
    'find second instance
    Set f2 = f1.offset(0, 1).Resize(1, w1.Columns.Count - f1.Column).Find("portfolioName",lookat:=xlWhole)
    If not f2 is nothing then
        'set range based on f2
        Set parentRange = w1.Range(f2.Offset(1, 0), _
                                   w1.cells(rows.count,f2.column).end(xlup))

    end if
end if