Почему я получаю ошибку с Find в VBA? - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь найти строку в диапазоне, используя VBA.Я собрал воедино некоторый код, но в строке «Если нет» получаю ошибку 1004:

Sub test1()

Dim wb As Workbook
Dim ws As Worksheet
Dim found_range As Range
Dim search_range As Range

Set wb = Workbooks("D1")
Set ws = wb.Sheets("Master data")

Set search_range = ws.Cells(147, 1).EntireRow

If Not Range(search_range).Find("Test") Is Nothing Then
    'match found
    Set found_range = Range(search_range).Find("Test")
    Debug.Print found_range.Column
Else
    MsgBox "No match found"
    'no match found
End If

End Sub

Есть идеи, почему я получаю ошибку?

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Я немного путаюсь с двойным .Find
Если ваш Range.Find метод уже возвращает объект Range один раз, нет необходимости устанавливать его дважды.

Также search_range уже является объектом Range, поэтому необходимо попытаться инкапсулировать его в другой объект Range().

На самом деле это причина, вы получаете ошибку, потому что она ожидает строку внутри приведенного типа Range(<string>)

Как правильно заметил @MathieuGuindon:

Это причина ошибки, но причина в том, что безусловный вызов Range является дочерним объектом любого ActiveSheet есть, и вы не можете сделать Sheet1.Range(Sheet2.Cells(1, 1), Sheet2.Cells(1,> 10)) - ошибка 1004 генерируется в коде OP, потому что ws не ActiveSheet; квалификация вызова Range с ws исправила бы ошибка тоже ... но да Range(someRange) определенно избыточно.

Sub test1()

  Dim wb As Workbook
  Dim ws As Worksheet
  Dim found_range As Range
  Dim search_range As Range

  Set wb = Workbooks("D1")
  Set ws = wb.Sheets("Master data")

  Set search_range = ws.Cells(147, 1).EntireRow
  Set found_range = search_range.Find("Test")

  If Not found_range Is Nothing Then
      Debug.Print found_range.Address
  Else
      MsgBox "No match found"
  End if

End Sub
0 голосов
/ 03 мая 2019

Вы можете использовать:

Option Explicit

Sub test1()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim found_range As Range, search_range As Range

    Set wb = Workbooks("D1")
    Set ws = wb.Sheets("Master data")

    Set search_range = ws.Rows(147).EntireRow
    Set found_range = search_range.Find(What:="Test", LookIn:=xlValues, LookAt:=xlWhole)

    If Not found_range Is Nothing Then

        Debug.Print found_range.Column

    Else
        MsgBox "No match found"
        'no match found
    End If

End Sub

Примечание:

  • если вы хотите точное совпадение, вы должны использовать LookAt: = xlWhole
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...