Помогаем и разъясняем взаимодействие с ПО Ворд и Эксель на WordExceler.ru
Поиск первой непустой ячейки vba excel
Елена_88
1
Поиск непустой ячейки в столбце
11.02.2009, 07:42. Показов 19696. Ответов 6
Приветствую !
Понимаю, задачка смешная, но мне, как новичку очень нужна помощь
Нужно написать функцию, которая будет возвращать значение первой непустой ячейки сверху.
т.е., например, стоим на А10, первая заполненная у нас А3, так как вытащить ее значение ?
Добавлено через 20 минут 39 секунд
Можно ли потом найти вторую заполненную ячейку ?
Sasha_Smirnov
5561 / 1367 / 150
Регистрация: 08.02.2009
Сообщений: 4,107
Записей в блоге: 30
12.02.2009, 01:31
2
Вот из этой простенькой «сабрутины» я и предлагаю сваять нужную Вам функцию. Отзовитесь, ау!
Sub FindAndCountEmptyCells(): Static k AsLong'если файл не пуст, то +1 при каждом вызовеIf k = 0 Then'а это так: 1) при первом вызове данной функции; 2) ещё не придумал
Range("a1").Activate 'проверка ячейки A1IfNot IsEmpty(ActiveCell) Then k = k + 1 'если в A1 не пусто, то счёт ведётся с неё
k = k + 1
Application.FindFormat.NumberFormat = "General"'аналог нажатия <Ctrl>+<F> (формат "Общий")'Активация k-й непустой ячейки.
Cells.Find(What:="*", SearchFormat:=True, SearchOrder:=xlByColumns).Activate
Else
Cells.FindNext(After:=ActiveCell).Activate 'при повторных вызовах - поиск следующей непустой
k = k + 1
If ActiveCell.Column & ":" & ActiveCell.Row = "1:1"Then k = 1 'это когда прошли всю таблицуEndIf
MsgBox "Это " & k & "-я непустая ячейка (" & ActiveCell.Column & ":" & ActiveCell.Row & ")."'здесь вместо этого мэссиджа Вы можете присваивать функции значение выделенной (активной) ячейкиEndSub
Вот тут действительно функция! Функциональность её та же.
Что делает основная программа (Sub), ясно из её названия.
Function FindAndCountNotEmptyCells()
'функция ищет на листе Excel k-ю (при k-м вызове) непустую ячейку (по столбцам)Static firstfoundRow AsLong, firstfoundCol AsLong'координаты первой найденной непустой ячейкиStatic k AsLong'если файл не пуст, то при каждом вызове возвращает № очередной непустой ячейкиIf k = 0 Then'а это так при первом вызове функции и при возврате по GoTo (когда всё обыскано)
Cells.Find(What:="*", SearchOrder:=xlByColumns).Activate 'Активация 1-й непустой ячейки.IfNot IsEmpty(Cells(1, 1)) Then'если в A1 не пусто, то при 1-м вызове считаем с неё
firstfoundRow = 1: firstfoundCol = 1 'Запомнили координаты 1-й ячейки: (1, 1) -
Cells.FindPrevious(After:=ActiveCell).Activate 'и вернулись в неё.Else
firstfoundRow = ActiveCell.Row: firstfoundCol = ActiveCell.Column
EndIfElse
Cells.FindNext(After:=ActiveCell).Activate 'поиск следующей ячейки при повторных вызовахEndIfIf (ActiveCell.Column = firstfoundCol) And (ActiveCell.Row = firstfoundRow) And (k > 1) Then
k = 0 'сброс k; функция обошла ("просканировала") все ячейки активного листа
FindAndCountNotEmptyCells = "I HAVE RETIRED)"ExitFunction'завершение работы функции: она всё обыскалаEndIf
FindAndCountNotEmptyCells = ActiveCell 'функция принимает значение очередной непустой ячейки
k = k + 1
MsgBox k & "-я непустая ячейка листа """ & ActiveSheet.Name & """ содержит: " & ActiveCell _
& vbCr & "(формат этого значения - """ & ActiveCell.NumberFormat & """)"EndFunctionSub I_seek_for_the_2_first_negative_cells_in_ActiveSheet()
Dim the1StNegativeCell, the2NdNegativeCell '1-е и 2-е отриц. числа (если есть) или что найдётсяDo
the1StNegativeCell = FindAndCountNotEmptyCells
If IsNumeric(the1StNegativeCell) And the1StNegativeCell < 0 ThenExitDoLoopUntil the1StNegativeCell = "I HAVE RETIRED)"'выходим из цикла, как только находим в таблице ПЕРВОЕ отрицательное число, или когда его там нетIf the1StNegativeCell <> "I HAVE RETIRED)"Then'то есть 1-е отриц. число всё же найдено''''''''' продолжаем вызывать функцию поиска ''''''''''''''Do
the2NdNegativeCell = FindAndCountNotEmptyCells
If IsNumeric(the2NdNegativeCell) And the2NdNegativeCell < 0 ThenExitDoLoopUntil the2NdNegativeCell = "I HAVE RETIRED)"'выходим из цикла, как только находим в таблице ВТОРОЕ отриц. число, или когда его там нетIf the2NdNegativeCell = "I HAVE RETIRED)"Then _
the2NdNegativeCell = "Второго отрицательного числа у вас в таблице (пока) нет."Else
MsgBox "На рабочем листе """ & ActiveSheet.Name & """ вашей таблицы отрицательных чисел нет."ExitSubEndIf
MsgBox "the1StNegativeCell = " & the1StNegativeCell 'сообщение, чему = 1-е отриц. число (в столбце)
MsgBox "the2NdNegativeCell = " & the2NdNegativeCell 'сообщение, чему = 2-е отриц. число (следующее)EndSub
Это более-менее работоспособный вариант.
Классики Си! Видите, сколько мороки на бэйсике? Где ж ваше веское слово… Ну хотя бы просто в поиске первой ячейки, с содержимым.
0
Супер-модератор
8782 / 2533 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
15.02.2009, 05:11
3
а если перед поиском сделать фильтр. так ты найдешь адрес первой непустой ячейки. потом фильтр можно снять
0
5561 / 1367 / 150
Регистрация: 08.02.2009
Сообщений: 4,107
Записей в блоге: 30
15.02.2009, 15:49
4
Я и без фильтра нашёл: по контрол-F в Excel.
И вообще, это Елена ищет. А форум что-то молчит, хоть и просмотров под полторы сотни.
0
5561 / 1367 / 150
Регистрация: 08.02.2009
Сообщений: 4,107
Записей в блоге: 30
18.02.2009, 20:23
5
Я и без фильтра нашёл: по контрол-F в Excel.
А форум всё молчит, хоть и просмотров за две сотни.
0
5561 / 1367 / 150
Регистрация: 08.02.2009
Сообщений: 4,107
Записей в блоге: 30
05.03.2009, 16:26
6
Вот черновой вариант. Повторяю, поскольку на прежних сломалась кнопка запуска.
0
5561 / 1367 / 150
Регистрация: 08.02.2009
Сообщений: 4,107
Записей в блоге: 30
05.03.2009, 16:51
7
Или, скорее, так: назначенная макросу кнопка, при архивировании, теряет связь с макросом.
Поэтому-то и прошу — поискать непустые ячейки на Си, ассемблере и пр.
Не будешь же (в жизни) каждый раз объяснять пользователю, мол, жми альт-F8, щёлкай по имени, жми кнопку Выполнить, — нудно!
Добрый день. Второй день не могу найти подходящую тему на форуме. Прошу помощи. Задача — вставить в действующий макрос (ВПР, так назову) еще один макрос, который ищет на Листе БМП в 3-й строке первую не пустую ячейку. Смысл такой. Поступил заказ от клиента, кладу его в Лист заказ БМП. ВПРю. Поступает следующий заказ. «ИЩУ ПУСТУЮ ЯЧЕЙКУ в 3-й строке на Листе БМП и вновь вставляю значение заказа. И если не сложно, то бонусом, подтянуть наименование клиента. Заранее БЛАГОДАРЮ.
К сообщению приложен файл:
1282540.xlsm
(54.2 Kb)
Ответить
китин
Дата: Пятница, 24.06.2016, 14:51 |
Сообщение № 2
Группа: Модераторы
Ранг: Экселист
Сообщений: 6973
Репутация: 1063 ±
Замечаний:
0% ±
Excel 2007;2010;2016
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
Ответить
Re:Я
Дата: Пятница, 24.06.2016, 15:23 |
Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний:
0% ±
Excel 2010
китин: Посмотрел…..и не понял. Мне наверняка вот это подойдет. [vba]
Код
lLastRow = Cells(Rows.Count,2).End(xlUp).Row
[/vba] Но как ее интегрировать в «мой» макрос? Что бы нашел первую пустую и начал ВПРить?
Ответить
китин
Дата: Пятница, 24.06.2016, 15:45 |
Сообщение № 4
Группа: Модераторы
Ранг: Экселист
Сообщений: 6973
Репутация: 1063 ±
Замечаний:
0% ±
Excel 2007;2010;2016
а это ждите макрописцев
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
Ответить
Udik
Дата: Пятница, 24.06.2016, 15:59 |
Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний:
0% ±
Excel 2016 х 64
Без привязки к макросу [vba]
Код
Public Sub test() Dim rng1 As Range
With ActiveSheet Set rng1 = .Range(«A3:O3»).Find(«») ‘замените на свой диапазон ‘Debug.Print rng1.Address End With End Sub
[/vba]
К сообщению приложен файл:
0t.xlsm
(19.1 Kb)
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com
Ответить
_Boroda_
Дата: Пятница, 24.06.2016, 18:47 |
Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16618
Репутация: 6465 ±
Замечаний:
0% ±
2003; 2007; 2010; 2013 RUS
Мне наверняка вот это подойдет. lLastRow = Cells(Rows.Count,2).End(xlUp).Row
Не, это ищет последнюю заполненную СТРОКУ в столбце 2, а Вам нужно последний заполненный СТОЛБЕЦ в строке 3 (кстати, вопрос — Вам нужно первую пустую или последнюю? — это разные вещи) Вот так можно найти последнюю [vba]
Дата: Понедельник, 27.06.2016, 10:43 |
Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний:
0% ±
Excel 2010
_Boroda_ — Вы как всегда меня выручаете. Благодарю. Теперь по макросу Вашему. Мне надо найти именно ПЕРВУЮ. Вопрос почему ищем с ячейки В3? В третье строке могут быть пустые ячейки в поле сводной таблицы. Мне туду ни чего не надо вставлять. А вот строка два всегда будет в раках сводной таблицы заполнена и за пределами таблицы мне и надо найти ячейку первую пустую и вставить туда значение макровса ВПР. М.б. мне заново положить файл с примером? Хотя сейчас его скачал и он там есть по номером 7. На всякий случай выложу сам макрос. И суть всего действия такова. Найти первую пустую ячейку в строке 2 и следом запустить макрос ВПР.( так его назвал) И если возможно, бонусом, что бы не создавать новую тему, привязать НАЗВАНИЕ клиента. В данном примере: Нашел первую пустую ячейку К2. Вставил название клиента из ЛИСТА ЗАКАЗ БМП С4 (постоянная, всегда там будет название клиента), и вставить значение из ВПР. Вот. Если это конечно не сильно нарушает ПРАВИЛА. Сам макрос ВПР, к которому надо все привязать. [vba]
Код
Sub Макрос7() Dim a, b, c, d, e, iLastrow As Long, i As Long, ii As Long
‘1. данные в два массива With Лист2 ‘используется кодовое имя iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row a = Range(.[c3], .Range(«C» & iLastrow)).Value End With
With Лист3 ‘используется кодовое имя iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row b = Range(.[k19], .Range(«C» & iLastrow)).Value End With
‘2.пустой массив для результата ReDim c(1 To UBound(a), 1 To 9)
With CreateObject(«Scripting.Dictionary»)
‘3.в словарь уникальные и номер строки из массива For i = 1 To UBound(b) .Item(b(i, 1)) = i Next
‘4.по словарю из массива b в массив c For i = 1 To UBound(a) If .exists(a(i, 1)) Then c(i, 1) = b(.Item(a(i, 1)), 9) End If Next End With
‘5. выгрузка всего массива With Лист2 ‘используется кодовое имя .[K3].Resize(UBound(c), 1) = c .Activate End With End Sub
[/vba]
Ответить
Re:Я
Дата: Понедельник, 27.06.2016, 11:07 |
Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний:
0% ±
Excel 2010
ай-яй…. сам напортачил. Сам же просид 3-ю. теперь задаю вопрос почему 3-ю… Прошу прощения. Исправляюсь. во 2-й строке.
Ответить
Re:Я
Дата: Вторник, 05.07.2016, 09:50 |
Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний:
0% ±
Excel 2010
С Вашего позволения ап… Прошу помощи.
Ответить
китин
Дата: Вторник, 05.07.2016, 10:03 |
Сообщение № 10
Группа: Модераторы
Ранг: Экселист
Сообщений: 6973
Репутация: 1063 ±
Замечаний:
0% ±
Excel 2007;2010;2016
Рискну ответить.в качестве предположения,может неправильно. А что если попробовать исправить вот тут [vba]
Код
iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row a = Range(.[c3], .Range(«C» & iLastrow)).Value
[/vba] 3 на 2 (обе тройки)
Не судите очень строго:я пытаюсь научиться ЯД 41001877306852
Сообщение отредактировал китин — Вторник, 05.07.2016, 10:03
Ответить
Re:Я
Дата: Вторник, 05.07.2016, 10:20 |
Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний:
0% ±
Excel 2010
китин — благодарю за ответ. саму малость понимаю в макросах. 3 на 2 это не проблема для меня. Проблема это как внедрить поиск первой пустой строки в мой макрос? _Boroda_ — написал, что не видит в примере макроса. Это для меня не большое удивление. Почему его не видно в примере. Я его, макрос. выложил отдельно. Сама процедура. 1. Поиск первой пустой строки в «2» 2. ВПРить и вставлять со К3 значения . (это все работает как положено) Так же с помощью _Boroda_ доделал его. Тема в другой ветке была. [moder]Тема продублирована во ФРИЛАНСе. Эту закрываю[/moder]
Сообщение отредактировал Pelena — Вторник, 05.07.2016, 14:02