Vba excel findnext не работает
Метод Range.Find находит первую ячейку в заданном диапазоне по точному или частичному совпадению условия поиска с ее значением, формулой или примечанием. На этом работа метода Find заканчивается. При новом запуске он найдет ту же ячейку.
Что делать, если в диапазоне есть еще ячейки, соответствующие условию поиска, и их тоже необходимо найти?
Для этих целей предназначен метод Range.FindNext . Он продолжает в диапазоне поиск следующей ячейки, соответствующей условию, заданному в предыдущей строке с методом Find . Для того, чтобы найти все такие ячейки, метод FindNext повторяется с помощью одного из циклов VBA Excel.
Синтаксис
- Expression – выражение (переменная), возвращающее объект Range, в котором осуществляется поиск.
- After – необязательный аргумент, представляющий из себя единственную ячейку диапазона, после которой начнется поиск. Если аргумент не указан, поиск начнется после левой верхней ячейки диапазона. В обоих случаях, ячейка по умолчанию (левая верхняя) или ячейка, заданная параметром After, в поиске не участвует.
Пример использования
Условие
В таблице с названиями басен необходимо выбрать басни, в названия которых входит слово Лев:
Решение
Результат
Расшифровка
1. Объявляем переменные:
Dim myCell As Range, adr As String, str As String
- myCell – объектная переменная, которой присваивается ссылка на ячейку, найденную методами Find и FindNext ;
- adr – адрес первой найденной ячейки, который нужен для остановки цикла после однократного прохождения по ячейкам указанного диапазона;
- str – в эту переменную записывается содержимое найденных ячеек.
2. Ищем первую ячейку со словом Лев в диапазоне Range("A1:C9") и присваиваем ссылку на нее переменной myCell :
Set myCell = .Find("Л?в", MatchCase:=1)
В искомой строке («Л?в») используем подстановочный знак (?), который заменяет любую букву, чтобы найти слова с корнями «Лев» и «Льв».
Так как животные в названиях басен пишутся с заглавной буквы, в искомой строке тоже используем заглавную букву и поиск с учетом регистра ( MatchCase:=1 ), чтобы не были найдены ячейки со словами «плов«, «клавиатура» и т.д. Хотя ячейки со словами «Левша», «Лавка» и подобные, начинающиеся с большой буквы, будут найдены.
3. Если переменная myCell не содержит Nothing , значит первая ячейка с искомой строкой найдена. Присваиваем ее значение переменной str , а ее адрес – переменной adr .
4. С помощью цикла Do. Loop Until. и метода FindNext находим в диапазоне все остальные ячейки, соответствующие критерию поиска, заданному в строке с методом Find . Добавляем содержимое найденных ячеек в переменную str .
Переменная myCell используется повторно в течение всей работы цикла: Set myCell = .FindNext(myCell) .
Цикл и добавление значений в переменную str завершаются при возврате в первоначально найденную ячейку, адрес которой мы записали (используем условие myCell.Address = adr ).
5. По окончании работы цикла выводим содержимое переменной str в информационном окне MsgBox.
Помогите плиз разобраться, не могу понять почему не срабатывает FindNext?
Заметил следующее,
-первое значение Find ищет,
-потом включается макрос, который внутри Do Loop, после макроса поиск прекращается.
-Если Марков внутри Do Loop отключить, все срабатывает нормально и поиск FindNext продолжается.
Не срабатывает метод FindNext
Добрый! возникла задача создать функцию наподобие ВПР, но для множества критериев. Функция.
clientdataset FindNext()
После манипуляций с отфельтрованым сетом нужно вернутся на ту же запись. Букмарк воде срабатывает.
FindNext в Excel
Необходимо искать слово в столбце, а найдя, записывать его в отдельной ячейке. С первой строкой.
findfirst+findnext
Много лет работал со сладкой парочкой findfirst-findnext и совершенно не подозревал в них такого.
FindNext может иметь только один родоначальник Find. Когда их несколько, да ещё вложенных - путаница неизбежна.
Добавлено через 5 минут
В этом плане аналогично -
Поиск файлов по имени
Конкретно в этом макросе он один. Когда запускается вложенный макрос, так вот Find. Я даже переменные именовал по-разному, чтобы избежать путаницы.
Добавлено через 15 минут
Так вот = там свой
Т.е. хотите сказать, что вся проблема в тех Find, находящихся в макросах, которые запускаются внутри Do Loop? Если так, то как этого Глюка избежать? Заменить Find в головном коле на For Next с условием?
Сяду щас, попробую вылечить проблему. Спасибо за подсказ первого января Первого января советы вдвойне ценней
teplovdl, вот такой простенький модельный пример работающего поиска. Нарисуйте цифру 2 в ячейках первого столбца, где хотите и запустите этот макрос
У меня код примерно такой же. Проблема в том, что при срабатывании макроса расположенного внутри Do Loop (их три? и один из них должен сработать по-любому) FindNext не ищет следующие значение, т.е. результатом поиска является Nothing. При этом если все макросы, расположенные внутри Do Loop, отключить, FindNext спокойно находит следующее значение.
Пока что нашлось решение путем перебора всех значений в столбце через For Next. В принципе тоже решение, просто не понятно почему в моем первоначальном коде не срабатывает FindNext?
teplovdl, у вас первый финд ищет значение переменной Kontr в столбце 5. Думаю вы считаете что и Findnext будет работать по дальнейшему поиску этого значения. А нет! Вы же вторым финдом из цикла ду переключаетесь на поиск CPeni_GP.Value. А потом FindNext работает по нему. Видимо, этого значения не находится и срабатывает выход из цикла. После FindNext поставьте вывод найденной ячейки (или Nothing)
Нет, всё-таки проблема в кодах, которые запускаются внутри do loop, т.к. если убрать эту часть кода, то все ищется нормально, второй Финд никак не мешает.
Люди добрые, поможите, в чем проблема?
так я же вам ро это и писал. Или вы хотите, чтобы написали код для вас? Тогда надо написать, что должны искать ваши финды и финднекст
В тех кодах, которые запускаются внутри do loop финдов нет. Это и смущает. А финд, который внутри do loop, никак не влияет, т.к. если его убрать, результат не меняется.
Код писать конечно не нужно, я уже вышел из ситуации, применив вместо findnext дополнительный цикл for с условием. Все работает как надо, но просто интересно, почему первый вариант не срабатывает.
Ранее я писал, что если этот финд убрать, ситуация не меняется. А вот если убрать три кода, которые запускаются внутри do loop, то все срабатывает нормально.
teplovdl, вы хотя бы подумайте о том, что миллионы пользуются финдом и не испытывают проблем, а у вас они есть, но думаю надо просто разобраться с алгоритмом, а действия типа это убрал и работает ничего не меняют. А вот, что вы хотите получить от вашего макроса, так и неясно. Удачи вам.
Добавлено через 15 минут
Ищется не по переменным, а по значению параметра последнего обращения к финд. Вам это и ВоваЗабил пояснял.
Кстати, ваш архив с файлом у меня открывается с ошибкой
Добавлено через 17 минут
teplovdl, предлагаю следующее: перепишите ваши макросы в обычный модуль без бинари и сохраните в формате xls, ничего, что требует формата xlsm я не вижу. Если пришлете такой файл без zip, то буду смотреть дальше иначе нет смысла, при открытии архива VBAProject не читается и теряется.
Использование метода FindNext
Всем доброго времени суток! Помогите с одной проблемой в Excel-е. На странице находятся 3.
использование TDateTime и FindNext
Всем привет есть такой вопрос возможно ли как нибудь изменить этот код что бы он искал не только.
Проблемы с Recordset.FindNext
Привет всем ! Есть таблица, в которой есть поле ПЛ, содержащее следующие значения: либо 'за.
Работа с FindFirst, FindNext, FindClose
возникли проблемы опроса содержимого директории при использовании этого способа. Во первых выдает.
поиск файлов (findfirst, findnext)
Здравствуйте, вот пробую написать программу для поиска всех файлов( по маске *.*) определенной.
Аналог функций findfirst - findnext
Какие есть в Qt аналоги функций findfirst - findnext ? Задача - получить список файлов в папке. А.
Продолжается поиск, начатый с помощью метода Find . Находит следующую ячейку, которая соответствует тем же условиям, и возвращает объект Range , который представляет эту ячейку. Это не влияет на выбор или активную ячейку.
Синтаксис
выражения. FindNext (После)
выражение: переменная, представляющая объект Range.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
After | Необязательный | Variant | Ячейка, после которой необходимо искать. Соответствует положению активной ячейки, когда поиск выполняется из пользовательского интерфейса. Следует помнить, что после этого должна быть одна ячейка в диапазоне. |
Помните, что поиск начинается после этой ячейки; указанная ячейка не будет искаться до тех пор, пока метод не оберет обратно в эту ячейку. Если этот аргумент не указан, поиск начинается после ячейки в верхнем левом углу диапазона. |
Возвращаемое значение
Примечания
Когда поиск достигает конца указанного диапазона поиска, он возвращается в начало диапазона. Чтобы остановить поиск при этом возврате, сохраните адрес первой найденной ячейки, а затем проверьте адрес каждой последующей найденной ячейки, сравнив его с этим сохраненным адресом.
Пример
В этом примере все ячейки в диапазоне A1:A500 находятся на таблице, содержаной значение 2, и изменяет все значение ячейки на 5. Таким образом, значения 1234 и 99299 содержали 2 и оба значения ячеек станут 5.
В этом примере находятся все ячейки в первых четырех столбцах, содержащих постоянную X, и скрывается столбец, содержащий X.
В этом примере находятся все ячейки в первых четырех столбцах, которые содержат констант X, и снимает столбец, содержащий X.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions and returns a Range object that represents that cell. This does not affect the selection or the active cell.
Syntax
expression.FindNext (After)
expression A variable that represents a Range object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
After | Optional | Variant | The cell after which you want to search. This corresponds to the position of the active cell when a search is done from the user interface. Be aware that After must be a single cell in the range. |
Remember that the search begins after this cell; the specified cell is not searched until the method wraps back around to this cell. If this argument is not specified, the search starts after the cell in the upper-left corner of the range. |
Return value
Remarks
When the search reaches the end of the specified search range, it wraps around to the beginning of the range. To stop a search when this wraparound occurs, save the address of the first found cell, and then test each successive found-cell address against this saved address.
Example
This example finds all cells in the range A1:A500 on worksheet one that contain the value 2, and changes the entire cell value to 5. That is, the values 1234 and 99299 both contain 2 and both cell values will become 5.
This example finds all the cells in the first four columns that contain a constant X, and hides the column that contains the X.
This example finds all the cells in the first four columns that contain a constant X, and unhides the column that contains the X.
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
I have created an Excel UserForm that is working fine for Data Entry into an Excel spreadsheet. I have set-up a Search Button that will also Find at least the first occurence of an item and it populates the UserForm with the values in that entire row. But that Find only finds the first occurence and I can't get it to find the next. I have tried writing a FindNext Sub but I am not having much luck and my VBA skills are pretty low (and the code below does not perform a FindNext, I just did not know how to do it).
What I would like to be able to do. Find a row based on my search (Last_Name). It populates the UserForm with all the data on that row in the spreadsheet. If this is the record I want to update, I want to be able to just correct the particular field and click an Update Button. If this is not the right record, I would like to simply hit a button to perform a Find Next type function.
So what I am seeking assistance to create:
The VBA Code for an "Update" button. It will replace the current rows' data with what is currently in the UserForm when clicked.
The VBA code for a Button to perform a FindNext based on the Last_Name.Value that is entered on the UserForm.
Thank You for any assistance
What I have so far:
Private Sub FillForm()
On Error Resume Next
With Worksheets(2)
Rw = .Range("A:A").Find(Me.Last_Name.Value, LookIn:=xlValues, LookAt:=xlPart).Row
If Rw = 0 Then
MsgBox ("Name not found")
Last_Name = ""
Last_Name.SetFocus
Exit Sub
End If
'fill out form if found
Last_Name.Value = .Range("A" & Rw).Value
First_Name.Value = .Range("B" & Rw).Value
Middle_Name.Value = .Range("C" & Rw).Value
Street_Address.Value = .Range("D" & Rw).Value
Mail_Address.Value = .Range("E" & Rw).Value
Date_of_Birth.Value = .Range("F" & Rw).Value
Phone.Value = .Range("G" & Rw).Value
Drivers.Value = .Range("H" & Rw).Value
Last4_SSN.Value = .Range("I" & Rw).Value
Worker_Assigned.Value = .Range("J" & Rw).Value
Date_Mailed_Original.Value = .Range("K" & Rw).Value
Date_Received_Request.Value = .Range("L" & Rw).Value
Date_Item_Mailed.Value = .Range("M" & Rw).Value
Date_Item_Complete.Value = .Range("N" & Rw).Value
Date_Item_Received.Value = .Range("O" & Rw).Value
First_Vote.Value = .Range("P" & Rw).Value
Second_Vote.Value = .Range("Q" & Rw).Value
Private Sub CommandButton1_Click()
'Retrieve existing record
If Last_Name.Value = "" Then
MsgBox "Please enter a Last Name to modify"
Last_Name.SetFocus
Exit Sub
End If
This thread is locked. You can follow the question or vote as helpful, but you cannot reply to this thread.
Report abuse
Harassment is any behavior intended to disturb or upset a person or group of people. Threats include any threat of suicide, violence, or harm to another. Any content of an adult theme or inappropriate to a community web site. Any image, link, or discussion of nudity. Any behavior that is insulting, rude, vulgar, desecrating, or showing disrespect. Any behavior that appears to violate End user license agreements, including providing product keys or links to pirated software. Unsolicited bulk mail or bulk advertising. Any link to or advocacy of virus, spyware, malware, or phishing sites. Any other inappropriate content or behavior as defined by the Terms of Use or Code of Conduct. Any image, link, or discussion related to child pornography, child nudity, or other child abuse or exploitation.
You can not place a sub above the declaration lines in a module, that's the reason why the code did not work.
And you must name your "Next" button as "cbFindNext", resp. cbFindPrev for the "Previous" button.
And to save the data from the form into the sheet is just the opposite of sub FillForm. .-)
Replace all the code in your form with the code below.
Dim Where As Range
Dim LastFind As Range
Private Sub UserForm_Initialize()
'Setup the Tag property for easier access
Last_Name.Tag = "A"
First_Name.Tag = "B"
Middle_Name.Tag = "C"
Street_Address.Tag = "D"
Mail_Address.Tag = "E"
Date_of_Birth.Tag = "F"
Phone.Tag = "G"
Drivers.Tag = "H"
Last4_SSN.Tag = "I"
Worker_Assigned.Tag = "J"
Date_Mailed_Original.Tag = "K"
Date_Received_Request.Tag = "L"
Date_Item_Mailed.Tag = "M"
Date_Item_Complete.Tag = "N"
Date_Item_Received.Tag = "O"
First_Vote.Tag = "P"
Second_Vote.Tag = "Q"
'Setup a range to search
Set Where = Worksheets("Item_Info").Columns("A")
End Sub
Private Sub ClearForm()
'Clears every control that has a Tag property
Dim C As Control
For Each C In Me.Controls
If C.Tag <> "" Then C.Value = ""
Next
Set LastFind = Nothing
End Sub
Private Sub FillForm()
'Fills every control that has a Tag property
Dim C As Control
For Each C In Me.Controls
If C.Tag <> "" Then
'Fill the textbox from the column specified by the Tag property
C.Value = Intersect(LastFind.EntireRow, LastFind.Parent.Columns(C.Tag))
End If
Next
End Sub
Private Sub SaveForm()
'Copy the data to the database
Dim C As Control
For Each C In Me.Controls
If C.Tag <> "" Then
Intersect(LastFind.EntireRow, LastFind.Parent.Columns(C.Tag)) = C.Value
End If
Next
End Sub
Private Sub cbFindNext_Click()
'Commandbutton "FindNext"
If LastFind Is Nothing Then
Set LastFind = Where.Find(Me.Last_Name, LookIn:=xlValues, LookAt:=xlPart)
Else
Set LastFind = Where.FindNext(LastFind)
End If
If LastFind Is Nothing Then ClearForm Else FillForm
End Sub
Private Sub cbFindPrev_Click()
'Commandbutton "FindPrevious"
If LastFind Is Nothing Then
Set LastFind = Where.Find(Me.Last_Name, LookIn:=xlValues, LookAt:=xlPart)
Else
Set LastFind = Where.FindPrevious(LastFind)
End If
If LastFind Is Nothing Then ClearForm Else FillForm
End Sub
Private Sub Add_Click()
If LastFind Is Nothing Then
'Find first empty row in database
Set LastFind = Where.Cells(Where.Cells.Count).End(xlUp).Offset(1)
End If
'check for a last name
If (Trim(Last_Name) = "") Or (LastFind Is Nothing) Then
Last_Name.SetFocus
MsgBox "Please enter Item Info"
Exit Sub
End If
SaveForm
ClearForm
End Sub
Private Sub Close_Form_Click()
Unload Me
End Sub
Report abuse
Harassment is any behavior intended to disturb or upset a person or group of people. Threats include any threat of suicide, violence, or harm to another. Any content of an adult theme or inappropriate to a community web site. Any image, link, or discussion of nudity. Any behavior that is insulting, rude, vulgar, desecrating, or showing disrespect. Any behavior that appears to violate End user license agreements, including providing product keys or links to pirated software. Unsolicited bulk mail or bulk advertising. Any link to or advocacy of virus, spyware, malware, or phishing sites. Any other inappropriate content or behavior as defined by the Terms of Use or Code of Conduct. Any image, link, or discussion related to child pornography, child nudity, or other child abuse or exploitation.
Читайте также: