vba 忽略我的 with 语句

vba ignore my with statement

我试图使用 with...end with 在 excel 中的 vba 中指定搜索范围。我在一个文件中试过,效果很好。然后我在另一个中尝试了它,with 语句被忽略了。以下是示例代码:

Sub feat_overlap_within_set()

Workbooks("stimulus_select_3.3.xlsm").Worksheets("feat_overlap within set 1").Activate

With Range("A2:A542")

Cells.Find(what:="hut").Activate

End With

End Sub

非常简单,我在这个工作表中有 2 个包含单词 "hut" 的单元格,一个在 A 列中,另一个在 B 列中。我希望总能在 A 列中找到那个,但是相反,每当我 运行 这个时,它总是指向 B 列中的那个。它在使用相同版本的 excel (2016) 创建的另一个文件中工作得很好。

您没有使用 With 块中可用的 "shortcutting"。 With 块的设计主要是为了让您在任何地方键入以 . 开头的内容,它都会被视为 withObject..

Sub feat_overlap_within_set()

    Workbooks("stimulus_select_3.3.xlsm").Worksheets("feat_overlap within set 1").Activate

    With Range("A2:A542")

        .Cells.Find(what:="hut").Activate

    End With

End Sub

添加前导 . 是关键。没有它,你只是指 Cells,默认为 ActiveWorkbook.ActiveSheet.Cells.


一个更好的方法,避免 sheet 的 Activate,并将 Range.Cells.Find 更改为 Range.Find,并检查是否匹配找到,将是:

Sub feat_overlap_within_set()

    With Workbooks("stimulus_select_3.3.xlsm").Worksheets("feat_overlap within set 1").Range("A2:A542")
        Dim dest As Range
        Set dest = .Find(what:="hut")
        If dest Is Nothing Then
            MsgBox "Not found"
        Else
            Application.GoTo dest
        End If
    End With
End Sub