用于选择列中数据的VBA运行时错误1004

时间:2018-03-13 10:07:42

标签: vba excel-vba excel

您好我想选择低于找到的单元格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我知道这可能是一个愚蠢的问题,但我是乞丐。谢谢。

2 个答案:

答案 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