Vba excel цикл до последней строки

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

Номер последней заполненной строки в таблице Excel обычно используется в коде VBA для определения следующей за ней первой пустой строки для добавления новой записи. А также для задания интервала для поиска и обработки информации с помощью цикла For… Next (указание границ обрабатываемого диапазона).

Переменную, которой присваивается номер последней строки, следует объявлять как Long или Variant, например: Dim PosStr As Long. В современных версиях Excel количество строк на рабочем листе превышает максимальное значение типа данных Integer.

Таблица в верхнем левом углу

В первую очередь рассмотрим все доступные варианты поиска номера последней заполненной строки для таблиц, расположенных в верхнем левом углу рабочего листа. Такие таблицы обычно представляют собой простые базы данных в Excel, или, как их еще называют, наборы записей.

Пример таблицы с набором данных в Excel

Пример таблицы с набором данных в Excel

Вариант 1
Основная формула для поиска последней строки в такой таблице, не требующая соблюдения каких-либо условий:
PosStr = Cells(1, 1).CurrentRegion.Rows.Count

Вариант 2
Ниже таблицы не должно быть никаких записей, в том числе ранее удаленных:
PosStr = ActiveSheet.UsedRange.Rows.Count

Вариант 3
В первом столбце таблицы не должно быть пропусков, а также в таблице должно быть не менее двух заполненных строк, включая строку заголовков:
PosStr = Cells(1, 1).End(xlDown).Row

Вариант 4
В первой колонке рабочего листа внутри таблицы не должно быть пропусков, а ниже таблицы в первой колонке не должно быть других заполненных ячеек:
PosStr = WorksheetFunction.CountA(Range("A:A"))

Вариант 5
Ниже таблицы не должно быть никаких записей:
PosStr = Cells.SpecialCells(xlLastCell).Row

Последняя строка любой таблицы

Последнюю заполненную строку для любой таблицы будем искать, отталкиваясь от ее верхней левой ячейки: Cells(a, b).

Вариант 1
Основная формула для поиска последней строки в любой таблице, не требующая соблюдения каких-либо условий:
PosStr = Cells(a, b).CurrentRegion.Cells(Cells(a, b).CurrentRegion.Cells.Count).Row

Вариант 2
Дополнительная формула с условием, что в первом столбце таблицы нет пустых ячеек:
PosStr = Cells(a, b).End(xlDown).Row

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

 

VDM

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

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

Здравствуйте уважаемые Форумчане!  
Макрорекордером записал макрос для копирования формул и вставки их значений.  
Но хочу, чтобы каждый раз макрос работал только с реально заполненными данными (то есть до последней заполненной строки).  Нашёл на форуме функцию для поиска последней заполненной строки, попытался создать свою переменную на её базе, определяющую границу диапазона для вставки формул (нижнюю правую). Вроде как в msgBox её показывает правильно, а в макросе выдаёт ошибку …  
Бьюсь уже несколько часов, без нужных знаний сложновато. Как правильно это сделать, где ошибка? Файл с кодом прилагаю.  
Спасибо.

 

Hugo

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

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

Range(«I4:» & VDM).Select ‘ РАБОТАЕТ!!!  
Хотя я бы от селектов избавился.

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

ну, не вникая в суть:  
должно быть, наверное, не    
   Range(«I4:VDM»).Select  
а  
   Range(«I4:» & VDM).Select    

  и к тому же, раз вы работаете не в модуле листа, а в стандартном модуле, то для определенности лучше указывать перед Range Sheet, на котором он находится (у вас — ActiveSheet)

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Дмитрий, с Вашего позволения добавлю самую малость.  

  VDM или LastRow необходимо указать как VDM$ или LastRow$ (As Long).

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

{quote}{login=Дъмитръ}{date=21.07.2010 01:34}{thema=}{post}LastRow$ (As Long).{/post}{/quote}  
???  
Это как это: стринг типа лонг? А почему в скобках?

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Хотя, да, не смотрел Ваш файл.  

  Это если не функцией, а с помощью переменной искать последнею строку. Я обычно так ищу.  

  LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row  
или    
LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count — 1  

  Но раз нужна Вам именно функция, тут мои пять копеек неуместны…

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

VDM, а поделитесь, где это вы нарыли такое чудо от ZVI как  
 Dim SpecCells()  
 SpecCells = Array(xlCellTypeConstants, xlCellTypeFormulas, xlCellTypeComments)  
?  
Что-то я не пойму, что за массив SpecCells получается?  
Но ведь работает же!  
Но вообще-то, что-то сложновато вы вычисляете последнюю строку…  
Есть куча более простых методов.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST, Вы правы, не на ту кнопку нажал, вот так: «VDM& или LastRow&».

 

VDM

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

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

Спасибо огромное за такое количество откликов! Всё стало конечно работать. Просмотреть все ответы пока не успеваю — накатил аврал на работе. Пока только один вопрос — а какую роль выполняет «&» <BR>Для Alex_ST http://www.planetaexcel.ru/forum.php?thread_id=8203

 

VDM, тоже что и «As Long».  

  «VDM&» или «LastRow&»  
или  
«Dim VDM As Long» или «Dim LastRow As Long».

 

Hugo

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

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

Variables types:  

  Dim x%  ‘Integer  
Dim y#  ‘Double  
Dim z!  ‘Single  
Dim v&   ‘Long  
Dim w@   ‘Currency  
Dim q$  ‘String

 

VDM

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

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

Здравствуйте!  

  Было время всё прочитать и разобраться! На все вопросы «почему всё так сложно – отвечу просто: потому, что ЧАЙНИК:)  
Учёл все комментарии и замечания. В результате:  

  1. Избавился от функции VDM, заменив на    
«Range(«I4:» & «M» & LastRow).Select» (The_Prist)  

  2. Заменил способ определения последней строчки на    
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row (Дъмитръ)  

  3. Добавил в свой код проверку на включённый автофильтр  
   On Error Resume Next  
   ActiveSheet.ShowAllData (опять же нарыл на форуме)  
4. Теперь у меня всё в одной процедуре и в модуле листа.  
5.Назначил Dim LastRow%, (кол-во строк листе не будет превышать 10 000) вычитал в полезной литературе что этот тип данных самый быстрый.  
Вот что получилось:  

  Ещё раз всем спасибо.

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Избавьтесь по возможности от кучи не нужных Select.  
Ну, зачем вы несколько раз делаете  
   Range(«I1»).Select, когда после этого сразу начинаете выбирать другие диапазоны?  
Работайте непосредственно с Range, а не с ActiveCell где это только возможно. Например, заполнение формулами первой (на самом деле — третьей) строки будет работать намного быстрее если сделать просто:  
   ‘»Вставляем в формулы в первую строку:»  
   Range(«I3»).FormulaR1C1 = «=RC[-4]&RC[-3]&RC[3]»
   Range(«J3»).FormulaR1C1 = «=IF(RC[-2]=»»РАСХОД»»,-RC[-3],RC[-3])»
   Range(«K3»).FormulaR1C1 = «=YEAR(RC[-9])&»» — «»&MONTH(RC[-9])»
   Range(«L3»).FormulaR1C1 = _  
       «=IF(RC[-10]>=R1C11,IF(RC[-10]<R1C12,RC[-1],»»NOPR.»»),»»до»»)»
   Range(«M3»).FormulaR1C1 = _  
       «=IF(RC[-1]=»»до»»,IF(SUMIF(R3C9:R3000C10,RC[-4],R3C10:R3000C10)=0,»»NOPR.»»,»»PRINT»»),»»PRINT»»)»

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

VDM, я специально написал 2-а метода определения последней строки (возможно их больше, у ZVI универсальная функция).  

  Как я понимаю:  

  1. Ищет последнею только с заполненными данными (текстом, цифрами и т.д.).  
2. Ищет «1.» + граница и т.п.

 

VDM

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

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

{quote}{login=Alex_ST}{date=22.07.2010 04:44}{thema=}{post}Избавьтесь по возможности от кучи не нужных Select.  
Ну, зачем вы несколько раз делаете  
   Range(«I1»).Select, когда после этого сразу начинаете выбирать другие диапазоны?  
{/post}{/quote}  
Спасибо, подправил.  
Основной код писал макрорекордером, поэтому и Select. Я ведь даже и не задумывался, что без этого можно обойтись — на будущее учту.

 

VDM

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

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

{quote}{login=Дъмитръ}{date=22.07.2010 04:47}{thema=}{post}VDM, я специально написал 2-а метода определения последней строки (возможно их больше, у ZVI универсальная функция).  

  Как я понимаю:  

  1. Ищет последнею только с заполненными данными (текстом, цифрами и т.д.).  
2. Ищет «1.» + граница и т.п.{/post}{/quote}  

  Да согласен, но в моём случае, на сколько понимаю  — иду от сложного к простому..  
(найти на форуме функцию для последней строки и вставить её в макрос для меня на тот момент было проще для понимания).  
Так что Ваш совет оказался весьма кстати!

 

Hugo

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

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

#17

22.07.2010 17:25:54

Вот тут обработку надо вернуть взад, а то потом может понадобиться:  

     ‘Если стоит автофильтр, то снимаем его  
   On Error Resume Next  
   ActiveSheet.ShowAllData  
   On Error GoTo 0

Содержание

  1. VBA Excel. Номер последней заполненной строки
  2. Таблица в верхнем левом углу
  3. Последняя строка любой таблицы
  4. Как определить последнюю ячейку на листе через VBA?

VBA Excel. Номер последней заполненной строки

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

Переменную, которой присваивается номер последней строки, следует объявлять как Long или Variant, например: Dim PosStr As Long . В современных версиях Excel количество строк на рабочем листе превышает максимальное значение типа данных Integer.

Таблица в верхнем левом углу

В первую очередь рассмотрим все доступные варианты поиска номера последней заполненной строки для таблиц, расположенных в верхнем левом углу рабочего листа. Такие таблицы обычно представляют собой простые базы данных в Excel, или, как их еще называют, наборы записей.

Пример таблицы с набором данных в Excel

Вариант 1
Основная формула для поиска последней строки в такой таблице, не требующая соблюдения каких-либо условий:
PosStr = Cells(1, 1).CurrentRegion.Rows.Count

Вариант 2
Ниже таблицы не должно быть никаких записей, в том числе ранее удаленных:
PosStr = ActiveSheet.UsedRange.Rows.Count

Вариант 3
В первом столбце таблицы не должно быть пропусков, а также в таблице должно быть не менее двух заполненных строк, включая строку заголовков:
PosStr = Cells(1, 1).End(xlDown).Row

Вариант 4
В первой колонке рабочего листа внутри таблицы не должно быть пропусков, а ниже таблицы в первой колонке не должно быть других заполненных ячеек:
PosStr = WorksheetFunction.CountA(Range(«A:A»))

Вариант 5
Ниже таблицы не должно быть никаких записей:
PosStr = Cells.SpecialCells(xlLastCell).Row

Последняя строка любой таблицы

Последнюю заполненную строку для любой таблицы будем искать, отталкиваясь от ее верхней левой ячейки: Cells(a, b) .

Вариант 1
Основная формула для поиска последней строки в любой таблице, не требующая соблюдения каких-либо условий:
PosStr = Cells(a, b).CurrentRegion.Cells(Cells(a, b).CurrentRegion.Cells.Count).Row

Вариант 2
Дополнительная формула с условием, что в первом столбце таблицы нет пустых ячеек:
PosStr = Cells(a, b).End(xlDown).Row

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

Источник

Как определить последнюю ячейку на листе через 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.

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

Источник

We use  Range.SpecialCells() method in the below VBA Code to find and return details of last used row, column, and cell in a worksheet.

Sample Data:

Sample Data

Syntax:

expression.SpecialCells (Type, Value)

Eg: To return the last used cell address in an activesheet. ActiveSheet.Range(“A1”).SpecialCells(xlCellTypeLastCell).Address

VBA Code:

Declaring Variables:

Variable Data Type Comments
LastRow Long Find and store last used row
LastCol Long store last used column
LastCell String store last used cell address
'Variable Declaration

Dim LastRow As Long, LastCol As Long, LastCell As String

Use SpecialCells function to find last used row/column/cell 

'Find Last Used Row
LastRow = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row

'Find Last Used Column
LastCol = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Column

'Find Last Used Cell
LastCell = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Address

Concatenate all three variables (LastRow/LastCol/LastCell), add a new line between variables use Chr(10).   Show the final output in an Excel Message box.

'Display the last used row/column/cell

MsgBox "Last Used Row : " & LastRow & Chr(10) & "Last Used Column : " & LastCol & Chr(10) & "Last Used Cell : " & LastCell

Implementation:

Follow the below steps to find the Last Used Row and Last Used Column in Excel VBA

Step 1: Add a shape (Find Last Row/Column/Cell) on your worksheet.  

Step 2: Right-click on “Find Last Row/Column/Cell” and “Assign Macro..”

Step 3: Select “findLastUsedCell”, you can see a list of macros if available in your workbook

Step 4: Save your excel file as “Excel Macro-Enabled Workbook” *.xlsm

Step 5: Click “Find Last Row/Column/Cell” to execute the VBA code.  Code will popup below output for the above given example (Output).

Output:

VBA Last Row

Excel VBA Last Row

Finding the last row in a column is an important aspect in writing macro’s and making those dynamic. As we would not prefer to update the cell ranges every now and then when we are working with Excel cell references. As being a coder/developer, you would always prefer to write a dynamic code which can be used on any data and suffice your requirement. Moreover, it would always be great if you have the last row known of your data so that you can dynamically change the code as per your requirement.

I will just point out one example which iterates the importance of dynamic code.

Suppose I have data as given below with employee and their salaries.

VBA Last Row Example 1-1

And look at the code given below:

Code:

Sub Example1()

  Range("D2").Value = WorksheetFunction.Sum(Range("B2:B11"))

End Sub

VBA Last Row Example 1-2

Here, this code prints the sum of salaries for all employees (cell B2:B11) in cell D2. See the image below:

VBA Last Row Example 1-3

Now, what if I add some cells to this data and run this code again?

VBA Last Row Example 1-4

Logically speaking, the above code will not sum up all the 14 rows from column B. Reason for the same is the range which we have updated under WorksheetFunction (which is B2:B11). This is the reason a dynamic code which can take the last filled row into consideration makes it more important for us.

In this article, I will introduce some methods which can be useful in finding out the last row for a given data set using VBA code.

How to Find Last used Row in Column Using VBA?

Below are the different examples with different methods to find the last used Row of a Column in Excel using VBA Code.

You can download this VBA Last Row Excel Template here – VBA Last Row Excel Template

Example #1 – Using Range.End() Method

Well, this method is as same as using the Ctrl + Down Arrow in Excel to go to the last non-empty row. On similar lines, follow the below steps for creating code in VBA to reach to the last non-empty row of a column in Excel.

Step 1: Define a variable which can take value for the last non-empty row of the excel column.

Code:

Sub Example2()

Dim Last_Row As Long

End Sub

VBA Last Row Example 2-1

Here, the variable Last_Row is defined as LONG just to make sure it can take any number of arguments.

Step 2: Use the defined variable to hold the value of the last non-empty row.

Code:

Sub Example2()

Dim Last_Row As Long
Last_Row =

End Sub

VBA Last Row Example 2-2

Step 3: Type the code starting with CELLS (Rows.Count in front of Last_Row =.

Code:

Sub Example2()

Dim Last_Row As Long
Last_Row = Cells(Rows.Count

End Sub

VBA Last Row Example 2-3

Step 4: Mention 1 after a comma in the above-mentioned code. The value numeric 1 is synonyms to the first column in the excel sheet.

Code:

Sub Example2()

Dim Last_Row As Long
Last_Row = Cells(Rows.Count, 1)

End Sub

VBA Last Row Example 2-4

This code allows VBA to find out the total number of (empty + non-empty) rows present in the first column of the excel worksheet. This means this code allows the system to go to the last cell of Excel.

Now, what if you are at the last cell of the excel and want to go up to the last non-empty row? You’ll use Ctrl + Up Arrow, right?

The same logic we are going to use in the next line of code.

Step 5: Use a combination of End key and xlUp to go to the last non-empty row in excel.

Code:

Sub Example2()

Dim Last_Row As Long
Last_Row = Cells(Rows.Count, 1).End(xlUp)

End Sub

VBA Last Row Example 2-5

This will take you to the last non-empty row in the excel. However, you wanted a row number for the same.

Step 6: Use ROW to get the row number of the last non-empty row.

Code:

Sub Example2()

Dim Last_Row As Long
Last_Row = Cells(Rows.Count, 1).End(xlUp).Row

End Sub

VBA Last Row Example 2-6

Step 7: Show the value of Last_Row, which contains the last non-empty row number using MsgBox.

Code:

Sub Example2()

Dim Last_Row As Long
Last_Row = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox Last_Row

End Sub

VBA Last Row Example 2-7

Step 8: Run the code using the Run button or hitting F5 and see the output.

Example 2-8

Output:

VBA Last Row Example 2-9

Step 9: Now, let’s delete one row and see if the code gives an accurate result or not. It will help us checking the dynamism of our code.

Result of Example 2-10

Example #2 – Using Range and SpecialCells

We can also use the Range and SepcialCells property of VBA to get the last non-empty row of the excel sheet.

Follow the below steps to get the last non-empty row in excel using VBA code:

Step 1: Define a variable again as Long.

Code:

Sub Example3()

Dim Last_Row As Long

End Sub

VBA Last Row Example 3-1

Step 2: Start storing the value to the variable Last_Row using the assignment operator.

Code:

Sub Example3()

Dim Last_Row As Long
Last_Row =

End Sub

VBA Last Row Example 3-2

Step 3: Start Typing Range(“A:A”).

Code:

Sub Example3()

Dim Last_Row As Long
Last_Row = Range("A:A")

End Sub

VBA Last Row Example 3-3

Step 4: Use the SpecialCells function to find out the last non-empty cell.

Code:

Sub Example3()

Dim Last_Row As Long
Last_Row = Range("A:A").SpecialCells(xlCellTypeLastCell)

End Sub

VBA Last Row Example 3-4

This function SpecialCells selects the last cell from your excel as it is written in the parentheses (xlCellTypeLastCell allows you to select the last non-empty cell from your excel sheet).

Step 5: Now, use ROW to get the last row from your excel sheet.

Code:

Sub Example3()

Dim Last_Row As Long
Last_Row = Range("A:A").SpecialCells(xlCellTypeLastCell).Row

End Sub

VBA Last Row Example 3-5

This will return the last non-empty row for you from your excel.

Step 6: Now, assign this value of Last_Row to MsgBox so that we can see the last non-empty row number on the message box.

Code:

Sub Example3()

Dim Last_Row As Long
Last_Row = Range("A:A").SpecialCells(xlCellTypeLastCell).Row
MsgBox Last_Row

End Sub

VBA Last Row Example 3-6

Step 7: Run the code by hitting the F5 or Run button placed at the top of the left corner.

Example 3-7

Output:

Result of Example 3-8

You can see that the last non-empty cell number is popped out through MsgBox with reference to the column A because we have mentioned the column A under the Range function while defining the variable formula.

Step 8: If we delete a row and can run this formula. Let’s see what happens.

Result of Example 3-9

You can see the system has still given a row count of 14. Even though I have deleted a row and the actual row count is 13, the system has not captured the row count accurately. For the system to capture the actual row count, you need to save the worksheet and run the code again.

Result of Example 3-10

You can see the actual row count is showing in this screenshot now.

Example #3 – Using Range.Find()

Follow the below steps to get the last non-empty row in excel using VBA code:

Step 1: Define a variable as long.

Code:

Sub Example4()

Dim Last_Row As Long

End Sub

VBA Last Row Example 4-1

Step 2: Now, use the following code to see the last non-empty row.

Code:

Sub Example4()

Dim Last_Row As Long
Last_Row = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row

End Sub

VBA Last Row Example 4-2

Here, the FIND function looks for the first non-blank cell. Asterisk (*) is a wildcard operator which helps in finding out the same.

Starting from cell A1, the system goes back to the last cell from the sheet and searches in a backward direction (xlPrevious). It moves from right to left (xlByRows) and loops up in the same sheet through all the rows on similar lines until it finds a non-blank row (see the .ROW at the end of the code).

Step 3: Use MsgBox to store the value of the last non-empty row and see it as a pop-up box.

Code:

Sub Example4()

Dim Last_Row As Long
Last_Row = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row
MsgBox Last_Row

End Sub

VBA Last Row Example 4-3

Step 4: Run the code and see the output as a pop-up box containing the last non-empty row number.

Example 4-4

Output:

Result of Example 4-5

Things to Remember

  • End (Example1) can be used to find out the first blank cell/row or last non-empty cell/row in a given column using the VBA code.
  • The end works on a single column most of the time. If you have data in ranges, it would be difficult to decide which column should be used to find out the last non-empty row.
  • Find (Example3) works on an entire range from the point of start and finds out the last non-empty cell/row in a given column using VBA code. It also can be used to find out the last non-empty column.

Recommended Articles

This is a guide to VBA Last Row. Here we discuss how to find the last used row in a given column along with some practical examples and a downloadable excel template. You may also look at the following articles to learn more –

  1. VBA Insert Column
  2. VBA Range Cells
  3. VBA XML
  4. VBA XLUP

Like this post? Please share to your friends:
  • Vba excel цикл в обратном порядке
  • Vba excel цикл with
  • Vba excel цикл while пример
  • Vba excel цикл while wend
  • Vba excel цикл for с условием