Страницы: 1
RSS
Как зациклить макрос?
 
Есть макрос поиска значения в таблице:  
Sub Finderer()  
Dim FD, firstAddress, adrs  
FD = InputBox("ВВЕДИТЕ ИНВЕНТАРНЫЙ НОМЕР ОС или отсканируйте его", "ПОИСК ОС")  
If FD = "" Then Exit Sub ' если пользователь нажал кнопку ОТМЕНА - отказ от поиска  
Dim c As Range: Set c = Range("A:A").Find(FD) ' поиск данных  
' если ничего не нашли - выход из макроса  
If c Is Nothing Then MsgBox "Искомые данные не найдены", vbExclamation: Exit Sub  
firstAddress = c.Address  
c.Select  
Do  
adrs = adrs & vbLf & c.Address(0, 0)  
Union(Selection, c).Select  
Set c = Range("A:A").FindNext©  
Loop While c.Address <> firstAddress  
Selection.Interior.ColorIndex = 4  
End Sub  
 
Скажите, пожалуйста, как сделать так - чтобы окно после поиска и выделения не закрывалось (просто выделалась найденная ячейка). Тесть чтобы окно с запросом данных выводилось и дальше до момента когда значение не будет найдено, тогда сообщение об ошибке. А если бы ещё сделать так, чтобы когда значение найдено - то в колонке «М» этой же строчки ставилась единичка (для последующей фильтрации).  
Заранее благодарен!!!
 
А выводить новое окно при нахождении искомого слова не подойдет?
 
Походу подойдет, но как это сделать, я не силен в макросах :(
 
а зачем вам вообще макросы?  
имхо, расширенного фильтра хватит.  
сразу задаете в диапазоне критериев перечень номеров - и запускаете фильтр.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В общем для проведения инвентаризации ОС. Из АБС выгружается список основных средств, на каждом ОС есть наклейка с номером и штрих кодом. С помочью сканера штрих доков нужно каждое ОС "пропикать", потом можно будет по фильтру посмотреть каких ОС нету...
 
Дилетантство, знаю. Но все же...  
После строки    
 
Dim FD, firstAddress, adrs  
вставьте строку    
Do Until FD=""  
А перед строкой End Sub добавьте строку Loop.  
Не тестировал, но вроде должно работать.
 
Не работает. По нажатию кнопки окно с запросом не появляется вообще.
 
Пробуйте  
 
Sub Finderer()  
Dim FD, firstAddress, adrs  
FD = " "  
Do Until FD = ""  
FD = InputBox("ÂÂÅÄÈÒÅ ÈÍÂÅÍÒÀÐÍÛÉ ÍÎÌÅÐ ÎÑ èëè îòñêàíèðóéòå åãî", "ÏÎÈÑÊ ÎÑ")  
If FD = "" Then Exit Sub ' åñëè ïîëüçîâàòåëü íàæàë êíîïêó ÎÒÌÅÍÀ - îòêàç îò ïîèñêà  
Dim c As Range: Set c = Range("A:A").Find(FD) ' ïîèñê äàííûõ  
' åñëè íè÷åãî íå íàøëè - âûõîä èç ìàêðîñà  
If c Is Nothing Then MsgBox "Èñêîìûå äàííûå íå íàéäåíû", vbExclamation: Exit Sub  
firstAddress = c.Address  
c.Select  
Do  
adrs = adrs & vbLf & c.Address(0, 0)  
Union(Selection, c).Select  
Set c = Range("A:A").FindNext©  
Loop While c.Address <> firstAddress  
Selection.Interior.ColorIndex = 4  
Loop  
End Sub
 
Забыл, сори  
 
Sub Finderer()  
Dim FD, firstAddress, adrs  
FD = " "  
Do Until FD = ""  
FD = InputBox("ВВЕДИТЕ ИНВЕНТАРНЫЙ НОМЕР ОС или отсканируйте его", "ПОИСК ОС")  
If FD = "" Then Exit Sub ' если пользователь нажал кнопку ОТМЕНА - отказ от поиска  
Dim c As Range: Set c = Range("A:A").Find(FD) ' поиск данных  
' если ничего не нашли - выход из макроса  
If c Is Nothing Then MsgBox "Искомые данные не найдены", vbExclamation: Exit Sub  
firstAddress = c.Address  
c.Select  
Do  
adrs = adrs & vbLf & c.Address(0, 0)  
Union(Selection, c).Select  
Set c = Range("A:A").FindNext©  
Loop While c.Address <> firstAddress  
Selection.Interior.ColorIndex = 4  
Loop  
End Sub
 
Грузите список своих пропиканных в массив->словарь, затем основные в массив->проверка по словарю, запись найденных/ненайденных в массив или коллекцию, выгрузка.  
Можно и покрасить на листе, но это долго.  
А так - секундное дело, и код проще, чем тут выше понаписанный.
 
Baklanoff  
 
Большое спасибо за помощь, но не работает :(  
Прикрепил образец файла...
 
Hugo  
 
Хотят, так сказать, в режиме реального времени, пикнули - сразу увидели результат. Если нету сразу - сразу кто то начинает искать, а инвентаризация идет дальше, так как объектов много а времени мало
 
Где файл?
 
Ну можно наоборот - сперва список основных средств в публичный словарь, который всё время будет в памяти.  
Затем по каждому пику (по событию изменения на листе) сразу по словарю получаем ответ - есть такое или нет.  
Без всяких поисков, мнгновенно.  
Хотя если список средств ~100000, то можно и на каждый пик создавать словарь, это заметно не будет, доля секунды.  
Хотя конечно зависит от машины...
 
А так?
 
Baklanoff Большое спасибо! Все работает.  
 
Ещё такой нескромный вопрос, а можно сделать так, чтобы кода значение в форме поиска не было найдено на листе, тогда после сообщение об отсутствии оно копировалось на другой лист, скажем "не найдено", и поиск производился дальше (форма не закрывалась)?  
 
Заранее благодарен за ответ!
Страницы: 1
Читают тему
Наверх