调整VBA中的范围

时间:2015-08-25 17:39:50

标签: excel vba

我试图通过向下查看下一个使用值的列的行来调整范围,但是我得到一个对象定义的错误。有什么想法吗?

Set vrng = ActiveSheet.Range("details_table").Find(sest, , xlValues, xlWhole)
Set vrng = vrng.Resize(vrng.End(xlDown).Row)

3 个答案:

答案 0 :(得分:0)

如果不起作用,请删除第二行末尾的.row,然后尝试

Set vrng = Range(vrng,vrng.end(xldown))

答案 1 :(得分:0)

Sub test()

Dim vrng As Range

Set vrng = Range("Compannies").Find(what:="Delta", LookIn:=xlValues, lookat:=xlWhole)
Set vrng = vrng.Resize(vrng.Rows.End(xlDown).Row)
vrng.Select
End Sub

您只需确保在vrng.rows之前使用.End(xldown)

但是,我建议将第一个变量的名称更改为sestCell,然后使用Set vrng = sestCell.Resize(sestcell.Rows.End(xldown).Row)以避免混淆。

它正在做的是,你的Find将返回一个小区范围(特别是一个小区地址)。然后,由于您要将该范围向下扩展,您需要指定要扩展范围的行:.Resize(vrng.rows.End(xldown).Row)

答案 2 :(得分:0)

如果vrng之后没有其他数据,则.End(xlDown).Row将返回工作表中的行数。假设vrng是A100:

Set vrng = Range("A100")
'// There is no data below vrng, so:
nextRow = vrng.End(xlDown).Row '// Returns 65,536 (pretend it's XL97)

vrng.Resize(nextRow) '// <~~ This will error

Resize()方法扩展给定的范围对象,所以如果我们从A100开始并扩展65,536行,那么A65636就不存在了,所以发生错误。

我建议使用Immediate If来管理:

Set vrng = vrng.Resize(IIf(vrng.End(xlDown).Row = Rows.Count, vrng.Rows.Count, vrng.End(xlDown).Row - vrow.Cells(1).Row)

如果您不熟悉Immediate If,那么常规If块将起作用:

If Not vrng.End(xlDown).Row = Rows.Count Then
    Set vrng = vrng.Resize(vrng.End(xlDown).Row - vrng.Cells(1).Row, )
End If