Vba excel последняя строка умной таблицы

 

Как определить последнию абсолютную строку именного столбца умной таблицы методом vba.
Заранее спасибо!

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#2

09.12.2015 23:55:09

Цитата
SergeyL1986 написал:
абсолютную строку

А что это означает? Есть еще и относительная? Или?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

RAN

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

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

#3

09.12.2015 23:58:21

Цитата
SergeyL1986 написал:
именного столбца

А это что такое?

 

Могу предположить можно вычислить как относительную строку (строка относительно именногованного столбца), а можно вычислить просто строку. )))

 

SergeyL1986

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

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

#5

10.12.2015 00:01:02

Могу предположить можно вычислить как относительную строку (строка относительно именногованного столбца), а можно вычислить просто строку. )))

Код
Range(Таблица1[Столбец1])

вот у данной диапазона вычислить последнию строку

 

RAN

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

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

#6

10.12.2015 00:02:04

Цитата
SergeyL1986 написал: Могу предположить

Можете предложить- вычисляйте
А это, в применении к «умной» таблице, вообще ересь.

Цитата
SergeyL1986 написал: последнию абсолютную строку именного столбца умной таблицы
 

SergeyL1986

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

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

#7

10.12.2015 00:03:36

Пытаюсь вот так вот

Код
Range("Заказы[Вид груза]").SpecialCells(xlCellTypeLastCell).Row

но увы((((результат не тот

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

Вы скажите что под последней строкой-то подразумевается? Последнюю заполненную, последнюю вообще, номер последней строки в таблице, номер последней строки на листе, но в пределах таблицы и т.п.
Может у Вас на листе 100500 таблиц и хотите для каждой конкретно получить какую-то последнюю строку. Мы же не знаем.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Казанский

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

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

#9

10.12.2015 00:10:10

SergeyL1986, может быть

Код
set r=Range("Заказы[Вид груза]")
lastRow=r.row+r.rows.count-1

Изменено: Казанский10.12.2015 00:11:28

 

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

Казанский

уже третий раз выручает меня))))) ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО, сразу видно гуру vba. Без расспросов выдает ответ.

 

Казанский, если не сложно разъясни )
r.row — что подсчитывает???
r.rows.count — считает количество строк в столбце

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#12

10.12.2015 00:38:49

Цитата
SergeyL1986 написал:
Без расспросов выдает ответ

Больше не будем спрашивать. Будем в Ваших темах ждать Казанского  :D
При этом предложенный код все равно даст  последнюю строку на листе, которая является последней для всей умной таблицы, и к тому же не конкретного столбца(и при этом данных в столбец может вообще не быть). Отсюда и сыр-бор, потому как код:

Код
set r=Range("Заказы[Вид груза]")
lastRow=r.row+r.rows.count-1

равносилен такому:

Код
set r=Range("Заказы")
lastRow=r.row+r.rows.count-1

и никакой роли Ваш столбец и абсолютная строка не играют.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 
The_Prist

Вы правы, на самом деле просто нужно было посчитать количество строк и +1 (учесть заголовки), все просто)))…если столбца такого не будет то возникнит «печалька»…но при организации таблицы можно и договориться)))))
ВСЕМ ОГРОМНОЕ СПАСИБО ЗА УЧАСТИЕ В ОБСУЖДЕНИИ.

 

Александр Меркулов

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

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

#14

19.12.2020 12:14:07

Добрый день, через поиск нашёл только эту тему, извините, если где-то уже решался этот вопрос.

Проблема аналогичная проблеме автора, но мне нужна именно первая пустая строка

Код
''Первый вариант написания
        Set sh = Worksheets("Оплата доски")
        lr = sh.Cells(Rows.Count, 2).End(xlUp).Row + 1
Код
''Второй вариант написания
        Set r = Range("Таблица8[Сумма]")
        lr = r.Row + r.Rows.Count

Первый вариант я давно как-то писал, второй вариант взял из этой темы. Но проблема в том, что
-первый вариант заполняет следующую за последней заполненной строкой в выбранном столбике,
-второй вариант заполняет первую пустую строку после умной таблицы.

Но нужно — что бы заполнялась первая пустая строка в самой умной таблице

Изменено: Александр Меркулов19.12.2020 12:14:31

 

Андрей VG

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

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

Excel 2016, 365

#15

19.12.2020 12:36:23

Доброе время суток.

Цитата
Александр Меркулов написал:
именно первая пустая строка

Вариант

Код
?Range("Клиенты").ListObject.ListColumns("Остаток").DataBodyRange.SpecialCells(xlCellTypeBlanks).Areas(1).Row
 

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

 

Kanev75

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

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

В развитие темы вопрос,
Как получить значение из последней строки именного столбца умной таблицы формулами (НЕ методом vba)?
я не о строке итогов, а именно о последней строке.

 

memo

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

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

Excel 2013/2016

#18

13.12.2022 00:57:05

Цитата
Kanev75 написал:
Как получить значение из последней строки именного столбца умной таблицы формулами

Ну, как-то так:
=INDEX(Таблица1[Название столбца];ROWS(Таблица1[Название столбца]))

zhenevieva

0 / 0 / 0

Регистрация: 06.05.2011

Сообщений: 30

1

Excel

Поиск последней заполненной строки в умной таблице

15.07.2019, 15:59. Показов 11795. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день! Ищу последние заполненные строки в двух

умных

таблицах одинаковым способом, но в одном случае возвращается номер последней заполненной строки, а в другом — номер строки, следующей за последней заполненной. Подскажите, пожалуйста, в чем может быть ошибка? Или может, подскажете другой способ поиска последней заполненной строки в умной таблице? Заранее благодарю!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 Dim BLastCell As Range
    Dim NLastCell As Range
    Dim BLastRow As Integer
    Dim NLastRow As Integer
    
        
      
    Dim Prihod As Worksheet
    Dim Baza As Worksheet
    
    Set Prihod = ActiveWorkbook.Sheets("Приход")
    Set Baza = ActiveWorkbook.Sheets("База")
        
          
    If MsgBox("Вы действительно хотите провести накладную?", vbYesNo) = vbYes Then
    ...
                    
        With Baza
                        
           Set BLastCell = .Range("A:A").Find("*", , xlFormulas, , , xlPrevious) 
            BLastRow = BLastCell(1).Row 'здесь возвращает номер последней заполненной строки
        ...
            With Prihod
                Set NLastCell = .Range("B:B").Find("*", , xlFormulas, , , xlPrevious) 
                NLastRow = NLastCell(2).Row 'а здесь - номер строки, следующей за последней заполненной
            ...
            End With

Добавлено через 5 минут
Сама нашла ошибку)
Но если есть лучший способ найти последнюю строку в умной таблице, пожалуйста, посоветуйте!



0



1813 / 1135 / 346

Регистрация: 11.07.2014

Сообщений: 4,002

15.07.2019, 17:13

2

zhenevieva, не стал смотреть ваш код раз проблема решена. Сравните ваш код с недавней темой (8 строка) Увеличение диапазона умной таблицы



0



0 / 0 / 0

Регистрация: 06.05.2011

Сообщений: 30

15.07.2019, 19:01

 [ТС]

3

Спасибо, но это не совсем то) Так считается общее число строк в умной таблице, даже если они пустые. А мне нужно было определить последнюю заполненную.



0



Burk

1813 / 1135 / 346

Регистрация: 11.07.2014

Сообщений: 4,002

16.07.2019, 09:11

4

zhenevieva, если последнюю заполненную, то можно так

Visual Basic
1
2
3
4
5
6
Sub proba()
Dim LB As ListObject, L As Integer
Set LB = ActiveSheet.ListObjects(1)
    L = LB.Range.Rows.Count
MsgBox LB.Range(L, 1).End(xlUp).Row
End Sub

Добавлено через 22 минуты
выдает правильно, если таблица с первой строки листа, а вот если есть строки до таблицы, то надо уменьшать на число этих строк. Т.е. такая конструкция выдает строку не по номерам строк в таблице, а по номерам строк листа



1



0 / 0 / 0

Регистрация: 06.05.2011

Сообщений: 30

17.07.2019, 16:51

 [ТС]

5

СПАСИБО!



0



Burk

1813 / 1135 / 346

Регистрация: 11.07.2014

Сообщений: 4,002

17.07.2019, 17:45

6

zhenevieva, малость не так, как я писал (не всегда выдает, что надо), а надо так

Visual Basic
1
2
3
4
5
6
Sub proba()
Dim LB As ListObject, LastRow As Integer
Set LB = ActiveSheet.ListObjects(1)
    LastRow = LB.Range.Row + LB.Range.Rows.Count - 1
    MsgBox LastRow
End Sub



0



0 / 0 / 0

Регистрация: 06.05.2011

Сообщений: 30

18.07.2019, 09:07

 [ТС]

7

Не, не получается :-( Попробовала. Опять считает все строки в умной таблице, в том числе и пустые.



0



Burk

1813 / 1135 / 346

Регистрация: 11.07.2014

Сообщений: 4,002

18.07.2019, 13:33

8

Лучший ответ Сообщение было отмечено zhenevieva как решение

Решение

zhenevieva, и не получится, это у меня вчера что-то поздно ночью перещелкнуло и выдал общее число строк.
Предыдущий вариант неправильно работает если нет пустой строки снизу. Либо надо начинать со строки за таблицей (опять же должна быть пустая ячейка

Visual Basic
1
2
MsgBox LB.Range(L+1, 1).End(xlUp).Row ' либо
MsgBox IIf(LB.Range(L, 1)="", LB.Range(L, 1).End(xlUp).Row, L)

Ну я ещё посмотрю, не приходилось вплотную иметь дело с умными таблицами

Добавлено через 1 час 11 минут
zhenevieva, уточнение для второго варианта, чтобы всё выдавалось в координатах строк листа

Visual Basic
1
MsgBox IIf(LB.Range(L, 1)="", LB.Range(L, 1).End(xlUp).Row, LB.Range(L, 1).Row)



1



0 / 0 / 0

Регистрация: 06.05.2011

Сообщений: 30

24.07.2019, 10:06

 [ТС]

9

Цитата
Сообщение от Burk
Посмотреть сообщение

MsgBox LB.Range(L+1, 1).End(xlUp).Row

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

Цитата
Сообщение от Burk
Посмотреть сообщение

MsgBox IIf(LB.Range(L, 1)=»», LB.Range(L, 1).End(xlUp).Row, LB.Range(L, 1).Row)

— этот работает отлично! Показывает только заполненные.
Спасибо большое за помощь!



0



Часто онлайн

790 / 529 / 237

Регистрация: 09.01.2017

Сообщений: 1,820

24.02.2022, 16:41

10



0



Работа с умной таблицей из кода VBA Excel. Обращение к ячейкам, строкам и столбцам умной таблицы. Добавление и удаление строк и столбцов.

Обращение к умной таблице

Все примеры кода в этой статье привязаны к таблице с именем «Таблица1», расположенной на активном листе:

Обращение к умной таблице:

ActiveSheet.ListObjects(«Таблица1»)

Обращение к диапазону умной таблицы на рабочем листе:

ActiveSheet.ListObjects(«Таблица1»).Range

Проверяем:

Debug.Print ActiveSheet.ListObjects(«Таблица1»).Range.Address  ‘Результат: $B$3:$G$9

Далее все примеры кода VBA Excel, чтобы их не дублировать, будут представлены как аргументы метода Debug.Print.

Обращение к строкам

Работа с умной таблицей — обращение к строке заголовков:

Debug.Print ActiveSheet.ListObjects(«Таблица1»).Range.Rows(1).Address  ‘Результат: $B$3:$G$3

Таким же образом можно обращаться и к остальным строкам таблицы (Строка1-Строка6), указывая индекс нужной строки от 2 до 7.

К записям таблицы (Строка1-Строка6) обращаются через коллекцию ListRows, указывая индекс записи от 1 до 6:

With ActiveSheet.ListObjects(«Таблица1»)

    Debug.Print .ListRows.Count  ‘Результат: 6

    Debug.Print .ListRows(1).Range.Address  ‘Результат: $B$4:$G$4

    Debug.Print .ListRows(2).Range.Address  ‘Результат: $B$5:$G$5

End With

Обращение к столбцам

Обращение к третьему столбцу умной таблицы из кода VBA Excel:

With ActiveSheet.ListObjects(«Таблица1»)

    ‘Обращение через диапазон умной таблицы

    Debug.Print .Range.Columns(3).Address  ‘Результат: $D$3:$D$9

    Debug.Print .Range.Columns.Count  ‘Результат: 6

    ‘Обращение через коллекцию ListColumns

    Debug.Print .ListColumns(3).Range.Address  ‘Результат: $D$3:$D$9

    Debug.Print .ListColumns.Count  ‘Результат: 6

End With

Обращение к ячейкам

Работа с умной таблицей — обращение к ячейке «E7» с отображением ее значения:

With ActiveSheet.ListObjects(«Таблица1»)

    Debug.Print .Range.Cells(5, 4)  ‘Результат: 91

    Debug.Print .ListColumns(4).Range(5)  ‘Результат: 91

    Debug.Print .ListRows(4).Range(4)  ‘Результат: 91

End With

Вставка и удаление строк

Вставка новой строки в конец умной таблицы:

ActiveSheet.ListObjects(«Таблица1»).ListRows.Add

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

With ActiveSheet.ListObjects(«Таблица1»)

    .ListRows(.ListRows.Count).Delete

End With

Вставка новой строки на место пятой записи (Строка5 в таблице) со сдвигом пятой и нижерасположенных записей вниз:

ActiveSheet.ListObjects(«Таблица1»).ListRows.Add 5

Удаление пятой строки:

ActiveSheet.ListObjects(«Таблица1»).ListRows(5).Delete

Вставка и удаление столбцов

Вставка нового столбца в конец умной таблицы из кода VBA Excel:

ActiveSheet.ListObjects(«Таблица1»).ListColumns.Add

Удаление последнего столбца:

With ActiveSheet.ListObjects(«Таблица1»)

    .ListColumns(.ListColumns.Count).Delete

End With

Вставка нового столбца на место четвертой графы таблицы со сдвигом четвертой и последующих граф вправо:

ActiveSheet.ListObjects(«Таблица1»).ListColumns.Add 4

Удаление четвертого столбца таблицы:

ActiveSheet.ListObjects(«Таблица1»).ListColumns(4).Delete


Создание и удаление умной таблицы описано в статье VBA Excel. Создание таблицы (умной, обычной)


Private Sub CommandButton1_Click()
Dim ws As Worksheet, iCell As Range, iRow&
Set ws = Worksheets("Add")
 
Set iCell = ws.Range("baza_tb").Find("*", , xlFormulas, , , xlPrevious)
If Not iCell Is Nothing Then
   iRow = iCell(2).Row 'iCell.Row + 1
Else
    iRow = ws.Range("baza_tb").Row
End If
 
'copy the data to the database
ws.Cells(iRow, 1).Value = Me.TextBox2.Value
ws.Cells(iRow, 2).Value = Me.Label14.Caption
'ws.Cells(iRow, 3).Value = CStr(Me.TextBox2.Value & Me.Label14.Caption)
ws.Cells(iRow, 4).Value = DateValue(Me.TextBox1.Value)
ws.Cells(iRow, 5).Value = Me.ComboBox1.Value
ws.Cells(iRow, 12).Value = Me.Label12.Caption
ws.Cells(iRow, 13).Value = Val(Year(DateValue(Me.TextBox1.Value)))
ws.Cells(iRow, 14).Value = Val(Month(DateValue(Me.TextBox1.Value)))
ws.Cells(iRow, 15).Value = Val(Day(DateValue(Me.TextBox1.Value)))
If Me.Opnagdi Then
ws.Cells(iRow, 16).Value = ThisWorkbook.Worksheets("siebi").Range("nagdi").Text
End If
 
If Me.Opunagdo Then
ws.Cells(iRow, 16).Value = ThisWorkbook.Worksheets("siebi").Range("unagdi").Text
End If
 
If Me.Opcon Then
ws.Cells(iRow, 16).Value = ThisWorkbook.Worksheets("siebi").Range("konsignacia").Text
 End If
 
ws.Cells(iRow, 17).Value = Me.cbx_cotragerts.Value
 
If Me.cbx_cotragerts.Value = "" Then
'Call Addorganize
ws.Cells(iRow, 17).Value = Me.tbx_kontragets.Value
End If
ws.Cells(iRow, 18).Value = CDbl(Val(Replace(Trim(Me.TextBox63.Value), ",", ".")))
ws.Cells(iRow, 19).Value = CDate(Day(Me.TextBox1.Value) & "." & Month(Me.TextBox1.Value) & "." & Year(Me.TextBox1.Value))
ws.Cells(iRow, 6).Value = Me.ComboBox2.Value
ws.Cells(iRow, 7).Value = Me.TextBox3.Value
ws.Cells(iRow, 8).Value = Me.TextBox4.Value
ws.Cells(iRow, 9).Value = CDbl(Val(Replace(Trim(Me.TextBox5.Value), ",", ".")))
ws.Cells(iRow, 10).Value = CDbl(Val(Replace(Trim(Me.TextBox6.Value), ",", ".")))
ws.Cells(iRow, 11).Value = Me.TextBox7.Value
Call Fillorg
'clear the data
 
Me.TextBox3.BackColor = vbGreen
Me.TextBox4.BackColor = vbGreen
Me.TextBox5.BackColor = vbGreen
Me.TextBox6.BackColor = vbGreen
Me.TextBox7.BackColor = vbGreen
Me.ComboBox2.BackColor = vbGreen
Call ResetCalc
End Sub

Данные верхних и нижних открытых строк умной таблицы.

Сергей13

Дата: Воскресенье, 13.06.2021, 13:51 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Здравствуйте!
Ребята для загрузки значений в комбобоксы, последней и верхней заполненной строки по столбцу 2 в открытых строках умной таблицы, использую функцию End(xlDown) и End(xlUp).
Но данный метод определяет значение только нижней заполненной строки, также данный метод учитывает и скрытые строки. Каким образом в предлагаемом примере определить данные верхних и нижних открытых строк умной таблицы.

К сообщению приложен файл:

stroka.xlsm
(21.7 Kb)

Сообщение отредактировал Сергей13Воскресенье, 13.06.2021, 13:51

 

Ответить

Kuzmich

Дата: Воскресенье, 13.06.2021, 14:47 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

 

Ответить

Сергей13

Дата: Воскресенье, 13.06.2021, 17:16 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

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

Укажите в каких разделах статьи уловить данные критерии.
Пока что для определения данных по столбцу нижней открытой строки внутри таблице данная функция как бы дает тоже положительный результат
[vba]

Код

Range(«tabl_logbook[[#Headers],[Дата]]»).End(xlDown)

[/vba]
Но как определить данные по столбцу в верхней открытой строке не знаю.
Спасибо.

 

Ответить

Kuzmich

Дата: Воскресенье, 13.06.2021, 18:38 |
Сообщение № 4

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

[vba]

Код

Sub Period()
  With ActiveSheet.ListObjects(1)
    FormDemand.Cmb1.Value = .DataBodyRange(1, 2)
    FormDemand.Cmb2.Value = .DataBodyRange(.ListRows.Count, 2)
  End With
End Sub

[/vba]

 

Ответить

Сергей13

Дата: Воскресенье, 13.06.2021, 20:20 |
Сообщение № 5

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Kuzmich,

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

[vba]

Код

Cmb1.Value = Range(“B8”)

[/vba]
но необходимо именно с первой открытой среди скрытых или открытых строк по столбцу 2.

Сообщение отредактировал Сергей13Воскресенье, 13.06.2021, 20:23

 

Ответить

Kuzmich

Дата: Воскресенье, 13.06.2021, 20:40 |
Сообщение № 6

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

[vba]

Код

Sub Period()
  With ActiveSheet.ListObjects(1)
    FormDemand.Cmb1.Value = .DataBodyRange.SpecialCells(xlCellTypeVisible)(1, 2)
    FormDemand.Cmb2.Value = .DataBodyRange.SpecialCells(xlCellTypeVisible)(.DataBodyRange.SpecialCells(xlCellTypeVisible).Rows.Count, 2)
  End With
End Sub

[/vba]

 

Ответить

Сергей13

Дата: Понедельник, 14.06.2021, 00:32 |
Сообщение № 7

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Kuzmich,
Вторая строка кода работает не корректно бывает что показывает данные верхней строки пришлось заменить на
[vba]

Код

RowLow = Range(«tabl_logbook[[#Headers],[Дата]]»).End(xlDown)

[/vba]
Благодарю за помощь!

Сообщение отредактировал Сергей13Понедельник, 14.06.2021, 00:44

 

Ответить

Kuzmich

Дата: Понедельник, 14.06.2021, 10:08 |
Сообщение № 8

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

Цитата

Вторая строка кода работает не корректно

[vba]

Код

FormDemand.Cmb2.Value = .DataBodyRange.SpecialCells(xlCellTypeVisible)(.DataBodyRange.SpecialCells(xlCellTypeVisible).Rows.Count, 2)

[/vba]
Надеюсь вы эту строку ввели в код одной строкой? А то движок форума показывает двумя отдельными строками

 

Ответить

Сергей13

Дата: Понедельник, 14.06.2021, 11:31 |
Сообщение № 9

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Kuzmich,
Да эту, одной строкой. Не постоянно, но часто выводит значения идентичные первой строки. Заменил на ранее предложенную мной, для нижних строк.
Вроде работает, спасибо!

Сообщение отредактировал Сергей13Понедельник, 14.06.2021, 12:29

 

Ответить

Different Ways to Find The Last Row or Last Column Using VBA In Microsoft Excel

Dynamic VBA Code With Last Row/Column

Finding the Last Row or Last Column within your VBA code is key to ensuring your macro doesn’t break in the future.

Early on when I first began writing VBA macro code, I always needed to go back into the code and modify range references.  I had created a bunch of macros to clean up and perform analysis on raw data exported from databases and the data never had the same amount of rows from one data pull to the next.  

My coding skills dramatically changed the day I realized my VBA code could be dynamic and automatically determine the size of my raw data once executed.  I soon came to realize the goal of coding a macro:  to write it once and never touch it again.

Variability is also the greatest challenge for any VBA coder as you have to think of every possible change that could occur in the future.  I have found writing VBA code that can automatically resize itself is one of the greatest things missing from most average macro user’s code.  

In this article, I have compiled a list of the best methods you can use to accomplish finding the last row or column in your data range.

Prep Your Excel Data! 

Keep in mind some of these methods may not give you the desired row or column number if you are not setting your spreadsheet up properly or using a well-formatted block of data.  

What I mean by a “well-formatted block of data”, is a worksheet with data that starts in cell A1 and does not have any blank rows or columns in the middle of the data.  

The below figure illustrates the difference.

An Example of a Poorly-Formatted Data Set

An Example of a Poorly-Formatted Data Set

An Example of a Well-Formatted Data Set

An Example of a Well-Formatted Data Set

In a data set starting in Row 4, you may need to add or subtract a numerical value depending on the method you use.  If you are going to be coding for a data set that has blank rows or columns within it, always be sure to test out your code to make sure it is calculating properly.

Find the Last Cell In Spreadsheet With Data

Finding the last cell with a value in it is key to determining the last row or last column. There are a couple of different ways you can locate the last cell on your spreadsheet. Let’s take a look!

1. The Find Function Method (Best Method)

This line of VBA code will search all the cells on your sheet and return the row of the last cell with any sort of value stored in it. Because the Find function is set to search from the very bottom of the spreadsheet and upwards, this code can accommodate blank rows in your data.

Dim LastCell As Range

Set LastCell = ActiveSheet.Cells.Find(«*», SearchOrder:=xlByRows, SearchDirection:=xlPrevious)

This method ignores empty cells with formatting still in them, which is ideal if you are truly wanting the find the last cell with data in it, not necessarily the last cell that had any modifications done to it.

2. SpecialCells Method

One of the best manual ways to do this is to utilize the Go To Special dialog box.

The Go To Special dialog box has a variety of actions that can be taken to select certain cells or objections on your spreadsheet. One of those options is to select the Last Cell on the active spreadsheet.

You can get to the Go To Special dialog box by using the keyboard shortcut Ctrl + G which will open the Go To dialog box. From there you can click the Special button and you’ll have arrived at the Go To Special dialog box.

In VBA, the select actions in the Go To Special dialog box are simply called SpecialCells. By calling the SpecialCells function in VBA, you gain the same actions, though they have slightly different names. The particular action you’ll want to call is named xlCellTypeLastCell.

The below VBA code stores the last cell found on the spreadsheet with a value in it to a range variable.

Dim LastCell As Range

Set LastCell = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell)

WARNING! This method could give you unintended results as this finds the last cell with any sort of data or formatting associated with it. This means it can return an empty cell that used to have data in it or simply has any formatting changes (like a yellow cell fill color).

7 Ways To Find The Last Row With VBA

There are actually quite a few ways to determine the last row of a data set in a spreadsheet. We will walk through a number of different ways in this article. I have marked specific methods with a “Best Method” tag as these coding practices are the most bullet-proof ways to determine the last row in your spreadsheet data.

1. The Find Function Method (Best Method)

This line of VBA code will search all the cells on your sheet and return the row of the last cell with any sort of value stored in it. Because the Find function is set to search from the very bottom of the spreadsheet and upwards, this code can accommodate blank rows within your data.

Dim LastRow As Long

LastRow = ActiveSheet.Cells.Find(«*», SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

2. SpecialCells Method

SpecialCells is a function you can call in VBA that will allow you to pinpoint certain cells or a range of cells based on specific criteria. We can use the xlCellTypeLastCell action to find the last cell in the spreadsheet and call for the cell’s row number.

Dim LastRow As Long

LastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

WARNING! This method could give you unintended results as this finds the last cell with any sort of data or formatting associated with it. This means it can return an empty cell that used to have data in it or simply has any formatting changes (like a yellow cell fill color).

3. Ctrl+Shift+End Method

This line of VBA code mimics the keyboard shortcut Ctrl + Shift + End and returns the numerical value of the last row in the range.

Dim LastRow As Long

LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, «A»).End(xlUp).Row

4. UsedRange Method

The Used Range is something that Excel stores a reference to behind the scenes. It represents the area of the spreadsheet that has values in it. The Used Range can be referenced in VBA using the UsedRange object.

You must be careful with the Used Range though , as Excel does not always update the reference in real time. Sometimes when you delete cell content the Used Range will not readjust itself right away. For this reason, it is wise to force the UsedRange object to restructure itself with your VBA code. The below VBA code example calls this restructure/refresh prior to utilizing UsedRange to pull the last row.

Dim LastRow As Long

ActiveSheet.UsedRange ‘Refresh UsedRange

LastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row

5. Table Object Method (Best Method)

If you are using a Table Object to store your data, you can use the Table’s name in the below VBA code to return the numerical value of how many rows are in the table.

Dim LastRow As Long

LastRow = ActiveSheet.ListObjects(«Table1»).Range.Rows.Count

6. Named Range Method

If you are using a Named Range to reference your data’s location, you can use the Range name in the below VBA code to return the numerical value of how many rows are in the Named Range.

Dim LastRow As Long

LastRow = ActiveSheet.Range(«MyNamedRange»).Rows.Count

7. Ctrl+Shift+Down Method

Dim LastRow As Long

LastRow = ActiveSheet.Range(«A1»).CurrentRegion.Rows.Count

Expand Your Range To The Last Row

After you have determined the last row, how do you use it? The vast majority of the time you are going to want to store your entire data range to a Range variable. The following code shows you how to incorporate the last row number you calculated into a Range reference.

Dim DataRange As Range

Set DataRange = Range(«A1:M» & LastRow)

7 Ways To Find The Last Column With VBA

There are actually quite a few ways to determine the last column of a data set in a spreadsheet. We will walk through a number of different ways in this article. I have marked specific methods with a “Best Method” tag as these coding practices are the most bullet-proof ways to determine the last column in your spreadsheet data.

1. The Find Function Method (Best Method)

This line of VBA code will search all the cells on your sheet and return the column of the last cell with any sort of value stored in it. Because the Find function is set to search from the very far right of the spreadsheet and then leftward, this code can accommodate blank columns within your data.

Dim LastColumn As Long

LastColumn = ActiveSheet.Cells.Find(«*», SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

2. SpecialCells Method

SpecialCells is a function you can call in VBA that will allow you to pinpoint certain cells or a range of cells based on specific criteria. We can use the xlCellTypeLastCell action to find the last cell in the spreadsheet and call for the cell’s column number.

Dim LastColumn As Long

LastColumn = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column

WARNING! This method could give you unintended results as this finds the last cell with any sort of data or formatting associated with it. This means it can return an empty cell that used to have data in it or simply has any formatting changes (like a yellow cell fill color).

3. Ctrl+Shift+End Method

Dim LastColumn As Long

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

4. UsedRange Method

Dim LastColumn As Long

ActiveSheet.UsedRange ‘Refresh UsedRange

LastColumn = ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column

5. Table Object Method (Best Method)

If you are using a Table Object to store your data, you can use the Table’s name in the below VBA code to return the numerical value of how many columns are in the table.

Dim LastColumn As Long

LastColumn = ActiveSheet.ListObjects(«Table1»).Range.Columns.Count

6. Named Range Method

Dim LastColumn As Long

LastColumn = ActiveSheet.Range(«MyNamedRange»).Columns.Count

7. Ctrl+Shift+Right Method

Dim LastColumn As Long

LastColumn = ActiveSheet.Range(«A1»).CurrentRegion.Columns.Count

How To Expand Your Range To The Last Column

After you have determined the last column, how do you use it? The vast majority of the time you are going to want to store your entire data range to a Range variable. The following code shows you how to incorporate the last column number you calculated into a Range reference.

Dim DataRange As Range

Set DataRange = Range(Cells(1, 1), Cells(100, LastColumn))

VBA Function To Find Last Row or Column

Tim provided the inspiration for a function that can return either the last row or column number through a user-defined function for a given worksheet.

An example of how you could call this function to return the last row on the active worksheet would be written as: x = LastRowColumn(ActiveSheet, «Row»)

Function LastRowColumn(sht As Worksheet, RowColumn As String) As Long
‘PURPOSE: Function To Return the Last Row Or Column Number In the Active Spreadsheet
‘INPUT: «R» or «C» to determine which direction to search

Select Case LCase(Left(RowColumn, 1)) ‘If they put in ‘row’ or column instead of ‘r’ or ‘c’.
  Case «c»
    LastRowColumn = sht.Cells.Find(«*», LookIn:=xlFormulas, SearchOrder:=xlByColumns, _
    SearchDirection:=xlPrevious).Column
  Case «r»
    LastRowColumn = sht.Cells.Find(«*», LookIn:=xlFormulas, SearchOrder:=xlByRows, _
    SearchDirection:=xlPrevious).Row
  Case Else
    LastRowColumn = 1
End Select

End Function

What Can I Do With A LastRow Or LastColumn Variable?

There are many things you can do by calculating the last row or last column of a data set.  Examples could be:

  • Resizing a Pivot Table range

  • Looping through cells in a column

  • Deleting only the raw data range

There are many, many more examples of this and I’m sure you can think of a few examples yourself.

Let me know in the comments section below how you use resizing a range in your macro code!  Also, if you can think of any other ways to use VBA code to find the last row or last column, post your coding method in the comments section so we can improve the current list.  I look forward to reading about your experiences.

I Hope This Excel Tutorial Helped!

Hopefully, I was able to explain how you can use VBA code to find the last row or last column of your range to add dynamic capabilities to your macros. If you have any questions about these techniques or suggestions on how to improve this article, please let me know in the comments section below.

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and hope to see you back here soon! — Chris

Содержание

  1. VBA Excel. Номер последней заполненной строки
  2. Таблица в верхнем левом углу
  3. Последняя строка любой таблицы
  4. How to determine the last Row used in VBA including blank spaces in between [duplicate]
  5. 11 Answers 11
  6. Vba excel последняя строка умной таблицы
  7. Как определить последнюю ячейку на листе через 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.

Источник

How to determine the last Row used in VBA including blank spaces in between [duplicate]

How can I determine the last row in an Excel sheet, including some blank lines in the middle?

With this function:

The function returns 5, and I need 13. Any idea how to do it?

11 Answers 11

The best way to get number of last row used is:

ActiveSheet.UsedRange.Rows.Count for the current sheet.

Worksheets(«Sheet name»).UsedRange.Rows.Count for a specific sheet.

To get number of the last column used:

ActiveSheet.UsedRange.Columns.Count for the current sheet.

Worksheets(«Sheet name»).UsedRange.Columns.Count for a specific sheet.

I hope this helps.

Short. Safe. Fast. Will return the last non-empty row even if there are blank lines on top of the sheet, or anywhere else. Works also for an empty sheet (Excel reports 1 used row on an empty sheet so the expression will be 1). Tested and working on Excel 2002 and Excel 2010.

I use the following:

It’ll find the last row in a specific column. If you want the last used row for any column then:

You’re really close. Try using a large row number with End(xlUp)

The Problem is the «as string» in your function. Replace it with «as double» or «as long» to make it work. This way it even works if the last row is bigger than the «large number» proposed in the accepted answer.

So this should work

If sheet contains unused area on the top, UsedRange.Rows.Count is not the maximum row.

This is the correct max row number.

Well apart from all mentioned ones, there are several other ways to find the last row or column in a worksheet or specified range.

Note: Please use only one of the above method as it justifies your problem statement.

Please pay attention to the fact that Find method does not see cell formatting but only data, hence look for xlCellTypeLastCell if only data is important and not formatting. Also, merged cells (which must be avoided) might give you unexpected results as it will give you the row number of the first cell and not the last cell in the merged cells.

Источник

Vba excel последняя строка умной таблицы

Serge_Bliznykov вот чесно я мало что понимю.если не трудно можете показать на моем коде куда вставить ваш пример

вместо 7 должно быть конец таблицы.буду очень благодарен

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

Тут всё зависит от того, ЧТО именно Вы называете «концом таблицы».

Допустим, это ПОСЛЕДНЯЯ используемая (заполненная) строчка на листе Excel.

тогда Ваш код можно записать так:

Казанский, можно и так.
только поведение данного кода будет ДРУГОЕ!

если, например, все столбцы (за исключением 4-го столбца) заполнены до 100-й строки, а 4-й столбец — до 5-й строки, то
Cells(Rows.Count, 4).End(xlUp).Row — вернёт именно 5 (пять).

возможно, автору топика так и нужно (это же упирается в то, что понимать под «концом таблицы»).
Просто нужно знать, что данные примеры кода не эквивалентны!

Источник

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

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

Источник

How can I determine the last row in an Excel sheet, including some blank lines in the middle?

With this function:

Function ultimaFilaBlanco(col As String) As Long        
        Dim lastRow As Long
        With ActiveSheet
            lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row
        End With            
        ultimaFilaBlanco = lastRow          
End Function

And this data:

Row 1 : Value
Row 2 : Value
Row 3 : Value
Row 4 : Value
Row 5 : Value
Row 6 : White
Row 7 : Value
Row 8 : Value
Row 9 : Value
Row 10  : White
Row 11  : White
Row 12  : White
Row 13  : Value
Row 14  : White

The function returns 5, and I need 13. Any idea how to do it?

Paolo Stefan's user avatar

Paolo Stefan

10.1k5 gold badges48 silver badges64 bronze badges

asked Dec 3, 2012 at 15:49

Jonathan Raul Tapia Lopez's user avatar

4

The best way to get number of last row used is:

ActiveSheet.UsedRange.Rows.Count for the current sheet.

Worksheets("Sheet name").UsedRange.Rows.Count for a specific sheet.

To get number of the last column used:

ActiveSheet.UsedRange.Columns.Count for the current sheet.

Worksheets("Sheet name").UsedRange.Columns.Count for a specific sheet.

I hope this helps.

Abdo

answered Jun 12, 2013 at 14:19

Abdelhameed Mahmoud's user avatar

3

ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Rows(1).Row -1

Short. Safe. Fast. Will return the last non-empty row even if there are blank lines on top of the sheet, or anywhere else. Works also for an empty sheet (Excel reports 1 used row on an empty sheet so the expression will be 1). Tested and working on Excel 2002 and Excel 2010.

answered Dec 23, 2013 at 14:30

manuel's user avatar

3

I use the following:

lastrow = ActiveSheet.Columns("A").Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

It’ll find the last row in a specific column. If you want the last used row for any column then:

lastrow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

answered Dec 3, 2012 at 17:24

Sid Holland's user avatar

Sid HollandSid Holland

2,8713 gold badges29 silver badges43 bronze badges

1

You’re really close. Try using a large row number with End(xlUp)

Function ultimaFilaBlanco(col As String) As Long

        Dim lastRow As Long
        With ActiveSheet
            lastRow = ActiveSheet.Cells(1048576, col).End(xlUp).row
        End With

        ultimaFilaBlanco = lastRow

End Function

answered Dec 3, 2012 at 16:18

fbonetti's user avatar

fbonettifbonetti

6,5823 gold badges33 silver badges32 bronze badges

2

LastRow = ActiveSheet.UsedRange.Rows.Count

CallumDA's user avatar

CallumDA

12k6 gold badges30 silver badges52 bronze badges

answered Dec 3, 2012 at 16:19

jtorreon's user avatar

2

The Problem is the «as string» in your function. Replace it with «as double» or «as long» to make it work. This way it even works if the last row is bigger than the «large number» proposed in the accepted answer.

So this should work

Function ultimaFilaBlanco(col As double) As Long        
    Dim lastRow As Long
    With ActiveSheet
        lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row
    End With            
    ultimaFilaBlanco = lastRow          
End Function

answered Jun 14, 2013 at 12:03

user1965813's user avatar

user1965813user1965813

6715 silver badges16 bronze badges

If sheet contains unused area on the top, UsedRange.Rows.Count is not the maximum row.

This is the correct max row number.

maxrow = Sheets("..name..").UsedRange.Rows(Sheets("..name..").UsedRange.Rows.Count).Row

answered Jun 21, 2018 at 5:26

JHK's user avatar

0

Well apart from all mentioned ones, there are several other ways to find the last row or column in a worksheet or specified range.

Function FindingLastRow(col As String) As Long

  'PURPOSE: Various ways to find the last row in a column or a range
  'ASSUMPTION: col is passed as column header name in string data type i.e. "B", "AZ" etc.

   Dim wks As Worksheet
   Dim lstRow As Long

   Set wks = ThisWorkbook.Worksheets("Sheet1") 'Please change the sheet name
   'Set wks = ActiveSheet   'or for your problem uncomment this line

   'Method #1: By Finding Last used cell in the worksheet
   lstRow = wks.Range("A1").SpecialCells(xlCellTypeLastCell).Row

   'Method #2: Using Table Range
   lstRow = wks.ListObjects("Table1").Range.Rows.Count

   'Method #3 : Manual way of selecting last Row : Ctrl + Shift + End
   lstRow = wks.Cells(wks.Rows.Count, col).End(xlUp).Row

   'Method #4: By using UsedRange
   wks.UsedRange 'Refresh UsedRange
   lstRow = wks.UsedRange.Rows(wks.UsedRange.Rows.Count).Row

   'Method #5: Using Named Range
   lstRow = wks.Range("MyNamedRange").Rows.Count

   'Method #6: Ctrl + Shift + Down (Range should be the first cell in data set)
   lstRow = wks.Range("A1").CurrentRegion.Rows.Count

   'Method #7: Using Range.Find method
   lstRow = wks.Column(col).Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

   FindingLastRow = lstRow

End Function

Note: Please use only one of the above method as it justifies your problem statement.

Please pay attention to the fact that Find method does not see cell formatting but only data, hence look for xlCellTypeLastCell if only data is important and not formatting. Also, merged cells (which must be avoided) might give you unexpected results as it will give you the row number of the first cell and not the last cell in the merged cells.

answered Aug 5, 2017 at 17:23

jainashish's user avatar

jainashishjainashish

4,4425 gold badges38 silver badges48 bronze badges

1

ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).row

ActiveSheet can be replaced with WorkSheets(1) or WorkSheets("name here")

answered Jan 29, 2018 at 21:48

18C's user avatar

18C18C

1,95410 silver badges16 bronze badges

here is my code to find the next empty row for example in first row ‘A’.
To use it for any other row just change cells(i,2 or 3 or 4 so on)

Sheets("Sheeet1").Select
   for i=1 to 5000
        if cells(i,1)="" then nextEmpty=i goto 20
   next i
20 'continue your code here 

enter code here

answered Sep 14, 2015 at 8:51

Odiljon Jakhangirov's user avatar

Better:

if cells(i,1)="" then 
nextEmpty=i: 
exit for

Vagish's user avatar

Vagish

2,50018 silver badges32 bronze badges

answered Dec 12, 2017 at 13:43

MarcoP's user avatar

1

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