Метод Excel Vba Range.Find

У меня была проблема, и метод Range.Find должен выполнять эту работу,

На сайте Microsoft ( метод Rang.Find ) найден код, который, как я думал, мне понадобится:

Set C = wsCountry.Range("G:G").Find(What:="BOSS", MatchCase:=True, LookAt:=xlWhole, LookIn:=xlValues, SearchDirection:=xlNext, SearchOrder:=xlByRows) If Not C Is Nothing Then firstAddress = C.Address Do If wsRep.Range("B:B").Find(What:=C.Offset(0, -5), LookIn:=xlValues) Is Nothing Then wsUser.Range("SpecialPO").Find(What:="BOSS", MatchCase:=True, LookIn:=xlValues).Offset(0, 1) = wsUser.Range("SpecialPO").Find(What:="BOSS", MatchCase:=True, LookIn:=xlValues).Offset(0, 1) + 1 End If Set C = wsCountry.Range("G:G").FindNext(C) If C Is Nothing Then Exit Do Loop While C.Address <> firstAddress End If 

Проблема:

При попытке установить переменную C во второй раз с помощью .FindNext, она будет вызывать значение «Nothing». Хотя столбец имеет еще 2 значения как «BOSS»,

(Я нашел содержание контента и, вероятно, буду использовать другое решение, предложенное siddharthrout в разделе 3. Хотя я хочу знать, почему это решение не работает так, как предполагалось)

Как всегда, большое спасибо заранее.

Ответ на исходный вопрос

Вопрос:

Следующая строка вызывает ошибку.

 Loop While Not C Is Nothing And C.Address <> firstAddress 

Ошибка: переменная объекта или переменная блока не установлена.

В VBA If / While и т. Д. Оценивают все части составных условий (And, Or), в отличие от, например, C ++, то есть в VBA A и Or не закорочены. Таким образом, ваша первая проверка на «Истина» не приводит к тому, что вторая проверка члена не выполняется, следовательно, ошибка переменной не задана.

Таким образом, решение заключается в том, чтобы проверять Is Nothing отдельно перед проверкой каких-либо членов через вложенные If. Это невозможно сделать в режиме «Вниз», поэтому его необходимо выполнить отдельно до конца цикла While, и вы должны сохранить результат в переменной для проверки в «Вниз».

Несмотря на то, что код, который вы отправили из MSDN, все равно может быть неправильным 🙂

Чтобы увидеть это в действии, запустите следующий код в модуле VBA:

 Sub x() Dim o As Range Set o = Nothing Do While Not o Is Nothing And o.Address = "whatever" Call MsgBox("Made it!") Loop End Sub 

Ответ на обновленный вопрос

Когда вы вызываете .Find в диапазоне, вы создаете контекст поиска. Вот как .FindNext знает, что искать дальше. Когда вы «прерываете» последовательность Find / FindNext со вторым (несвязанным) .Find (например, в неродственном диапазоне), вы входите в этот контекст. В следующий раз, когда вы захотите продолжить свой .FindNext в своем исходном диапазоне, контекст будет непригодным, а .FindNext начнет возвращать неправильные результаты. Обратите внимание, что .Find не очень хорошая функция для использования; он фактически изменит значения по умолчанию в диалоговом окне «Поиск пользователя». Это также указывает на то, что в Excel есть только один контекст поиска, и он делится с графическим интерфейсом, управляемым пользователем (не очень, но что вы можете сделать).

См. Приведенный ниже код, как это работает. Выберите пустой лист, заполните его так:

 Column A Column B ad be cf ad be cf 

Затем запустите код ниже; он покажет вам «Did not FindNext». Теперь закомментируйте второй. Направьте на oSearchRangeB и запустите его снова; теперь он вернется «Did FindNext».

 Sub x() Dim oSearchRangeA As Range Set oSearchRangeA = ActiveSheet.Range("A:A") Dim oSearchRangeB As Range Set oSearchRangeB = ActiveSheet.Range("B:B") Dim oFoundCell As Range Set oFoundCell = oSearchRangeA.Find( _ What:="b", MatchCase:=True, LookAt:=xlWhole, LookIn:=xlValues, _ SearchDirection:=xlNext, SearchOrder:=xlByRows _ ) If Not oFoundCell Is Nothing Then Dim oInterferingFoundCell As Range Set oInterferingFoundCell = _ oSearchRangeB.Find(What:="f", LookIn:=xlValues) Set oFoundCell = oSearchRangeA.FindNext(oFoundCell) If oFoundCell Is Nothing Then Call MsgBox("Didn't FindNext") Else Call MsgBox("Did FindNext") End If End If End Sub 
  • Не удалось выполнить метод VBA Validation.Add
  • Переменные VBA Dim Dim
  • Ошибка компиляции: метод или данные не найдены vba
  • Interesting Posts

    открытие powerpoint с использованием excel vba на macintosh

    Мне нужно иметь возможность выбирать столбцы в Excel, указав номера столбцов в vba

    Способы автоматизации Excel для отчетности по расписанию, где сводные таблицы не будут сокращать его, а данные поступают из многих мест?

    Любой простой способ сделать VLOOKUP сочетать «линейную интерполяцию» в excel?

    Проверка данных, установленная в Excel 2010, не выполняется в Excel 2007

    как поддерживать формат значений ячеек, при копировании между двумя рабочими книгами excel и отображении в текстовых полях

    Союз ценностей в двух диапазонах

    Jexcel – Обновление Excel с данными

    Как справиться с открытием диалогового окна сохранения

    Слияние 2 или более вложенных словарей в 1 и упорядочение элементов в индивидуальном порядке

    Избегание «Не удается найти проект или библиотеку» на компьютере без приложения

    Суммировать значения строки до того же столбца, что и другая строка

    Размещение VBA в другом листе

    VBA excel Office 2016 Mac – Инструменты Ссылки недоступны

    Изменение размера таблицы динамически

    Давайте будем гением компьютера.