您好我想选择低于找到的单元格MEASURED VALUE
的数据,但我遇到了运行时错误而不知道原因。
Sub Macro1()
Dim ws As Worksheet
Dim i As Range
Dim j As Range
Set ws = Worksheets("bank")
Set i = ws.Range("A1").CurrentRegion.Find(What:="MEASURED VALUE", LookAt:=xlWhole).Offset(1, 0)
Set j = Range(i, Range(i).End(xlDown))
End Sub
Set j = Range(i, Range(i).End(xlDown))
p.s我知道这可能是一个愚蠢的问题,但我是乞丐。谢谢。
答案 0 :(得分:1)
使用Find
功能时,请始终为Find
无法找到匹配项的方案做好准备,您可以通过在Find
后面加上以下行来做到这一点:< / p>
If Not i Is Nothing Then
修改后的代码
Option Explicit
Sub Macro1()
Dim ws As Worksheet
Dim i As Range
Dim j As Range
Set ws = Worksheets("bank")
With ws
Set i = .Range("A1").CurrentRegion.Find(What:="MEASURED VALUE", LookIn:=xlValues, LookAt:=xlWhole)
' make sure first find was successful
If Not i Is Nothing Then
Set j = .Range(i.Offset(1, 0), i.Offset(1, 0).End(xlDown))
Else
MsgBox "Error!, couldn't find 'MEASURED VALUE'", vbCritical
End If
End With
End Sub
答案 1 :(得分:1)
如果找到i
,如果您尝试此操作,则可以:
Set j = Range(i, Range(i.Address).End(xlDown))
它起作用的原因是因为Range()
期望一个字符串,i.Address
给出一个字符串。另一种使其有效的方法是:
Set j = Range(i, i.End(xlDown))
此处您不使用Range()
,但使用已定义为范围的i
,因此它具有.End(Direction As xlDirection)
属性。每当您使用.Find
时,最好检查值是否为Not Nothing
(VBA没有更好的方法来检查它是否是某种东西):
If Not i Is Nothing Then
通常,当您引用Range()
,Cells()
,Rows()
,Columns()
时,始终引用父工作表是最佳做法,否则该范围被分配给ActiveSheet
,可能会很痛苦。
但是,在这种特定情况下,j
会被引用到正确的工作表,因为i
已分配给它。在空的Excel文件上尝试这个小代码来查看 - 它激活第一个工作表,但第二个是范围j
的父代:
Public Sub TestMe()
Dim ws As Worksheet
Worksheets(1).Activate
Set ws = Worksheets(2)
Dim i As Range
Dim j As Range
Set i = ws.Range("A1").CurrentRegion
Set j = Range(i, i.End(xlDown))
Debug.Print j.Parent.Name
End Sub