Страницы: 1
RSS
Макрос. Поиск номера строки по значению в столбце
 
Доброго времени суток! Прошу помощи! Помогите написать макрос:
Есть два файла: 1-й (Макросы ПЛАН.xlsm) "Документ", 2-й (ИСХОДЯЩАЯ КОРРЕСПОНДЕНЦИЯ.xls) "Таблица" регистрации всех документов.
Кое как слепил макрос: по нажатию кнопки в "Документе" открывается файл "Таблица", по столбцу "С" определяется верхняя свободная строчка, в неё вставляются данные регистрируемого документа, из "Таблицы" копируется номер и вставляется в "Документ", затем "Таблица" закрывается с сохранением.

Как проверить зарегистрирован ли уже документ с такими же данными (исполнителя опускаем), если да - "Сообщение", нет - "Другое сообщение"
Теорию вроде понимаю: по столбцу "B" определить номер строки с номером регистрируемого документа, а дальше по строке через "if" проверить совпадают ли остальные данные. Но это прописать в VBA не получается!!!

В примере есть несколько кодов про это, но под себя приспособить ни ка не получается!!! В VBA новичок. Свой писал методом научного тыка, РАБОТАЕТ.)))
Строку If IsEmpty(c.Offset(-1, 0)) Then Set c = c.End(xlUp) Else Set c = c.Offset(1, 0) вообще не понимаю как работает, главное что она даёт мне номер последней заполненной строки, причём на чистом листе (без форматирования) данный код выдаёт другой номер строки.

1. Помогите пожалуйста с проверкой!!! (Главный вопрос)
2. Может мой код можно отшлифовать?

ЗАРАНЕЕ БЛАГОДАРЕН!!!!!
 
Здравствуйте.
Несколько уточнений:
Номер документа - уникальный параметр? Иными словами, бывают ситуации, когда номер (то, что в столбце В реестра) может повторяться?
Если нет, то можно решить через метод Find:
Код
'определяем заполненный диапазон строк по столбцу В в таблице регистрации документов (номер последней заполненной строки
lngI = Cells(Rows.Count, 2).End(xlUp).Row
'заносим в переменную значение, которое надо проверить в листе регистрации
strS = "794" 'тут это значение для примера. А так его надо брать из формы регистрации
'проверяем поиском по диапазону - если нашли - значит, документ уже зарегистрирован
'используем ранее найденный номер последней заполненной строки для определения диапазона где искать
'используем переменную с значением из формы регистрации
'если найден такой номер в диапазоне - выводим сообщение
If Not Range("B2:B" & lngI).Find(strS) Is Nothing Then
MsgBox "Уже зарегистрировано"
End If
'если не найден - делаем что-то.
как-то так, на мой взгляд.
Кому решение нужно - тот пример и рисует.
 
Файлы удалены: превышен максимально допустимый размер. DjAlex77, ознакомьтесь уже с Правилами.
 
Пытливый Благодарю за ответ!!! Да, номер уникальный и повторяться не может.
Пойду проверю Ваш способ.
 
Пытливый, Проверил. Немного не то. Мне нужно взять и использовать дальше в коде номер строки, в которой находится уникальный номер. И метод Find: при strS = "794"
выдаёт положительный ответ как при 794, так и при 7941 да и при 794/1, нужен более точный поиск.
 
попробуйте добавить пробелы:
Код
strS = " 794 " 
 
Можно не через Find, а цикл запускать
Код
'для каждой строки со 2 по последнюю заполненную в столбце В
For lngI=2 to Cells(Rows.Count, 2).End(xlUp).Row 
'проверяем, если значение ячейки равно значению из переменной
'куда мы с формы занесли номер документа
If cells(lngI, 2)=strS Then
'то выдаем сообщение и выходим из цикла
Msgbox "уже зарегистрировано" 
Exit For
End If
Next lngI

Взять номер, где находится уникальный документ - т.е. взяли номер из формы, прошерстили список документов, нашли - нужен номер строки?
Если да, можно в MsgBox
Код
MsgBox "уже зарегистрировано в строке № " & lngI
Кому решение нужно - тот пример и рисует.
 
DjAlex77, вы не правильно введете реестр, у вас через год будут повторятся номера документов и вы ничего не сможете найти.
Если есть время я могу предложить свой вариант ближе к 17:00
 
Я бы это сделал так, остался только один вопрос, почему вы содержание хотели делать на отдельном листе?
Его же можно перенести на сам шаблон!
 
Цитата
Xapa6apga написал: вы не правильно введете реестр, у вас через год будут повторятся номера
В следующем году, в документе новый лист, номера снова с "1" и не нужны трёхэтажные номера.
Цитата
Xapa6apga написал: остался только один вопрос, почему вы содержание хотели делать на отдельном листе?
Да не хотел на отдельном листе, просто таким образом решение этого вопроса отложил на потом))
Вы эту проблему решили за меня. Я бы точно пару дней над ней бился.

Xapa6apga, Вам огромное спасибо!!! Логическая цепочка действий немного не та, что мне нужна, но полезного для себя нашёл много!
 
Цитата
Пытливый написал:Можно не через Find, а цикл запускать
Вот цикл я как раз и пробовал использовать, но не мог приспособить найденные примеры под себя. Сейчас проверю, отпишусь.
 
Пытливый, попробовал Ваш пример, странно но он не всегда работает, если в столбце есть пустые ячейки не всегда находит искомое значение, хотя в столбце оно есть.

НАШЁЛ вот такой вариант:
Код
Sub Номерстроки()
    ' Поиск номера строки со значением "1160" по столбцу "B"(сверху в низ)
    Doc№ = "1160"
    Dim nStr As Integer
    nStr = ActiveSheet.Range("B:B").Find(Doc№, , xlValues, xlByRows).Row
     MsgBox nStr
End Sub
Подскажите пожалуйста, можно ли его изменить, так чтобы искал снизу вверх?
 
Вариант:
Код
Sub Номерстроки()
Dim Rng As Range, Doc№
    ' Поиск номера строки со значением "1160" по столбцу "B"(снизу вверх)
    Doc№ = "1160"
    Set Rng = Columns(2).Find(what:=Doc№, LookIn:=xlValues, lookAt:=xlWhole, SearchDirection:=xlPrevious)
    If Not Rng Is Nothing Then MsgBox "Найдено в строке № " & Rng.Row
End Sub
 
DjAlex77, давайте я воплощу то что вы хотите пока есть интерес ))
 
Xapa6apga, а для этого нужно разрешение автора? )) Воплощайте! :-)
 
Юрий М, Скажите пожалуйста, Ваш вариант ищет (снизу вверх) во всём столбце или только в заполненных?
Какой вариант менее трудоёмкий (скорость поиска)?
Стоит ли заморачиваться о скорости поиска если в файле 3000-4000 строк?
 
Цитата
Xapa6apga написал: давайте я воплощу то что вы хотите пока есть интерес ))
Если интерес ещё не пропал, воплотите конечно же))
Свой вариант думаю сегодня доковыряю и выложу
 
Цитата
DjAlex77 написал: Ваш вариант ищет (снизу вверх) во всём столбце или только в заполненных?
Поиск тоже производится при помощи цикла, но мы просто его не видим ) Не думаю, что перебор осуществляется по ВСЕМУ столбцу. Но, если Вы боитесь, то ведь можно ограничить диапазон ))
Код
Set Rng = Range("B2:B10").Find...
Цитата
DjAlex77 написал: Стоит ли заморачиваться о скорости поиска если в файле 3000-4000 строк?
Думаю, что на таком количестве строк это будет довольно быстро.
 
Юрий М, Огромное Спасибо!!!
 
Юрий М, С прошедшими и наступающими Вас!
Подскажите пожалуйста, как изменить Ваш код, чтоб при отсутствии искомого значения в столбце тоже выдавал сообщение: ("Не найдено")  
 
DjAlex77, в сообщении #13 так и есть. Приведите текст Вашего макроса, в котором этого не происходит.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Именно сообщение №13 и скопировал.
Если искомое значение в столбце есть, выдаёт сообщение "Найдено в строке № _".
Если значения в столбце нет, ничего не делает. А надо выдать сообщение "Значение отсутствует"
 
Код
If Not Rng Is Nothing Then
MsgBox "Найдено в строке № " & Rng.Row
Else
MsgBox "Справку по If...Then...Else почитайте."
End If
 
k61, Спасибо!, затупил. Раньше не сталкивался с строчным написанием If...Then...Else
 
Подскажите Пожалуйста: как найти последнюю заполненную строку в столбце, если поиск производится в таблице к которой применены стили таблиц?
Вот код, он на обычном листе находит, а в таблице отформатированной стилем выдаёт номер последней строки в таблице.
Код
Sub Номер_Строки_A()
'  Поиск номера последней заполненной строки в столбце №1
NoStr = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox NoStr
End Sub
 
 
DjAlex77, добавьте проверку, если в по указанному адресу длина ячейки нулевая, то делаем:
Код
NoStr = Cells(NoStr, 1).End(xlUp).Row

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
DjAlex77, не нужно размещать все вопросы в одной теме только потому, что они связаны Вашей задачей.
Страницы: 1
Читают тему
Наверх