Vba excel как определить заполненные ячейки

Перейти к содержимому

Макрос проверки заполнения ячеек.

Периодически при создании различных макросов в VBA Excel возникает потребность  в том, чтобы алгоритм макроса самостоятельно определял, пуста ли ячейка или заполнена данными.

Далее приведем несколько простых макросов  для определения заполнения ячейки данными и разберем принцип их работы. Фрагменты этих макросов вы можете добывать в свой код для реализации проверки заполнения ячеек.

Рассмотрим несколько вариантов VBA алгоритмов:Макро VBA Excel

Алгоритм для строго определенной ячейки с применением её адреса.

Пример для ячейки с адресом B6:

  •     Private Sub CommandButton1_Click() ‘наименование алгоритма
  •      If IsEmpty(Range(«B6»)) = True Then  ‘условие, если ячейка пустая, то
  •      MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
  •      Else  ‘в противном случае
  •      MsgBox («Данные внесены в ячейку»)  ‘вывод сообщения, что в ячейке есть данные
  •      End If  ‘конец блока «если»
  •     End Sub ‘конец алгоритма

Алгоритм для выделенной (активной)  ячейки :

    • Private Sub CommandButton1_Click() ‘наименование алгоритма    
    • If IsEmpty(ActiveCell) = True Then ‘условие, если активная ячейка (ActiveCell)  пустая, то
    •      MsgBox («В ячейке нет данных»)  ‘вывод сообщения, что в ячейке нет данных
    •      Else  ‘в противном случае
    •      MsgBox («Данные внесены в ячейку»)  ‘вывод сообщения, что в ячейке есть данные
    •      End If  ‘конец блока «если»
    •     End Sub ‘конец алгоритма

    Еще один способ определения в примере для активной ячейки, но можно использовать  и для конкретной ячейки с адресом.

      • Private Sub CommandButton1_Click() ‘наименование алгоритма    
      • If Len(ActiveCell) Then ‘если активная ячейка заполнена данными (имеет объем информации)
      • MsgBox («Данные внесены в ячейку»)  ‘вывод сообщения, что в ячейке есть данные
      • Else  ‘в противном случае
      • MsgBox («Ячейка пустая») ‘вывод сообщения, что в ячейке нет данных
      • End If  ‘конец блока «если»
      •  End Sub  ‘конец алгоритма

      Содержание

      1. Макрос определяющий пустая ли ячейка или заполненная в VBA Excel
      2. Алгоритм для строго определенной ячейки с применением её адреса.
      3. Алгоритм для выделенной (активной) ячейки :
      4. Еще один способ определения в примере для активной ячейки, но можно использовать и для конкретной ячейки с адресом.
      5. Добавить комментарий Отменить ответ
      6. Определяем пустая или заполненная ячейка
      7. Добавить комментарий Отменить ответ
      8. Рубрики
      9. Свежие записи
      10. Свежие комментарии
      11. Условия обработки персональных данных
      12. Макрос поиска видимых строк и заполненных ячеек на листе Excel
      13. Комментарии
      14. Как определить последнюю ячейку на листе через VBA?

      Макрос определяющий пустая ли ячейка или заполненная в VBA Excel

      Периодически при создании различных макросов в VBA Excel возникает потребность в том, чтобы алгоритм макроса самостоятельно определял, пуста ли ячейка или заполнена данными.

      Далее приведем несколько простых макросов для определения заполнения ячейки данными и разберем принцип их работы. Фрагменты этих макросов вы можете добывать в свой код для реализации проверки заполнения ячеек.

      Рассмотрим несколько вариантов VBA алгоритмов:

      Алгоритм для строго определенной ячейки с применением её адреса.

      Пример для ячейки с адресом B6:

      • Private Sub CommandButton1_Click() ‘наименование алгоритма
      • If IsEmpty(Range(«B6»)) = True Then ‘условие, если ячейка пустая, то
      • MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
      • Else ‘в противном случае
      • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
      • End If ‘конец блока «если»
      • End Sub ‘конец алгоритма

      Алгоритм для выделенной (активной) ячейки :

      • Private Sub CommandButton1_Click() ‘наименование алгоритма
      • If IsEmpty(ActiveCell) = True Then ‘условие, если активная ячейка (ActiveCell) пустая, то
      • MsgBox («В ячейке нет данных») ‘вывод сообщения, что в ячейке нет данных
      • Else ‘в противном случае
      • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
      • End If ‘конец блока «если»
      • End Sub ‘конец алгоритма

      Еще один способ определения в примере для активной ячейки, но можно использовать и для конкретной ячейки с адресом.

      • Private Sub CommandButton1_Click() ‘наименование алгоритма
      • If Len(ActiveCell) Then ‘если активная ячейка заполнена данными (имеет объем информации)
      • MsgBox («Данные внесены в ячейку») ‘вывод сообщения, что в ячейке есть данные
      • Else ‘в противном случае
      • MsgBox («Ячейка пустая») ‘вывод сообщения, что в ячейке нет данных
      • End If ‘конец блока «если»
      • End Sub ‘конец алгоритма

      Добавить комментарий Отменить ответ

      Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

      Источник

      Определяем пустая или заполненная ячейка

      Иногда в коде макроса нужно сделать проверку на заполненность ячейки и потом выполнить определенные действия. Но как определить, пустая ячейка или нет?

      в PHP например, используют такие условия:

      в VBA есть что-то похожее

      Другой вариант, это проверка длины содержимого ячейки

      Добавить комментарий Отменить ответ

      Рубрики

      Свежие записи

      • Как найти обратные ссылки на сайт через google 07.03.2023
      • Настройки плагина WooCommerce, в произвольной теме через add_theme_support 05.11.2022
      • ERROR 2013 (HY000) at line 1612: Lost connection to MySQL server during query 02.11.2022
      • Использование fopen с «php://memory» 29.09.2022
      • Изменение содержимого бинарного файла 20.08.2022
      • Программное создание атрибута и его значения в woocommerce 15.08.2022
      • Автоматически измененяем автора при сохранении поста 22.07.2022
      • Вывод логов в Android Studio 25.05.2022
      • Как получить из ресурса R.string строку 16.05.2022
      • Как получить ID элемента из View 02.05.2022
      • Событие onClick по кнопке 21.04.2022
      • Плавный переход к следующей Activity 21.04.2022
      • Установка, активация и настройка модуля для «Панель состояния» на OpenCart 09.04.2022
      • Как вывести информацию в «Панель состояния» на OpenCart 09.04.2022
      • Ошибка Either GD PHP extension 08.03.2022

      Свежие комментарии

      • Vlad к записи Как вывести информацию в «Панель состояния» на OpenCart
      • Vlad к записи Как вывести информацию в «Панель состояния» на OpenCart
      • Vlad к записи Как вывести информацию в «Панель состояния» на OpenCart
      • admin к записи Как вывести информацию в «Панель состояния» на OpenCart
      • Сергей к записи Редактирование табов на странице карточки товара

      Условия обработки персональных данных

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

      В случае Вашего не согласия с этими условиями — просим Вас покинуть данный сайт. Если Вы продолжаете находиться и использовать сайт — Вы автоматически выражаете свое согласие с условиями обработки персональных данных пользователей сайта

      Источник

      Макрос поиска видимых строк и заполненных ячеек на листе Excel

      Если ваш макрос выдаёт ошибку при использовании метода SpecialCells — возможно, причина в установленной защите листа Excel.

      Почему разработчики Microsoft отключили работу этой функции на защищённых листах — не совсем понятно, но мы попробуем обойти это ограничение.

      Итак, нам надо получить все заполненные ячейки из некого диапазона листа Excel.

      Обычно для этого используется вызов метода SpecialCells — например,

      Но на защищенном листе такой код выдаст ошибку 1004.

      Чтобы избавиться от ошибки, мы используем функцию SpecialCells_TypeConstants — замену встроенному методу SpecialCells(xlCellTypeConstants)

      Теперь наш код (работающий в т.ч. и на защищённых листах) будет выглядеть так:

      Аналогичная функция, если нам надо получить диапазон видимых (нескрытых) строк на листе Excel:

      (замена для SpecialCells(xlCellTypeVisible))

      Комментарии

      Игорь, добрый день.
      Код безусловно полезный, но перебор ячеек на листе с парой-тройкой сотен тысяч строк и несколько десятков столбцов будет занимать много времени. Возможно стоит ограничить перебор, разбив его хотя бы на 2 части: найти вначале крайний справа столбец и последнюю строчку. После чего обрабатывать выбранный диапазон.
      Что касается определения столбца применяя UsedRange — столкнулся с проблемой: если на «свежем» листе выполнить х=Sheets(SheetsName).UsedRange.Column + Sheets(SheetsName).UsedRange.Columns.Count , то количество столбцов отобразится корректно, если удалить несколько столбцов (и не переоткрывать с сохранением книгу), то диапазон берется как до удаления столбцов. Применение SpecialCells у меня не всегда дает корректный результат (ячейки разнородные по наполнению и когда попадается с ошибкой (битая ссылка), Excel воспринимает её буквально :)). По этой причине предлагаю вариант такой — брать через UsedRange и потом «минусовать» пустые столбцы в обратном порядке. Аналогично со строками.

      А какое отношение ваш вопрос имеет к теме статьи?
      Можно формулу написать, выводящую пропущенное число, можно то же самое сделать макросом, — вариантов много.

      у меня вопрос как сделать так чтоб Excel мог автоматический находить на листе ошибки, к примеру если на листе идет последовательность чисел 1,2,3,5,6,7-получается что цифры 4 нет в списке, и как сделать что Excel мог автоматический показывать что такого числа нет тоесть указывать на эту ошибку?

      Источник

      Как определить последнюю ячейку на листе через VBA?

      Очень часто при внесении данных на лист Excel возникает вопрос определения последней заполненной или первой пустой ячейки. Чтобы впоследствии с этой первой пустой ячейки начать заносить данные. В этой теме я опишу несколько способов определения последней заполненной ячейки.

      В качестве переменной, которой мы будем присваивать номер последней заполненной строки, у нас во всех примерах будет lLastRow . Объявлять мы её будем как Long . Для экономии памяти можно было бы использовать и тип Integer , но т.к. строк на листе может быть больше 32767(это максимальное допустимое значение переменных типа Integer ) нам понадобиться именно Long , во избежание ошибки. Подробнее про типы переменных можно прочитать в статье Что такое переменная и как правильно её объявить

      Одинаковые переменные для всех примеров
      Во всех примерах ниже мы будем запоминать номер последней строки или столбца в одни и те же переменные:

      Dim lLastRow As Long ‘а для lLastCol можно было бы применить и тип Integer, ‘т.к. столбцов в Excel пока меньше 32767, но для однообразности назначим тоже Long Dim lLastCol As Long

      Способ 1:
      Определение последней заполненной строки через свойство End

      lLastRow = Cells(Rows.Count,1).End(xlUp).Row ‘или lLastRow = Cells(Rows.Count, «A»).End(xlUp).Row

      1 или «A» — это номер или имя столбца, последнюю заполненную ячейку в котором мы определяем. По сути обе приведенные строки дадут абсолютно одинаковый результат. Просто иногда удобнее указать номер столбца, а иногда его имя. Поэтому использовать можно любой из приведенных вариантов, в зависимости от ситуации.
      Определение последнего столбца через свойство End

      lLastCol = Cells(1, Columns.Count).End(xlToLeft).Column

      1 — это номер строки, последнюю заполненную ячейку в которой мы определяем.

      Данный метод определения последней строки/столбца самый распространенный. Используя его мы можем определить последнюю ячейку только в одном конкретном столбце(или строке). В большинстве случаев этого более чем достаточно.

      Метод основан именно на принципе работы свойства End. На примере поиска последней строки опишу принцип так, как бы мы это делали руками через выделение ячеек на листе:

      • выделили самую последнюю ячейку столбца А на листе(для Excel 2007 и выше это А1048576 , а для Excel 2003 — А65536 )
      • и выполнили переход вверх комбинацией клавиш Ctrl + стрелка вверх . Данная комбинация заставляет Excel двигаться вверх(если точнее, то в направлении стрелки, нажатой вместе с Ctrl ) до тех пор, пока не встретиться первая ячейка с формулой или значением. А в случае, если сочетание было вызвано из уже заполненных ячеек — то до первой пустой. И как только Excel доходит до этой ячейки — он её выделяет
      • А через свойство .Row мы просто получаем номер строки этой выделенной ячейки
      • даже если в ячейке нет видимого значения, но есть формула — End посчитает ячейку не пустой. С одной стороны вполне справедливо. Но иногда нам надо определить именно «визуально» заполненные ячейки. Поиск ячеек при подобных условиях будет описан ниже(Способ 4: Определение последней ячейки через метод Find)
      • если на листе заполнены все строки в просматриваемом столбце(или будут заполнены несколько последних ячеек столбца или даже только одна последняя) — то результат может быть неверный(ну или не совсем такой, какой ожидали)
      • Данный способ игнорирует строки, скрытые фильтром, группировкой или командой Скрыть (Hide) . Т.е. если последняя строка таблицы будет скрыта, то данный метод вернет номер последней видимой заполненной строки, а не последней реально заполненной.

      Ну а если надо получить первую пустую ячейку на листе(а не первую заполненную) — придется вспомнить математику. Т.к. последнюю заполненную мы определили, то первая пустая — следующая за ней. Т.е. к результату необходимо прибавить 1. Это хоть и очевидно, но на всякий случай все же лучше об этом напомнить.

      Способ 2:
      Определение последней заполненной строки через SpecialCells

      Определение последнего столбца через SpecialCells

      Данный метод не требует указания номера столбца и возвращает последнюю ячейку(Row — строку, Column — столбец).
      Если хотите получить номер первой пустой строки или столбца на листе — к результату необходимо прибавить 1.
      Нюансы:

        Используя данный способ следует помнить, что не всегда можно получить реальную последнюю заполненную ячейку, т.е. именно ячейку со значением. Метод SpecialCells определяет самую «дальнюю» ячейку на листе, используя при этом механизм «запоминания» тех ячеек, в которых мы работали в данном листе. Т.е. если мы занесем в ячейку AZ90345 значение и сразу удалим его — lLastRow, полученная через SpecialCells будет равна значению именно этой ячейки, из которой вы только что удалили значения(т.е. 90345). Другими словами требует обязательного обновления данных, а этого можно добиться только сохранив файла, а временами даже только закрыв файл и открыв его снова. Так же, если какая-либо ячейка содержит форматирование(например, заливку), но не содержит никаких значений, то метод SpecialCells посчитает её используемой и будет учитывать как заполненную.
        Этот недостаток можно попробовать обойти, вызвав перед определением последней ячейки вот такую строку кода:

      With ActiveSheet.UsedRange: End With

      Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.
      Выглядеть в единой процедуре это будет так:

      Sub GetLastCell() Dim lLastRow As Long ‘переопределяем рабочий диапазон листа With ActiveSheet.UsedRange: End With ‘ищем последнюю заполненную ячейку на листе lLastRow = Cells.SpecialCells(xlLastCell).Row End Sub

      Сам же я этот метод обычно использую для определения последней ячейки в только что созданном файле, в котором только добавляю строки кодом и в котором не может быть описанных выше нюансов.

      Способ 3:
      Определение последней строки через UsedRange

      lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count — 1

      Определение последнего столбца через UsedRange

      lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count — 1

      • ActiveSheet.UsedRange.Row — этой строкой мы определяем первую ячейку, с которой начинаются данные на листе. Важно понимать для чего это — если у вас первые строк 5 не заполнены ничем(т.е. самые первые данные заносились начиная с 6-ой строки листа), то ActiveSheet.UsedRange.Row вернет именно 6(т.е. номер первой строки с данными). Если же все строки заполнены — то вернет 1.
      • ActiveSheet.UsedRange.Rows.Count — определяем кол-во строк, входящих в весь диапазон данных на листе. При этом неважно, есть ли данные в ячейках или нет — достаточно было поработать в этих ячейках и удалить значения или просто изменить цвет заливки.
        В итоге получается: первая строка данных + кол-во строк с данными — 1 . Зачем вычитать единицу? Попробуем посчитать вместе: первая строка: 6. Всего строк: 3. 6 + 3 = 9. Вроде все верно. А теперь выделим на листе три ячейки, начиная с 6-ой. Выделение завершилось на 8-ой строке. Потому что в 6-ой строке уже есть данные. Поэтому и надо вычесть 1, чтобы учесть этот момент. Думаю, не надо пояснять, что если надо получить первую пустую ячейку — можно 1 не вычитать 🙂
      • То же самое и с ActiveSheet.UsedRange.Column , только уже не для строк, а для столбцов.
      • Обладает некоторыми недостатками предыдущего метода. Определяет самую «дальнюю» ячейку на листе, используя при этом механизм «запоминания» тех ячеек, в которых мы работали в данном листе. Следовательно попробовать обойти этот момент можно точно так же: перед определением последней строки/столбца записать строку: With ActiveSheet.UsedRange: End With
        Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.
      • даже если в ячейке нет видимого значения, но есть формула — UsedRange посчитает ячейку не пустой

      Однако метод через UsedRange.Row работает прекрасно и при установленной на лист защите и внутри UDF, что делает его более предпочтительным, чем метод через SpecialCells при равных условиях.

      Способ 4:
      Определение последней строки и столбца, а так же адрес ячейки методом Find

      Sub GetLastCell_Find() Dim rF As Range Dim lLastRow As Long, lLastCol As Long ‘ищем последнюю ячейку на листе, в которой хранится хоть какое-то значение Set rF = ActiveSheet.UsedRange.Find(What:=»*», LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, MatchByte:=False) If Not rF Is Nothing Then lLastRow = rF.Row ‘последняя заполненная строка lLastCol = rF.Column ‘последний заполненный столбец MsgBox rF.Address ‘показываем сообщение с адресом последней ячейки Else ‘если ничего не нашлось — значит лист пустой ‘и можно назначить в качестве последних первую строку и столбец lLastRow = 1 lLastCol = 1 MsgBox «A1» ‘показываем сообщение с адресом ячейки А1 End If End Sub

      Этот метод, пожалуй, самый оптимальный в случае, если надо определить последнюю строку/столбец на листе без учета форматов и формул — только по отображаемому значению в ячейке. Например, если на листе большая таблица и последние строки заполнены формулами, возвращающими при определенных условиях пустую ячейку( =ЕСЛИ( A1 >0;1;»») ), предыдущие варианты вернут строку/столбец ячейки с последней ячейкой, в которой формула. В то время как данный метод вернет адрес ячейки только в случае, если в ячейке реально отображается какое-то значение. Такой подход часто используется для того, чтобы определить границы данных для последующего анализа заполненных данных, чтобы не захватывать пустые ячейки с формулами и не тратить время на их проверку.
      Здесь следует обратить внимание на параметры метода Find. В данном случае мы специально указываем искать по значениям, а не по формулам:
      Set rF = ActiveSheet.UsedRange.Find(What:=»*», LookIn:=xlValues , LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, MatchByte:=False)
      Нюансы:

      • Метод Find , вызванный с листа или другим кодом, имеет свойство запоминать все параметры последнего поиска, а если поиск еще не вызывался — то применяются параметры по умолчанию. А по умолчанию поиск идет всегда по формулам. Поэтому я настоятельно рекомендую указывать принудительно все необходимые параметры, как в примере.
      • Метод Find не будет учитывать в просмотре скрытые строки и столбцы. Это следует учитывать при его применении.

      Пара небольших практических кодов
      Коды ниже могут помочь понять, как использовать приведенные выше строки кода по поиску последней ячейки/строки:

      Sub GetLastCell() Dim lLastRow As Long Dim lLastCol As Long ‘определили последнюю заполненную ячейку с учетом формул в столбце А lLastRow = Cells(Rows.Count, 1).End(xlUp).Row MsgBox «Заполненные ячейки в столбце А: » & Range(«A1:A» & lLastRow).Address ‘определили последний заполненный столбец на листе(с учетом формул и форматирования) lLastCol = Cells.SpecialCells(xlLastCell).Column MsgBox «Заполненные ячейки в первой строке: » & Range(Cells(1, 1), Cells(1, lLastCol)).Address ‘выводим сообщение с адресом последней ячейки на листе(с учетом формул и форматирования) MsgBox «Адрес последней ячейки диапазона на листе: » & Cells.SpecialCells(xlLastCell).Address End Sub

      Выделяем диапазон ячеек в столбцах с А по С, определяя последнюю ячейку по столбцу A этого же листа:

      Sub SelectToLastCell() Range(«A1:C» & Cells(Rows.Count, 1).End(xlUp).Row).Select End Sub

      Копируем ячейку B1 в первую пустую ячейку столбца A этого же листа:

      Sub CopyToFstEmptyCell() Dim lLastRow As Long lLastRow = Cells(Rows.Count, 1).End(xlUp).Row ‘определили последнюю заполненную ячейку Range(«B1»).Copy Cells(lLastRow+1, 1) ‘скопировали В1 и вставили в следующую после определенной ячейки End Sub

      А код ниже делает тоже самое, но одной строкой — применяется Offset и используется тот факт, что изначально методом End мы получаем именно ячейку, а не номер строки(номер строки мы получаем позже через свойство .Row):

      Sub CopyToFstEmptyCell() Range(«B1»).Copy Destination:=Cells(Rows.Count, 1).End(xlUp).Offset(1) End Sub

      Range(«B1»).Copy — копирует ячейку В1 . Если для аргумента Destination указать другую ячейку, то в неё будет вставлена скопированная ячейка. Мы передаем в этот аргумент определенную методом End ячейку
      Cells(Rows.Count, 1).End(xlUp) — возвращает последнюю заполненную ячейку в столбце А (не строку, а именно ячейку)
      Offset(1) — смещает полученную ячейку на строку вниз
      Используем инструмент автозаполнение(протягивание) столбца В , начиная с ячейки B2 и определяя последнюю ячейку для заполнения на основании столбца А

      Sub AutoFill_B() Dim lLastRow As Long lLastRow = Cells(Rows.Count, 1).End(xlUp).Row Range(«B2»).AutoFill Destination:=Range(«B2:B» & lLastRow) End Sub

      На самом деле практических кодов может быть куда больше, т.к. определение последней заполненной или первой пустой ячейки является чуть ли не самой распространенной задачей при написании кодов в Excel.

      Статья помогла? Поделись ссылкой с друзьями!

      Источник

      Хитрости »

      1 Май 2011              403760 просмотров


      Очень часто при внесении данных на лист Excel возникает вопрос определения последней заполненной или первой пустой ячейки. Чтобы впоследствии с этой первой пустой ячейки начать заносить данные. В этой теме я опишу несколько способов определения последней заполненной ячейки.

      В качестве переменной, которой мы будем присваивать номер последней заполненной строки, у нас во всех примерах будет lLastRow. Объявлять мы её будем как Long. Для экономии памяти можно было бы использовать и тип Integer, но т.к. строк на листе может быть больше 32767(это максимальное допустимое значение переменных типа Integer) нам понадобиться именно Long, во избежание ошибки. Подробнее про типы переменных можно прочитать в статье Что такое переменная и как правильно её объявить

      Одинаковые переменные для всех примеров
      Во всех примерах ниже мы будем запоминать номер последней строки или столбца в одни и те же переменные:

          Dim lLastRow As Long
          'а для lLastCol можно было бы применить и тип Integer,
          'т.к. столбцов в Excel пока меньше 32767, но для однообразности назначим тоже Long
          Dim lLastCol As Long
    • Определение последней ячейки через свойство End
    • Определение последней ячейки через SpecialCells
    • Определение последней ячейки через UsedRange
    • Определение последней ячейки через метод Find
    • Несколько практических кодов

    • Способ 1:

      Определение

      последней заполненной строки

      через свойство End

          lLastRow = Cells(Rows.Count,1).End(xlUp).Row
          'или
          lLastRow = Cells(Rows.Count, "A").End(xlUp).Row

      1 или «A» — это номер или имя столбца, последнюю заполненную ячейку в котором мы определяем. По сути обе приведенные строки дадут абсолютно одинаковый результат. Просто иногда удобнее указать номер столбца, а иногда его имя. Поэтому использовать можно любой из приведенных вариантов, в зависимости от ситуации.
      Определение последнего столбца через свойство End

      lLastCol = Cells(1, Columns.Count).End(xlToLeft).Column

      1 — это номер строки, последнюю заполненную ячейку в которой мы определяем.

      Данный метод определения последней строки/столбца самый распространенный. Используя его мы можем определить последнюю ячейку только в одном конкретном столбце(или строке). В большинстве случаев этого более чем достаточно.

      Метод основан именно на принципе работы свойства End. На примере поиска последней строки опишу принцип так, как бы мы это делали руками через выделение ячеек на листе:

      • выделили самую последнюю ячейку столбца А на листе(для Excel 2007 и выше это А1048576, а для Excel 2003 — А65536)
      • и выполнили переход вверх комбинацией клавиш Ctrl+стрелка вверх. Данная комбинация заставляет Excel двигаться вверх(если точнее, то в направлении стрелки, нажатой вместе с Ctrl) до тех пор, пока не встретиться первая ячейка с формулой или значением. А в случае, если сочетание было вызвано из уже заполненных ячеек — то до первой пустой. И как только Excel доходит до этой ячейки — он её выделяет
      • А через свойство .Row мы просто получаем номер строки этой выделенной ячейки

      Нюансы:

      • даже если в ячейке нет видимого значения, но есть формула — End посчитает ячейку не пустой. С одной стороны вполне справедливо. Но иногда нам надо определить именно «визуально» заполненные ячейки. Поиск ячеек при подобных условиях будет описан ниже(Способ 4: Определение последней ячейки через метод Find)
      • если на листе заполнены все строки в просматриваемом столбце(или будут заполнены несколько последних ячеек столбца или даже только одна последняя) — то результат может быть неверный(ну или не совсем такой, какой ожидали)
      • Данный способ игнорирует строки, скрытые фильтром, группировкой или командой Скрыть (Hide). Т.е. если последняя строка таблицы будет скрыта, то данный метод вернет номер последней видимой заполненной строки, а не последней реально заполненной.

      Ну а если надо получить первую пустую ячейку на листе(а не первую заполненную) — придется вспомнить математику. Т.к. последнюю заполненную мы определили, то первая пустая — следующая за ней. Т.е. к результату необходимо прибавить 1. Это хоть и очевидно, но на всякий случай все же лучше об этом напомнить.


      Способ 2:

      Определение

      последней заполненной строки

      через SpecialCells

          lLastRow = Cells.SpecialCells(xlLastCell).Row

      Определение последнего столбца через SpecialCells

          lLastCol = Cells.SpecialCells(xlLastCell).Column

      Данный метод не требует указания номера столбца и возвращает последнюю ячейку(Row — строку, Column — столбец).
      Если хотите получить номер первой пустой строки или столбца на листе — к результату необходимо прибавить 1.
      Нюансы:

      • Используя данный способ следует помнить, что не всегда можно получить реальную последнюю заполненную ячейку, т.е. именно ячейку со значением. Метод SpecialCells определяет самую «дальнюю» ячейку на листе, используя при этом механизм «запоминания» тех ячеек, в которых мы работали в данном листе. Т.е. если мы занесем в ячейку AZ90345 значение и сразу удалим его — lLastRow, полученная через SpecialCells будет равна значению именно этой ячейки, из которой вы только что удалили значения(т.е. 90345). Другими словами требует обязательного обновления данных, а этого можно добиться только сохранив файла, а временами даже только закрыв файл и открыв его снова. Так же, если какая-либо ячейка содержит форматирование(например, заливку), но не содержит никаких значений, то метод SpecialCells посчитает её используемой и будет учитывать как заполненную.
        Этот недостаток можно попробовать обойти, вызвав перед определением последней ячейки вот такую строку кода:

        With ActiveSheet.UsedRange: End With

        Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.
        Выглядеть в единой процедуре это будет так:

        Sub GetLastCell()
            Dim lLastRow As Long
            'переопределяем рабочий диапазон листа
            With ActiveSheet.UsedRange: End With
            'ищем последнюю заполненную ячейку на листе
            lLastRow = Cells.SpecialCells(xlLastCell).Row
        End Sub
      • даже если в ячейке нет видимого значения, но есть формула — SpecialCells посчитает ячейку не пустой
      • Данный метод определения последней ячейки не будет работать на защищенном листе(Рецензирование(Review)Защитить лист(Protect Sheet)).
      • Данный метод не будет работать при использовании внутри UDF. Точнее будет работать не так, как ожидается. Подробнее про некоторые «баги» работы встроенных методов внутри UDF(функций пользователя) я описывал в этой статье: Глюк работы в UDF методов SpecialCells и FindNext

      Сам же я этот метод обычно использую для определения последней ячейки в только что созданном файле, в котором только добавляю строки кодом и в котором не может быть описанных выше нюансов.


      Способ 3:
      Определение последней строки через UsedRange

          lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1

      Определение последнего столбца через UsedRange

          lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1

      НЕМНОГО ПОЯСНЕНИЙ:

      • ActiveSheet.UsedRange.Row — этой строкой мы определяем первую ячейку, с которой начинаются данные на листе. Важно понимать для чего это — если у вас первые строк 5 не заполнены ничем(т.е. самые первые данные заносились начиная с 6-ой строки листа), то ActiveSheet.UsedRange.Row вернет именно 6(т.е. номер первой строки с данными). Если же все строки заполнены — то вернет 1.
      • ActiveSheet.UsedRange.Rows.Count — определяем кол-во строк, входящих в весь диапазон данных на листе. При этом неважно, есть ли данные в ячейках или нет — достаточно было поработать в этих ячейках и удалить значения или просто изменить цвет заливки.
        В итоге получается: первая строка данных + кол-во строк с данными — 1. Зачем вычитать единицу? Попробуем посчитать вместе: первая строка: 6. Всего строк: 3. 6 + 3 = 9. Вроде все верно. А теперь выделим на листе три ячейки, начиная с 6-ой. Выделение завершилось на 8-ой строке. Потому что в 6-ой строке уже есть данные. Поэтому и надо вычесть 1, чтобы учесть этот момент. Думаю, не надо пояснять, что если надо получить первую пустую ячейку — можно 1 не вычитать :)
      • То же самое и с ActiveSheet.UsedRange.Column, только уже не для строк, а для столбцов.

      Нюансы:

      • Обладает некоторыми недостатками предыдущего метода. Определяет самую «дальнюю» ячейку на листе, используя при этом механизм «запоминания» тех ячеек, в которых мы работали в данном листе. Следовательно попробовать обойти этот момент можно точно так же: перед определением последней строки/столбца записать строку: With ActiveSheet.UsedRange: End With
        Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.
      • даже если в ячейке нет видимого значения, но есть формула — UsedRange посчитает ячейку не пустой

      Однако метод через UsedRange.Row работает прекрасно и при установленной на лист защите и внутри UDF, что делает его более предпочтительным, чем метод через SpecialCells при равных условиях.


      Способ 4:
      Определение последней строки и столбца, а так же адрес ячейки методом Find

      Sub GetLastCell_Find()
          Dim rF As Range
          Dim lLastRow As Long, lLastCol As Long
          'ищем последнюю ячейку на листе, в которой хранится хоть какое-то значение
          Set rF = ActiveSheet.UsedRange.Find(What:="*", LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, MatchByte:=False)
          If Not rF Is Nothing Then
              lLastRow = rF.Row    'последняя заполненная строка
              lLastCol = rF.Column 'последний заполненный столбец
              MsgBox rF.Address 'показываем сообщение с адресом последней ячейки
          Else
              'если ничего не нашлось - значит лист пустой
              'и можно назначить в качестве последних первую строку и столбец
              lLastRow = 1
              lLastCol = 1
              MsgBox "A1" 'показываем сообщение с адресом ячейки А1
          End If
      End Sub

      Этот метод, пожалуй, самый оптимальный в случае, если надо определить последнюю строку/столбец на листе без учета форматов и формул — только по отображаемому значению в ячейке. Например, если на листе большая таблица и последние строки заполнены формулами, возвращающими при определенных условиях пустую ячейку(=ЕСЛИ(A1>0;1;»»)), предыдущие варианты вернут строку/столбец ячейки с последней ячейкой, в которой формула. В то время как данный метод вернет адрес ячейки только в случае, если в ячейке реально отображается какое-то значение. Такой подход часто используется для того, чтобы определить границы данных для последующего анализа заполненных данных, чтобы не захватывать пустые ячейки с формулами и не тратить время на их проверку.
      Здесь следует обратить внимание на параметры метода Find. В данном случае мы специально указываем искать по значениям, а не по формулам:
      Set rF = ActiveSheet.UsedRange.Find(What:=»*», LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, MatchByte:=False)
      Нюансы:

      • Метод Find, вызванный с листа или другим кодом, имеет свойство запоминать все параметры последнего поиска, а если поиск еще не вызывался — то применяются параметры по умолчанию. А по умолчанию поиск идет всегда по формулам. Поэтому я настоятельно рекомендую указывать принудительно все необходимые параметры, как в примере.
      • Метод Find не будет учитывать в просмотре скрытые строки и столбцы. Это следует учитывать при его применении.

      Пара небольших практических кодов

      Коды ниже могут помочь понять, как использовать приведенные выше строки кода по поиску последней ячейки/строки:

      Sub GetLastCell()
          Dim lLastRow As Long
          Dim lLastCol As Long
          'определили последнюю заполненную ячейку с учетом формул в столбце А
          lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
          MsgBox "Заполненные ячейки в столбце А: " & Range("A1:A" & lLastRow).Address
          'определили последний заполненный столбец на листе(с учетом формул и форматирования)
          lLastCol = Cells.SpecialCells(xlLastCell).Column
          MsgBox "Заполненные ячейки в первой строке: " & Range(Cells(1, 1), Cells(1, lLastCol)).Address
          'выводим сообщение с адресом последней ячейки на листе(с учетом формул и форматирования)
          MsgBox "Адрес последней ячейки диапазона на листе: " & Cells.SpecialCells(xlLastCell).Address
      End Sub

      Выделяем диапазон ячеек в столбцах с А по С, определяя последнюю ячейку по столбцу A этого же листа:

      Sub SelectToLastCell()
          Range("A1:C" & Cells(Rows.Count, 1).End(xlUp).Row).Select
      End Sub

      Копируем ячейку B1 в первую пустую ячейку столбца A этого же листа:

      Sub CopyToFstEmptyCell()
          Dim lLastRow As Long
          lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'определили последнюю заполненную ячейку
          Range("B1").Copy Cells(lLastRow+1, 1)         'скопировали В1 и вставили в следующую после определенной ячейки
      End Sub

      А код ниже делает тоже самое, но одной строкой — применяется Offset и используется тот факт, что изначально методом End мы получаем именно ячейку, а не номер строки(номер строки мы получаем позже через свойство .Row):

      Sub CopyToFstEmptyCell()
          Range("B1").Copy Destination:=Cells(Rows.Count, 1).End(xlUp).Offset(1)
      End Sub

      Range(«B1»).Copy — копирует ячейку В1. Если для аргумента Destination указать другую ячейку, то в неё будет вставлена скопированная ячейка. Мы передаем в этот аргумент определенную методом End ячейку
      Cells(Rows.Count, 1).End(xlUp) — возвращает последнюю заполненную ячейку в столбце А (не строку, а именно ячейку)
      Offset(1) — смещает полученную ячейку на строку вниз
      Используем инструмент автозаполнение(протягивание) столбца В, начиная с ячейки B2 и определяя последнюю ячейку для заполнения на основании столбца А

      Sub AutoFill_B()
          Dim lLastRow As Long
          lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
          Range("B2").AutoFill Destination:=Range("B2:B" & lLastRow)
      End Sub

      На самом деле практических кодов может быть куда больше, т.к. определение последней заполненной или первой пустой ячейки является чуть ли не самой распространенной задачей при написании кодов в Excel.

      Так же см.:
      Как получить последнюю заполненную ячейку формулой?
      Как определить первую заполненную ячейку на листе?
      Что такое переменная и как правильно её объявить?


      Статья помогла? Поделись ссылкой с друзьями!

        Плейлист   Видеоуроки


      Поиск по меткам

      

      Access
      apple watch
      Multex
      Power Query и Power BI
      VBA управление кодами
      Бесплатные надстройки
      Дата и время
      Записки
      ИП
      Надстройки
      Печать
      Политика Конфиденциальности
      Почта
      Программы
      Работа с приложениями
      Разработка приложений
      Росстат
      Тренинги и вебинары
      Финансовые
      Форматирование
      Функции Excel
      акции MulTEx
      ссылки
      статистика

      My first column is an index, with monotonously increasing numbers, which ends at a non predictable point.
      Now I want to find out, how many entries this column has. Is there a better way than iterating throug this and watch out for an empty cell?

      eli-k's user avatar

      eli-k

      10.7k11 gold badges43 silver badges44 bronze badges

      asked Jul 14, 2010 at 9:27

      poeschlorn's user avatar

      If you want to find the last populated cell in a particular column, the best method is:

      Range("A" & Rows.Count).End(xlUp).Row
      

      This code uses the very last cell in the entire column (65536 for Excel 2003, 1048576 in later versions), and then find the first populated cell above it. This has the ability to ignore «breaks» in your data and find the true last row.

      praegustator's user avatar

      answered Oct 6, 2011 at 21:48

      MrKowz's user avatar

      MrKowzMrKowz

      2713 silver badges3 bronze badges

      1

      One way is to: (Assumes index column begins at A1)

      MsgBox Range("A1").End(xlDown).Row
      

      Which is looking for the 1st unoccupied cell downwards from A1 and showing you its ordinal row number.

      You can select the next empty cell with:

      Range("A1").End(xlDown).Offset(1, 0).Select
      

      If you need the end of a dataset (including blanks), try: Range(«A:A»).SpecialCells(xlLastCell).Row

      Community's user avatar

      answered Jul 14, 2010 at 10:03

      Alex K.'s user avatar

      Alex K.Alex K.

      170k30 gold badges263 silver badges286 bronze badges

      2

      You can also use

      Cells.CurrentRegion
      

      to give you a range representing the bounds of your data on the current active sheet

      Msdn says on the topic

      Returns a Range object that represents
      the current region. The current region
      is a range bounded by any combination
      of blank rows and blank columns.
      Read-only.

      Then you can determine the column count via

      Cells.CurrentRegion.Columns.Count
      

      and the row count via

      Cells.CurrentRegion.Rows.Count
      

      answered Jul 14, 2010 at 10:18

      almog.ori's user avatar

      almog.orialmog.ori

      7,8291 gold badge35 silver badges49 bronze badges

      1

      You may also use:

      UsedRange.Rows.Count
      

      answered Jul 2, 2011 at 5:38

      AMIB's user avatar

      AMIBAMIB

      3,1823 gold badges19 silver badges19 bronze badges

      0

      To find the last filled column use the following :

      lastColumn = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
      

      Hugo Dozois's user avatar

      Hugo Dozois

      8,05712 gold badges53 silver badges58 bronze badges

      answered Mar 6, 2013 at 18:13

      deva ruban's user avatar

       

      Подскажите как при помощи VBA определить наличие пустой ячейки (не заполненной = «» ;)  в диапазоне (например А1:С300) или ячейки с значением = 0 ?

       

      Юрий М

      Модератор

      Сообщений: 60575
      Регистрация: 14.09.2012

      Контакты см. в профиле

      Нашли, дальше что? Перебрать диапазон/массив и при нахождении пустой/нулевой выйти из цикла с сообщением.

       

      Антон

      Пользователь

      Сообщений: 617
      Регистрация: 01.01.1970

      #3

      28.01.2014 01:20:21

      посредством перебора каждого значения массива и сравнением )

      Код
      'перебираем строки 
      For i=1 to 300 
      'перебираем столбцы 
      For y=1 to 3 
      If cells(i,y).Value="" then 
      Msgbox("пустая ячейка") 
      Exit for
      End if 
      If cells(i,y).Value=0 then 
      Msgbox("нуль.")  
      Exit for 
      End if    
      Next y   
      Next i

      Изменено: Антон28.01.2014 01:25:02

       

      Да, если такие ячейки имеются вывести сообщение и прекратить дальнейшее выполнение макроса, если таких ячеек нет продолжить выполнение макроса.

       

      Юрий М

      Модератор

      Сообщений: 60575
      Регистрация: 14.09.2012

      Контакты см. в профиле

      #5

      28.01.2014 01:28:51

      Код
      Sub Test()
      Dim Rng As Range, rCell As Range
          Set Rng = Range("A1:C300")
          For Each rCell In Rng
              If IsEmpty(rCell) Or rCell = 0 Then
                  MsgBox "Найдено в ячейке " & rCell.Address(0, 0), 64, "Для сведения"
                  Exit For
              End If
          Next
      End Sub 
       
       

      Юрий М

      Модератор

      Сообщений: 60575
      Регистрация: 14.09.2012

      Контакты см. в профиле

      #7

      28.01.2014 02:01:36

      Без цикла, но и без адресов:

      Код
      Sub Test2()
      Dim Rng As Range
          Set Rng = Range("A1:C300")
          x = Application.WorksheetFunction.CountA(Rng)
          y = Application.WorksheetFunction.CountIf(Rng, 0)
          If Rng.Cells.Count <> x Then MsgBox "Есть пустые."
          If y > 0 Then MsgBox "Есть нули."
      End Sub 
       

      KuklP

      Пользователь

      Сообщений: 14868
      Регистрация: 21.12.2012

      E-mail и реквизиты в профиле.

      Я сам — дурнее всякого примера! …

       

      Max.il

      Пользователь

      Сообщений: 64
      Регистрация: 05.12.2018

      Юрий М, Юрий, добрый вечер. Развивая тему, если нужно проверить несколько ячеек, к примеру А3, Т16 и Т22, если они пустые — залить эту ячейку красным цветом. Если в ней есть что-то , пропустить. Если во всех ячейках есть данные, то просто прекратить выполнение макроса без вывода сообщения.
      Спасибо  

       

      Юрий М

      Модератор

      Сообщений: 60575
      Регистрация: 14.09.2012

      Контакты см. в профиле

       

      Max.il

      Пользователь

      Сообщений: 64
      Регистрация: 05.12.2018

      Юрий М,Нет, т.к. проверка должна осуществляться после макроса.  

       

      Юрий М

      Модератор

      Сообщений: 60575
      Регистрация: 14.09.2012

      Контакты см. в профиле

      УФ сработает и после макроса. А макрос написать не смогу: нет у меня файла, где имеются перечисленные Вами ячейки ))
      Вы бы уточнили: три ячейки — это только для примера? А по факту? И как макрос должен понять, какие именно ячейки проверять? Где-то есть список этих ячеек?

       

      Юрий М

      Модератор

      Сообщений: 60575
      Регистрация: 14.09.2012

      Контакты см. в профиле

      #13

      27.05.2019 23:32:23

      Нет ответа…

      Код
      Dim rCell As Range
          For Each rCell In Range("A3, T16, T22")
              If rCell = "" Then
                  rCell.Interior.ColorIndex = 3
              Else
                  rCell.Interior.ColorIndex = xlNone
              End If
          Next
      
       

      RAN

      Пользователь

      Сообщений: 7091
      Регистрация: 21.12.2012

      #14

      27.05.2019 23:39:10

      Цитата
      Max.il написал:
      к примеру
      Код
      Sub qq()
          Dim r As Range
          Set r = [a1:c3]
          On Error Resume Next
          r.SpecialCells(4).Interior.ColorIndex = 3
      End Sub
       

      Max.il

      Пользователь

      Сообщений: 64
      Регистрация: 05.12.2018

      RAN,  Юрий М, Мужчины, спасибо, что помогаете . Искренняя благодарность.  

       

      Николай Китаев

      Пользователь

      Сообщений: 2
      Регистрация: 01.01.1970

      #16

      17.12.2021 13:26:01

      Цитата
      написал:
      Подскажите как при помощи VBA определить наличие пустой ячейки

      Такая конструкция не работает: If cells(i,y).Value=»» then….

      А так — должно работать:
      If IsEmpty(cells(i,y).Value) = True Then ……., где К — переменная содержащая или несодержащая значение, или переменная, содержащая адрес ячейки Cell, которую проверяем.

      Изменено: Николай Китаев17.12.2021 14:07:17

       

      Jack Famous

      Пользователь

      Сообщений: 10848
      Регистрация: 07.11.2014

      OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

      Николай Китаев, с момента создания темы прошло почти 8 лет, а ТС был последний раз почти 2 года назад — в курсе?  :D

      Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

       

      Ничего страшного. Можно считать, что памятка для себя. Тем более проверка вида cells(i,y).Value=»» не работает.

       

      БМВ

      Модератор

      Сообщений: 21378
      Регистрация: 28.12.2016

      Excel 2013, 2016

      #19

      17.12.2021 14:19:40

      Цитата
      Николай Китаев написал:
      Тем более проверка вида cells(i,y).Value=»» не работает.

      докажите.

      По вопросам из тем форума, личку не читаю.

       

      Jack Famous

      Пользователь

      Сообщений: 10848
      Регистрация: 07.11.2014

      OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

      Если вас что-то не устраивает, то не нужно поднимать со дна старую тему, тем более, что спросить автора не получится — создайте свою и там всё подробно опишите и/или спросите

      И тут гляньте:

      VBA. UDF. Функция для проверки значения на строку нулевой длины «=»»»

      Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

       

      vikttur

      Пользователь

      Сообщений: 47199
      Регистрация: 15.09.2012

      #21

      17.12.2021 23:29:31

      Цитата
      Николай Китаев написал: If IsEmpty(cells(i,y).Value) = True Then ……., где К — переменная

      И где К? )

      Понравилась статья? Поделить с друзьями:
    • Vba excel как определить выделенную ячейку
    • Vba excel как остановить выполнение макроса
    • Vba excel как определить адрес ячейки
    • Vba excel как определить формат ячейки excel
    • Vba excel как объявить массив