Vba excel как найти пустую ячейку

My sheet look like :
enter image description here

I have a function to get index of the LAST empty cell in column A:

NextRow = Range("A" & Rows.Count).End(xlUp).Row + 1

This function works to write on second array (Type2).

But now, i would like a function to get index of the FIRST empty cell in column A. So i went to this website: Select first empty cell and i tried to adapt code but it’s doesn’t work:

If Array= "Type1" Then
    Dim ws As Worksheet
    Set ws = ActiveSheet
    For Each cell In ws.Columns(1).Cells
       If IsEmpty(cell) = True Then NextRow = cell: Exit For 'ERROR 1004
    Next cell
End If
If Array= "Type2" Then 'It s works
    NextRow = Range("A" & Rows.Count).End(xlUp).Row + 1
End If

ActiveSheet.Range("A" & NextRow) = "TEST"

Could you help me to adapt my code to have NextRow = IndexOf FIRST empty cell in A ?

Zoe stands with Ukraine's user avatar

asked Oct 28, 2016 at 9:13

Ferfa's user avatar

You could just use the same method you did to get the last one.

NextRow = Range("A1").End(xlDown).Row + 1

answered Oct 28, 2016 at 11:22

Liss's user avatar

LissLiss

4413 silver badges8 bronze badges

1

I do this and it’ works:

If Array= "Type1" Then
       Dim ws As Worksheet
            Set ws = ActiveSheet
            For Each cell In ws.Columns(1).Cells
               If IsEmpty(cell) = True Then
                    NextRow = cell.Row
                    Exit For
                    MsgBox NextRow
                End If
            Next cell
    End If
    If Array= "Type2" Then 'It s works
        NextRow = Range("A" & Rows.Count).End(xlUp).Row + 1
    End If

    ActiveSheet.Range("A" & NextRow) = "TEST"

Vasily's user avatar

Vasily

5,7073 gold badges20 silver badges34 bronze badges

answered Oct 28, 2016 at 9:58

Ferfa's user avatar

FerfaFerfa

2112 gold badges4 silver badges16 bronze badges

You should look bottom up for this.

And Find is better than xlUp.

Sub FindBlank()
    Dim ws As Worksheet
    Dim rng1 As Range
    Set ws = ActiveSheet
    Set rng1 = ws.Columns(1).Find("*", ws.[a1], xlFormulas, , xlByColumns, xlPrevious)
    If Not rng1 Is Nothing Then
        MsgBox "Last used cell is " & rng1.Address(0, 0)
    Else
        MsgBox ws.Name & " row1 is completely empty", vbCritical
    End If
End Sub

answered Oct 31, 2016 at 8:02

brettdj's user avatar

brettdjbrettdj

54.6k16 gold badges113 silver badges176 bronze badges

I took a similar approach to some of the answers, but with the goal of repeatedly looking down the column until I could guarantee that there was no more populated cells below.

I turned this into a small function that I put in a standard module:-

Public Function getFirstBlankRowNumberOnSheet(sht As Worksheet, Optional startingRef As String = "A1") As Long 'may get more than 32767 rows in a spreadsheet (but probably not!)
  Dim celTop As Range
  Dim celBottom As Range
  On Error Resume Next
  Set celTop = sht.Range(startingRef)

  Do
    Set celBottom = celTop.End(xlDown)
    Set celTop = celBottom.Offset(1) 'This will throw an error when the bottom cell is on the last available row (1048576)
  Loop Until IsEmpty(celBottom.value)

  getFirstBlankRowNumberOnSheet = celTop.Row

End Function

This will throw an error if there happens to be content in the row #1048576! The particulars of this are dependent on the Excel version I suppose in terms of maximum row cont allowed.

answered Jun 12, 2020 at 21:39

Darren Gill's user avatar

Be it for troubleshooting formula errors or data integrity, you might find yourself trying to identify those cells going through the entire workbook. In this article we’re going to show to find in Excel if cell is blank using VBA and automate this process.

How to find in Excel if cell is blank using VBA

VBA has some predefined types for the cells that contains special values. These can be accessed with the SpecialCells method. The SpecialCells method uses two arguments to specify the cells; Type and Value. Using a combination of these two arguments you can easily access the cell or range type you desired. Below is a list of values both arguments can get.

Type

  • xlCellTypeAllFormatConditions. Cells of any format
  • xlCellTypeAllValidation. Cells having validation criteria
  • xlCellTypeBlanks. Empty cells
  • xlCellTypeComments. Cells containing comments
  • xlCellTypeConstants. Cells containing constants
  • xlCellTypeFormulas. Cells containing formulas
  • xlCellTypeLastCell. The last cell in the selected range. Note that this will include empty cells that have had any cells that changed from their default format.
  • xlCellTypeSameFormatConditions. Cells having the same format
  • xlCellTypeSameValidation. Cells having the same validation criteria
  • xlCellTypeVisible. All visible cells

Value

  • xlErrors
  • xlLogical
  • xlNumbers
  • xlTextValues

To find the blank cells using VBA, using xlCellTypeBlanks constant for the type argument is enough. The value argument can be omitted.

An important point in here is that the Selection.SpecialCells(xlCellTypeBlanks).Cells returns an array of cells. So, before returning any information, we need to step through each cell in the array. A For Each…Loop is perfect for arrays consisting of objects. We designed our code to return the address of all blank cells in a Message Box.

To be able to run codes, you need to add a module into the workbook or the add-in file. Copy and paste the code into the module to run it. The main advantage of the module method is that it allows saving the code in the file, so that it can be used again later. Furthermore, the subroutines in modules can be used by icons in the menu ribbons or keyboard shortcuts. Remember to save your file in either XLSM or XLAM format to save your VBA code.

Find blank cells

Sub FindBlankCells()

    Dim rng As Range, message As String

    For Each rng In Selection.SpecialCells(xlCellTypeBlanks).Cells

        message = message & Chr(10) & rng.Address 'Chr(10) is for new line

    Next

    MsgBox message, vbOKOnly, "Empty Cells" 'vbOKOnly is the type of the message box

End Sub
 

maverick

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

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

Прошу помощи знающих.  
Задача: имеем таблицу данных, которая постоянно пополняется (добавляются строки)  
В таблице важным вяляется второй столбец; ячейки в нем заполнены в каждой строке.  
Необходим макрос, который будет устанавливать табличный курсор в первую свободную (пустую) ячейку внизу этого столбца (т.е. фактически в следующую заполняему строку таблицы).  

  К сожалению, я пока «не очень» дружен с VBA =)  
Пробовал воспользоваться простой записью макроса и примитивной последовательностью: поиск крайней заполненной ячейки с помощью Ctrl+PageDown и шаг вниз с помощью стрелки. Но попытка провалились, т.к. выбор крайней заполненной ячейки он понимает и записывает, как надо, а вот действия клавиатурных стрелок запоминаются не как «перемещение вниз (вверх, влево, вправо)», а как выбор какой-то конкретной ячейки с конкретным адресом.  

  Помогите, плз.

 

vlanib

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

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

[В1].End(xlDown).Offset(1, 0).Value = «Последняя свободная ячейка столбца В»

 

Юрий М

Модератор

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

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

В общем случае макрос может выглядеть так:  
Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,2).End(xlUp).Row  
cells(iLastRow+1,2).Select  
End Sub

 

maverick

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

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

{quote}{login=vlanib}{date=13.05.2010 10:37}{thema=}{post}[В1].End(xlDown).Offset(1, 0).Value = «Последняя свободная ячейка столбца В»{/post}{/quote}

  уточнение: мне необходима первая, а не крайняя свободная ячейка. Можно как-то переделать?

 

maverick

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

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

{quote}{login=Юрий М}{date=13.05.2010 10:41}{thema=}{post}В общем случае макрос может выглядеть так:  
Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,2).End(xlUp).Row  
cells(iLastRow+1,2).Select  
End Sub{/post}{/quote}  

  Спасибо огромное!  
Я совершенно не понял как это работает, но это РАБОТАЕТ! =)))

 

Serge

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

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

А как переделать код:  

  Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,2).End(xlUp).Row  
cells(iLastRow+1,2).Select  
End Sub  

  , что бы искалась первая пустая ячейка в том столбце, в котором находится активная ячейка?

 

The_Prist

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

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

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

Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,activeCell.Column).End(xlUp).Row  
cells(iLastRow+1,activeCell.Column).Select  
End Sub

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

 

Serge

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

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

Спасибо!  
Один вопрос. Если в столбце нет заполненых ячеек, то находится ячейка во второй строке…  
Почему и как сделать правильно (в первой)?

 

maverick

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

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

тут же возник попутный вопрос:  
в указаном столбце постоянно добавляются значения; это числа (что-то типа порядкового номера строки).  
Как в тоу самую первую пустую ячейку подставить максимальное число этого столбца? А если быть точнее — «максимальное плюс один»

 

The_Prist

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

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

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

Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,activeCell.Column).End(xlUp).Row  
if iLastRow > 1 then iLastRow = iLastRow + 1  
cells(iLastRow,activeCell.Column).Select  
End Sub

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

 

Serge

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

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

 

The_Prist

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

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

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

{quote}{login=maverick}{date=13.05.2010 11:16}{thema=}{post}тут же возник попутный вопрос:  
в указаном столбце постоянно добавляются значения; это числа (что-то типа порядкового номера строки).  
Как в тоу самую первую пустую ячейку подставить максимальное число этого столбца? А если быть точнее — «максимальное плюс один»{/post}{/quote}Максимальное и порядковый номер это разные вещи. Если нужно просто следующий порядковый номер в первую пустую ячейку внести:  

  Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,1).End(xlUp).Row  
cells(iLastRow+1,1).Value =cells(iLastRow,1)+1  
End Sub  

  Если максимальное+1  
Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,1).End(xlUp).Row  
cells(iLastRow+1,1).Value =application.Max(Range(«A1:A» & iLastRow))+1  
End Sub  

  Все применено к первому столбцу

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

 

Спасибо! =)  
кой-чего подправил и всё работает =)))

 

А как можно такое провернуть:  
Номера строк у меня добавляются автоматом. При этом так же автоматически создаётся копия листа-шаблона.  
Надо теперь присвоить имя новому (только что созданому) листу, равное новому номеру строки.  
Возможно ли такое?

 

The_Prist

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

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

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

Какое отношение вопрос имеет к данной теме? Создавайте тему по правилам и получите ответ.

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

 

А как прописать, что бы просматривался только диапазон P4:P16 , т.к. после этого идут дальше заполненные ячейки.  
   Dim iLastRow As Long  
   iLastRow = Cells(Rows.Count, 16).End(xlUp).Row  
   Cells(iLastRow + 1, 16).Select

 

The_Prist

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

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

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

Range(«P16»).End(xlUp).Select

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

 

KuklP

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

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

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

{quote}{login=The_Prist}{date=13.05.2010 11:16}{thema=}{post}Sub Макрос1()  
Dim iLastRow As Long  
iLastRow = Cells(Rows.Count,activeCell.Column).End(xlUp).Row  
if iLastRow > 1 then iLastRow = iLastRow + 1  
cells(iLastRow,activeCell.Column).Select  
End Sub{/post}{/quote}А так:  
Sub www()  
   Columns(ActiveCell.Column).SpecialCells(4)(1).Select  
End Sub  
?

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

 

{quote}{login=The_Prist}{date=24.12.2011 01:20}{thema=}{post}Range(«P16»).End(xlUp).Select{/post}{/quote}  

     Dim iLastRow As Long  
   iLastRow = Range(«P16»).End(xlUp).Select  
   Cells(iLastRow + 1, 16).Select  

  Переносит на ячейку Р2, а необходимо с верху вниз с Р4 до Р16 в зависимости от заполнения ячеек. Т.к. ячейка Р19 и ниже содержит данные.  
Спасибо.

 

Hugo

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

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

Вот это  
iLastRow = Range(«P16»).End(xlUp).Select  
откуда взяли? :)  

  Можно так:  
Sub tt()  
Dim iLastRow As Long  
iLastRow = Range(«P16»).End(xlUp).Row  
Cells(iLastRow + 1, 16).Select  
End Sub  

  Это от P16 идём вверх.  
Можно наоборот, от P3 идём вниз по пустым:  

  Sub tt()  
Range(«P3:P16»).SpecialCells(xlCellTypeBlanks).Cells(1) = «Пишем_сюда»  
End Sub

 

Hugo

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

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

Вернее так, с обработкой ошибки, когда всё будет заполнено:  

    Sub tt()  
On Error Resume Next  
Err.Clear  
Range(«P4:P15»).SpecialCells(xlCellTypeBlanks).Cells(1) = «Пишем_сюда»  
If Err <> 0 Then MsgBox «Всё заполнено!!!»  
Err.Clear  
End Sub

 

{quote}{login=Hugo}{date=25.12.2011 01:58}{thema=}{post}Вернее так, с обработкой ошибки, когда всё будет заполнено:  

    Sub tt()  
On Error Resume Next  
Err.Clear  
Range(«P4:P15»).SpecialCells(xlCellTypeBlanks).Cells(1) = «Пишем_сюда»  
If Err <> 0 Then MsgBox «Всё заполнено!!!»  
Err.Clear  
End Sub{/post}{/quote}  

  Спасибо. Но нужно чтобы он выделял ячейки с Р4 до Р16, а в этом макросе он вставляет в свободную ячейку надпись Всё заполнено!!!. Т.к. данные в эти ячейка вставляются тоже через макрос а не в ручную.  
Спасибо.

 

{quote}{login=}{date=25.12.2011 02:06}{thema=Re: }{post}{quote}{login=Hugo}{date=25.12.2011 01:58}{thema=}{post}Вернее так, с обработкой ошибки, когда всё будет заполнено:  

    Sub tt()  
On Error Resume Next  
Err.Clear  
Range(«P4:P15»).SpecialCells(xlCellTypeBlanks).Cells(1) = «Пишем_сюда»  
If Err <> 0 Then MsgBox «Всё заполнено!!!»  
Err.Clear  
End Sub{/post}{/quote}  

  Спасибо. Но нужно чтобы он выделял ячейки с Р4 до Р16, а в этом макросе он вставляет в свободную ячейку надпись Всё заполнено!!!. Т.к. данные в эти ячейка вставляются тоже через макрос а не в ручную.  
Спасибо.{/post}{/quote}  

  Попробую так:  

  Sub tt()  
On Error Resume Next  
Err.Clear  
Range(«P4:P15»).SpecialCells(xlCellTypeBlanks).Cells(1).Select  
If Err <> 0 Then MsgBox «Всё заполнено!!!»  
Err.Clear  
End Sub

 

{quote}{login=}{date=25.12.2011 02:12}{thema=Re: Re: }{post}{quote}{login=}{date=25.12.2011 02:06}{thema=Re: }{post}{quote}{login=Hugo}{date=25.12.2011 01:58}{thema=}{post}Вернее так, с обработкой ошибки, когда всё будет заполнено:  

    Sub tt()  
On Error Resume Next  
Err.Clear  
Range(«P4:P15»).SpecialCells(xlCellTypeBlanks).Cells(1) = «Пишем_сюда»  
If Err <> 0 Then MsgBox «Всё заполнено!!!»  
Err.Clear  
End Sub{/post}{/quote}  

  Спасибо. Но нужно чтобы он выделял ячейки с Р4 до Р16, а в этом макросе он вставляет в свободную ячейку надпись Всё заполнено!!!. Т.к. данные в эти ячейка вставляются тоже через макрос а не в ручную.  
Спасибо.{/post}{/quote}  

  Попробую так:  

  Sub tt()  
On Error Resume Next  
Err.Clear  
Range(«P4:P15»).SpecialCells(xlCellTypeBlanks).Cells(1).Select  
If Err <> 0 Then MsgBox «Всё заполнено!!!»  
Err.Clear  
End Sub{/post}{/quote}  

    Опа. Заработало. Спасибо всем!!!

 

Убрал лишнее и оставил только это:  
 Range(«P4:P16»).SpecialCells(xlCellTypeBlanks).Cells(1).Select

 

Hugo

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

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

On Error Resume Next всёж оставьте :)

 

Станислав

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

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

{quote}{login=Hugo}{date=25.12.2011 02:29}{thema=}{post}On Error Resume Next всёж оставьте :){/post}{/quote}  

  Спасибо.

 

А не подскажите ли вы, мне нужно нечто похожее, как выбирать каждую ячейку первого столбца, пока не наткнешься на пустую, естественно после выбора будет какое-либо действие, и это вроде как должно выполняться через цикл, если я правильно понимаю… помогите пожалуйста

 

KuklP

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

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

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

floove, Вы демонстрируете недюжинную сообразительность. Тема называется «Поиск первой свободной ячейки в стообце». Все ответы посвящены этому. И тут появляетесь Вы и задаете вопрос: «А как найти первую свободную ячейку в столбце?». Браво!

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

 

Hugo

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

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

#30

28.12.2011 01:39:16

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

21 / 21 / 6

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

Сообщений: 677

1

Узнать первую пустую ячейку

10.09.2015, 08:34. Показов 25448. Ответов 4


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

Здравствуйте. Подскажите пожалуйста, у меня есть лист, на котором в некотором месте есть таблица. Дело в том что я через макрос провожу некоторую манипуляцию в таблице — тем самым удаляю в ней ненужные строки. Как мне можно узнать, где заканчивается данная таблица? По первой пустой ячейке? Через цикл? Или есть какой-то другое более лучший способ (может функция специальная или ещё что)? Как это написать на VBA?



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

10.09.2015, 08:34

4

Tolyn

8 / 8 / 6

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

Сообщений: 16

10.09.2015, 09:24

3

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

Решение

Я всегда делал по первой пустой ячейке

Visual Basic
1
2
3
4
Do While Cells(i, 1) <> "" 'выполняем пока не появится пустая строка
' Какие то манипуляции с таблицей
    i = i + 1
Loop



1



smmkp

1 / 1 / 0

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

Сообщений: 5

10.09.2015, 10:05

4

Если таблица одна и нужно узнать где она заканчивается, то я пользуюсь этим:

Visual Basic
1
2
LastRow = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row
LastColumn = Sheets("Лист1").Cells(1, Columns.Count).End(xlToLeft).Column



1



сороконожка

15 / 15 / 5

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

Сообщений: 117

11.09.2015, 13:40

5

Visual Basic
1
Range("A2:A" & Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row

первая пустая в колонке А.

Границы коментом выше.



0



Re:Я Дата: Понедельник, 27.06.2016, 10:43 | Сообщение № 7

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Макрос7()
Dim a, b, c, d, e, iLastrow As Long, i As Long, ii As Long

‘1. данные в два массива
With Лист2 ‘используется кодовое имя
iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row
a = Range(.[c3], .Range(«C» & iLastrow)).Value
End With

With Лист3 ‘используется кодовое имя
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
b = Range(.[k19], .Range(«C» & iLastrow)).Value
End With

‘2.пустой массив для результата
ReDim c(1 To UBound(a), 1 To 9)

‘3.в словарь уникальные и номер строки из массива
For i = 1 To UBound(b)
.Item(b(i, 1)) = i
Next

‘4.по словарю из массива b в массив c
For i = 1 To UBound(a)
If .exists(a(i, 1)) Then
c(i, 1) = b(.Item(a(i, 1)), 9)
End If
Next
End With

‘5. выгрузка всего массива
With Лист2 ‘используется кодовое имя
.[K3].Resize(UBound(c), 1) = c
.Activate
End With
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Макрос7()
Dim a, b, c, d, e, iLastrow As Long, i As Long, ii As Long

‘1. данные в два массива
With Лист2 ‘используется кодовое имя
iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row
a = Range(.[c3], .Range(«C» & iLastrow)).Value
End With

With Лист3 ‘используется кодовое имя
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
b = Range(.[k19], .Range(«C» & iLastrow)).Value
End With

‘2.пустой массив для результата
ReDim c(1 To UBound(a), 1 To 9)

‘3.в словарь уникальные и номер строки из массива
For i = 1 To UBound(b)
.Item(b(i, 1)) = i
Next

‘4.по словарю из массива b в массив c
For i = 1 To UBound(a)
If .exists(a(i, 1)) Then
c(i, 1) = b(.Item(a(i, 1)), 9)
End If
Next
End With

‘5. выгрузка всего массива
With Лист2 ‘используется кодовое имя
.[K3].Resize(UBound(c), 1) = c
.Activate
End With
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Макрос7()
Dim a, b, c, d, e, iLastrow As Long, i As Long, ii As Long

‘1. данные в два массива
With Лист2 ‘используется кодовое имя
iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row
a = Range(.[c3], .Range(«C» & iLastrow)).Value
End With

With Лист3 ‘используется кодовое имя
iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
b = Range(.[k19], .Range(«C» & iLastrow)).Value
End With

‘2.пустой массив для результата
ReDim c(1 To UBound(a), 1 To 9)

‘3.в словарь уникальные и номер строки из массива
For i = 1 To UBound(b)
.Item(b(i, 1)) = i
Next

‘4.по словарю из массива b в массив c
For i = 1 To UBound(a)
If .exists(a(i, 1)) Then
c(i, 1) = b(.Item(a(i, 1)), 9)
End If
Next
End With

‘5. выгрузка всего массива
With Лист2 ‘используется кодовое имя
.[K3].Resize(UBound(c), 1) = c
.Activate
End With
End Sub

Источник

Vba excel найти первую пустую ячейку

Всем доброго времени суток!

Я пытаюсь изучить Ексель и VBA(надеюсь я пишу в правильный раздел).
«Удивительно, но подсел немного»

Задача:
После выполнения макроса нужно чтобы выбиралась ячейка в столбце А первая пустая(после таблицы).
Для определения ее использую переменную.
Думаю что проблема в этом.

З.Ы. посмотрите код может кто увидит еще косяки.

PPS. В файле таблицы исходники до выполнения макроса.

Всем доброго времени суток!

Я пытаюсь изучить Ексель и VBA(надеюсь я пишу в правильный раздел).
«Удивительно, но подсел немного»

Задача:
После выполнения макроса нужно чтобы выбиралась ячейка в столбце А первая пустая(после таблицы).
Для определения ее использую переменную.
Думаю что проблема в этом.

З.Ы. посмотрите код может кто увидит еще косяки.

PPS. В файле таблицы исходники до выполнения макроса. mikaelw

Сообщение Всем доброго времени суток!

Я пытаюсь изучить Ексель и VBA(надеюсь я пишу в правильный раздел).
«Удивительно, но подсел немного»

Задача:
После выполнения макроса нужно чтобы выбиралась ячейка в столбце А первая пустая(после таблицы).
Для определения ее использую переменную.
Думаю что проблема в этом.

З.Ы. посмотрите код может кто увидит еще косяки.

PPS. В файле таблицы исходники до выполнения макроса. Автор — mikaelw
Дата добавления — 16.09.2014 в 16:24

alex1248 Дата: Вторник, 16.09.2014, 16:57 | Сообщение № 2
skype alex12481632
Qiwi +79276708519

Ответить

mikaelw Дата: Вторник, 16.09.2014, 17:13 | Сообщение № 3

Спасибо, но нужно выбирать именно 1-ую, тк итоги подведенные не нужно
следовательно: Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select

И вопрос все-таки в начало

В модуле пишу отформатировать ячейки диапазона от B2 до конца таблицы(в данном случае B41)

ActiveSheet.Range(«B2:B» & lLastRow).WrapText = True

а по факту форматирует на диапазоне B2:B46..

Спасибо, но нужно выбирать именно 1-ую, тк итоги подведенные не нужно
следовательно: Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select

И вопрос все-таки в начало

В модуле пишу отформатировать ячейки диапазона от B2 до конца таблицы(в данном случае B41)

ActiveSheet.Range(«B2:B» & lLastRow).WrapText = True

а по факту форматирует на диапазоне B2:B46..

Спасибо, но нужно выбирать именно 1-ую, тк итоги подведенные не нужно
следовательно: Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select

И вопрос все-таки в начало

В модуле пишу отформатировать ячейки диапазона от B2 до конца таблицы(в данном случае B41)

ActiveSheet.Range(«B2:B» & lLastRow).WrapText = True

а по факту форматирует на диапазоне B2:B46..

почему? Автор — mikaelw
Дата добавления — 16.09.2014 в 17:13

alex1248 Дата: Вторник, 16.09.2014, 17:28 | Сообщение № 4

skype alex12481632
Qiwi +79276708519

mikaelw Дата: Вторник, 16.09.2014, 17:39 | Сообщение № 5

Теперь он концом таблицы считает конец листа.

На команду
MsgBox (lLastRow)

выдает значение 65536(обрабатываю другой файл xls)

Теперь он концом таблицы считает конец листа.

На команду
MsgBox (lLastRow)

выдает значение 65536(обрабатываю другой файл xls)

Теперь он концом таблицы считает конец листа.

На команду
MsgBox (lLastRow)

выдает значение 65536(обрабатываю другой файл xls)

почему? Автор — mikaelw
Дата добавления — 16.09.2014 в 17:39

alex1248 Дата: Вторник, 16.09.2014, 17:46 | Сообщение № 6

Странно, у меня в окне Immediate при активном Sheet1 (2) выдает
? Cells(Rows.Count, 1).End(xlUp).Row
41

Посмотрю еще не спеша.

P.S. И MsgBox lLastRow только что попробовал, тоже 41 выдало, правда, на следующем листе.

Странно, у меня в окне Immediate при активном Sheet1 (2) выдает
? Cells(Rows.Count, 1).End(xlUp).Row
41

Посмотрю еще не спеша.

P.S. И MsgBox lLastRow только что попробовал, тоже 41 выдало, правда, на следующем листе. alex1248

skype alex12481632
Qiwi +79276708519

Сообщение Странно, у меня в окне Immediate при активном Sheet1 (2) выдает
? Cells(Rows.Count, 1).End(xlUp).Row
41

Посмотрю еще не спеша.

P.S. И MsgBox lLastRow только что попробовал, тоже 41 выдало, правда, на следующем листе. Автор — alex1248
Дата добавления — 16.09.2014 в 17:46

alex1248 Дата: Вторник, 16.09.2014, 17:52 | Сообщение № 7
skype alex12481632
Qiwi +79276708519

Ответить

mikaelw Дата: Вторник, 16.09.2014, 18:03 | Сообщение № 8

Я MsgBox прямо в модуль после получения переменных добавил.
Новый файл

Я MsgBox прямо в модуль после получения переменных добавил.
Новый файл mikaelw

Я MsgBox прямо в модуль после получения переменных добавил.
Новый файл Автор — mikaelw
Дата добавления — 16.09.2014 в 18:03

mikaelw Дата: Вторник, 16.09.2014, 18:08 | Сообщение № 9

Перезапуск Екселя решил проблему!

Перезапуск Екселя решил проблему! mikaelw

Перезапуск Екселя решил проблему! Автор — mikaelw
Дата добавления — 16.09.2014 в 18:08

alex1248 Дата: Вторник, 16.09.2014, 18:10 | Сообщение № 10

Я MsgBox прямо в модуль после получения переменных добавил.

И что у вас получилось?
У меня вышли сообщения 41 и 1.

Ну всё, разобрались?

Я MsgBox прямо в модуль после получения переменных добавил.

И что у вас получилось?
У меня вышли сообщения 41 и 1.

Ну всё, разобрались? alex1248

skype alex12481632
Qiwi +79276708519

Я MsgBox прямо в модуль после получения переменных добавил.

И что у вас получилось?
У меня вышли сообщения 41 и 1.

Ну всё, разобрались? Автор — alex1248
Дата добавления — 16.09.2014 в 18:10

Gustav Дата: Вторник, 16.09.2014, 18:44 | Сообщение № 11
_Boroda_ Дата: Вторник, 16.09.2014, 18:53 | Сообщение № 12

Ответить

mikaelw Дата: Вторник, 16.09.2014, 21:19 | Сообщение № 13

alex1248, за решение проблемы.
Gustav, за совет, что удивительно сегодня Walkenbach а именно про это читал.

_Boroda_ за ответ на вопрос почему?

alex1248, за решение проблемы.
Gustav, за совет, что удивительно сегодня Walkenbach а именно про это читал.

_Boroda_ за ответ на вопрос почему? mikaelw

Сообщение Спасибо всем!

alex1248, за решение проблемы.
Gustav, за совет, что удивительно сегодня Walkenbach а именно про это читал.

_Boroda_ за ответ на вопрос почему? Автор — mikaelw
Дата добавления — 16.09.2014 в 21:19

Alex_ST Дата: Среда, 17.09.2014, 08:55 | Сообщение № 14

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
‘ http://msoffice.nm.ru/article/lastcell.htm — «Поиск последней заполненной ячейки»
Private Sub LAST_CELL() ‘ последняя ячейка используемого диапазона на листе
Dim sLastAddr$, lLastRow&, iLastCol%
‘With Sheets(«Лист1»)
With ActiveSheet
‘МЕТОД 1: правильно работает в большинстве случаев
‘игнорируются скрытые строки/столбцы (шириной/высотой, группировкой, фильтром …)
lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
‘lLastRow = .Cells(.Rows.Count, «A»).End(xlUp).Row
‘lLastRow = .Range(«A» & Rows.Count).End(xlUp).Row
iLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
sLastAddr = .Cells(.Rows.Count, 1).End(xlUp).Address
‘sLastAddr = .Cells(.Rows.Count, «A»).End(xlUp).Address
‘Arr = Range(«A1:A» & Cells(Rows.Count, «C»).End(xlUp).Row).Value

lLastRow = .Cells(5, 2).End(xlDown).Row ‘ последняя заполненная ячейка в столбце В, начиная с 5-й строки

‘МЕТОД 2: МОЖЕТ СЧИТАТЬ НЕ ВЕРНО после удаления последней ячейки, _
а также может учесть пустую, но форматированную ячейку (заливка, границы, УФ, …)
‘правильно работает в только что созданном документе, _
в котором только добавляются данные в строки/столбцы
lLastRow = .Cells.SpecialCells(xlLastCell).Row
iLastCol = .Cells.SpecialCells(xlLastCell).Column
sLastAddr = .Cells.SpecialCells(xlLastCell).Address

‘МЕТОД 3: те же недостатки, что и у метода 2… Но т.к. есть обращение к UsedRange, то считает верно!
lLastRow = .UsedRange.Row + .UsedRange.Rows.Count — 1
iLastCol = .UsedRange.Column + .UsedRange.Columns.Count — 1

‘.
‘ Восстановить правильное положение последней ячейки можно, просто обратившись к UsedRange:
With .UsedRange: End With
‘или так:
lLastRow = .UsedRange.Cells.SpecialCells(xlLastCell).Row
iLastCol = .UsedRange.Cells.SpecialCells(xlLastCell).Column
sLastAddr = .UsedRange.Cells.SpecialCells(xlLastCell).Address

End With
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
‘ http://msoffice.nm.ru/article/lastcell.htm — «Поиск последней заполненной ячейки»
Private Sub LAST_CELL() ‘ последняя ячейка используемого диапазона на листе
Dim sLastAddr$, lLastRow&, iLastCol%
‘With Sheets(«Лист1»)
With ActiveSheet
‘МЕТОД 1: правильно работает в большинстве случаев
‘игнорируются скрытые строки/столбцы (шириной/высотой, группировкой, фильтром …)
lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
‘lLastRow = .Cells(.Rows.Count, «A»).End(xlUp).Row
‘lLastRow = .Range(«A» & Rows.Count).End(xlUp).Row
iLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
sLastAddr = .Cells(.Rows.Count, 1).End(xlUp).Address
‘sLastAddr = .Cells(.Rows.Count, «A»).End(xlUp).Address
‘Arr = Range(«A1:A» & Cells(Rows.Count, «C»).End(xlUp).Row).Value

lLastRow = .Cells(5, 2).End(xlDown).Row ‘ последняя заполненная ячейка в столбце В, начиная с 5-й строки

‘МЕТОД 2: МОЖЕТ СЧИТАТЬ НЕ ВЕРНО после удаления последней ячейки, _
а также может учесть пустую, но форматированную ячейку (заливка, границы, УФ, …)
‘правильно работает в только что созданном документе, _
в котором только добавляются данные в строки/столбцы
lLastRow = .Cells.SpecialCells(xlLastCell).Row
iLastCol = .Cells.SpecialCells(xlLastCell).Column
sLastAddr = .Cells.SpecialCells(xlLastCell).Address

‘МЕТОД 3: те же недостатки, что и у метода 2… Но т.к. есть обращение к UsedRange, то считает верно!
lLastRow = .UsedRange.Row + .UsedRange.Rows.Count — 1
iLastCol = .UsedRange.Column + .UsedRange.Columns.Count — 1

‘.
‘ Восстановить правильное положение последней ячейки можно, просто обратившись к UsedRange:
With .UsedRange: End With
‘или так:
lLastRow = .UsedRange.Cells.SpecialCells(xlLastCell).Row
iLastCol = .UsedRange.Cells.SpecialCells(xlLastCell).Column
sLastAddr = .UsedRange.Cells.SpecialCells(xlLastCell).Address

End With
End Sub


С уважением,
Алексей
MS Excel 2003 — the best.

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
‘ http://msoffice.nm.ru/article/lastcell.htm — «Поиск последней заполненной ячейки»
Private Sub LAST_CELL() ‘ последняя ячейка используемого диапазона на листе
Dim sLastAddr$, lLastRow&, iLastCol%
‘With Sheets(«Лист1»)
With ActiveSheet
‘МЕТОД 1: правильно работает в большинстве случаев
‘игнорируются скрытые строки/столбцы (шириной/высотой, группировкой, фильтром …)
lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
‘lLastRow = .Cells(.Rows.Count, «A»).End(xlUp).Row
‘lLastRow = .Range(«A» & Rows.Count).End(xlUp).Row
iLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
sLastAddr = .Cells(.Rows.Count, 1).End(xlUp).Address
‘sLastAddr = .Cells(.Rows.Count, «A»).End(xlUp).Address
‘Arr = Range(«A1:A» & Cells(Rows.Count, «C»).End(xlUp).Row).Value

lLastRow = .Cells(5, 2).End(xlDown).Row ‘ последняя заполненная ячейка в столбце В, начиная с 5-й строки

Источник

Adblock
detector

Выбрать первую пустую ячейку после таблицы

mikaelw

Дата: Вторник, 16.09.2014, 16:24 |
Сообщение № 1

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

Всем доброго времени суток!

Я пытаюсь изучить Ексель и VBA(надеюсь я пишу в правильный раздел).
«Удивительно, но подсел немного»

Прилагаю файл.

Задача:
После выполнения макроса нужно чтобы выбиралась ячейка в столбце А первая пустая(после таблицы).
Для определения ее использую переменную.
Думаю что проблема в этом.

З.Ы. посмотрите код может кто увидит еще косяки.

PPS. В файле таблицы исходники до выполнения макроса.

 

Ответить

alex1248

Дата: Вторник, 16.09.2014, 16:57 |
Сообщение № 2

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

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

Сообщений: 384


Репутация:

71

±

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


Excel 2007, 2010

mikaelw, наверное, так.
Только выбирается не первая пустая, а вторая, поскольку в первой в столбцах правее есть значения.


skype alex12481632
Qiwi +79276708519

 

Ответить

mikaelw

Дата: Вторник, 16.09.2014, 17:13 |
Сообщение № 3

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

Воп

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

Спасибо, но нужно выбирать именно 1-ую, тк итоги подведенные не нужно
следовательно: Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select

И вопрос все-таки в начало

В модуле пишу отформатировать ячейки диапазона от B2 до конца таблицы(в данном случае B41)

ActiveSheet.Range(«B2:B» & lLastRow).WrapText = True

а по факту форматирует на диапазоне B2:B46..

почему?

 

Ответить

alex1248

Дата: Вторник, 16.09.2014, 17:28 |
Сообщение № 4

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

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

Сообщений: 384


Репутация:

71

±

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


Excel 2007, 2010

mikaelw, попробуйте lLastRow рассчитывать таким образом:
[vba]

Код

lLastRow = Cells(Rows.Count, 1).End(xlUp).Row

[/vba]


skype alex12481632
Qiwi +79276708519

Сообщение отредактировал alex1248Вторник, 16.09.2014, 17:29

 

Ответить

mikaelw

Дата: Вторник, 16.09.2014, 17:39 |
Сообщение № 5

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

lLastRow = Cells(Rows.Count, 1).End(xlUp).Row

Теперь он концом таблицы считает конец листа.

На команду
MsgBox (lLastRow)

выдает значение 65536(обрабатываю другой файл xls)

почему?

 

Ответить

alex1248

Дата: Вторник, 16.09.2014, 17:46 |
Сообщение № 6

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

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

Сообщений: 384


Репутация:

71

±

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


Excel 2007, 2010

Странно, у меня в окне Immediate при активном Sheet1 (2) выдает
? Cells(Rows.Count, 1).End(xlUp).Row
41

Посмотрю еще не спеша. <_<

P.S. И MsgBox lLastRow только что попробовал, тоже 41 выдало, правда, на следующем листе.


skype alex12481632
Qiwi +79276708519

Сообщение отредактировал alex1248Вторник, 16.09.2014, 17:47

 

Ответить

alex1248

Дата: Вторник, 16.09.2014, 17:52 |
Сообщение № 7

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

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

Сообщений: 384


Репутация:

71

±

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


Excel 2007, 2010

Вот файл с макросом, 1-й лист обработан. Вроде, всё верно.


skype alex12481632
Qiwi +79276708519

 

Ответить

mikaelw

Дата: Вторник, 16.09.2014, 18:03 |
Сообщение № 8

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

странно!

Я MsgBox прямо в модуль после получения переменных добавил.
Новый файл

 

Ответить

mikaelw

Дата: Вторник, 16.09.2014, 18:08 |
Сообщение № 9

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

Вот файл с макросом, 1-й лист обработан. Вроде, всё верно.
К сообщению приложен файл: 16092011622-112.xlsm(53Kb)

Перезапуск Екселя решил проблему!

 

Ответить

alex1248

Дата: Вторник, 16.09.2014, 18:10 |
Сообщение № 10

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

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

Сообщений: 384


Репутация:

71

±

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


Excel 2007, 2010

странно!

Я MsgBox прямо в модуль после получения переменных добавил.

И что у вас получилось?
У меня вышли сообщения 41 и 1.

Ну всё, разобрались?


skype alex12481632
Qiwi +79276708519

Сообщение отредактировал alex1248Вторник, 16.09.2014, 18:11

 

Ответить

Gustav

Дата: Вторник, 16.09.2014, 18:44 |
Сообщение № 11

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

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


начинал с Excel 4.0, видел 2.1

Спасибо, но нужно выбирать именно 1-ую, тк итоги подведенные не нужно
следовательно: Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select

На заметку на будущее. Вместо:
[vba]

Код

Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1)

[/vba]
с тем же эффектом, но гораздо прозрачнее:
[vba]

Код

Cells(Rows.Count, 1).End(xlUp).Offset(1)

[/vba]
или
[vba]

Код

Cells(Rows.Count, «A»).End(xlUp).Offset(1)

[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал GustavВторник, 16.09.2014, 18:48

 

Ответить

_Boroda_

Дата: Вторник, 16.09.2014, 18:53 |
Сообщение № 12

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

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


2003; 2007; 2010; 2013 RUS

а по факту форматирует на диапазоне B2:B46..
почему?

Дело в том, что Вы поудаляли перед этим несколько строк. До удаления сочетание Контрл Енд (это Ваш xlLastCell) выделяло Вам ячейку Т46. После удаления строк все равно Контрл Енд будет выдавать Вам Т46. До того момента, пока Вы не обновите информацию файла о самом себе. Например

Перезапуск Екселя решил проблему!

А проще в коде перед строкой
lLastRow = …
написать строку
[vba][/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

mikaelw

Дата: Вторник, 16.09.2014, 21:19 |
Сообщение № 13

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

Спасибо всем!

alex1248, за решение проблемы.
Gustav, за совет, что удивительно сегодня Walkenbach а именно про это читал…

_Boroda_ за ответ на вопрос почему?

 

Ответить

Alex_ST

Дата: Среда, 17.09.2014, 08:55 |
Сообщение № 14

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

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


2003

Для себя когда-то сделал шпаргалку с разными методами:
До сих пор иногда пользуюсь :)
(Прошу прощения, что не по примеру топик-стартера. У меня с работы собаки-сисадмины скачивание файлов с макросами запретили :( killed )



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STСреда, 17.09.2014, 09:00

 

Ответить

Хитрости »

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


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

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

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

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

  • Способ 1:

    Определение

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

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

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

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

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

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

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

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

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

    Нюансы:

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

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


    Способ 2:

    Определение

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

    через SpecialCells

        lLastRow = Cells.SpecialCells(xlLastCell).Row

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

        lLastCol = Cells.SpecialCells(xlLastCell).Column

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

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

      With ActiveSheet.UsedRange: End With

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

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

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


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

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

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

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

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

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

    Нюансы:

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

    

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

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