Vba excel как найти пустую строку

Михаил, гляньте, как это делается в макросе удаления пустых строк:  
Sub DeleteEmptyRows()  
  ‘—————————————————————————————  
  ‘ Procedure    : DeleteEmptyRows  
  ‘ Author       : The_Prist???  
  ‘ Topic_HEADER : Удаление всех пустых строк в таблице  
  ‘ Topic_URL    :

http://www.planetaexcel.ru/tip.php?aid=31  

  ‘ Post_Author  :  
  ‘ Post_URL     :  
  ‘ DateTime     : 10.09.2006  
  ‘ Purpose      : Удаление всех пустых строк в таблице  
  ‘ Notes        :  
  ‘—————————————————————————————  
  If MsgBox(«Удалить все пустые строки на листе?», vbOKCancel Or vbQuestion Or vbDefaultButton1, «Удалить пустые строки?») = vbCancel Then Exit Sub  
  Dim lLastRow As Long, i As Long  
  lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count  
  Application.ScreenUpdating = False  
  For i = lLastRow To 1 Step -1  
     If Application.CountA(Rows(i)) = 0 Then Rows(i).Delete  
  Next  
  Application.ScreenUpdating = True  
End Sub

I need to find the first blank row in a workbook and write information to (row, 1) and (row, 2). I think I’m currently pretty stuck…

Function WriteToMaster(num, path) As Boolean

'Declare variables
Dim xlApp As Excel.Application
Dim wb As Workbook
Dim ws As Worksheet
Dim infoLoc As Integer

Set xlApp = New Excel.Application

Set wb = xlApp.Workbooks.Open("PATH OF THE DOC")
Set ws = wb.Worksheets("Sheet1")

'Loop through cells, looking for an empty one, and set that to the Num
Cells(1, 1).Select
For Each Cell In ws.UsedRange.Cells
    If Cell.Value = "" Then Cell = Num
    MsgBox "Checking cell " & Cell & " for value."
Next


'Save, close, and quit
wb.Save
wb.Close
xlApp.Quit

'Resets the variables
Set ws = Nothing
Set wb = Nothing
Set xlApp = Nothing

Thanks so much for any help.

asked Sep 19, 2012 at 15:22

okapishomapi's user avatar

2

If you mean the row number after the last row that is used, you can find it with this:

Dim unusedRow As Long
unusedRow = Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row

If you mean a row that happens to be blank with data after it… it gets more complicated.

Here’s a function I wrote which will give you the actual row number of the first row that is blank for the provided worksheet.

Function firstBlankRow(ws As Worksheet) As Long
'returns the row # of the row after the last used row
'Or the first row with no data in it
    Dim rw As Range
    For Each rw In ws.UsedRange.Rows
        If rw.Address = ws.Range(rw.Address).SpecialCells(xlCellTypeBlanks). _
            Address Then

                firstBlankRow = rw.Row
                Exit For
        End If
    Next
    If firstBlankRow = 0 Then
        firstBlankRow = ws.Cells.SpecialCells(xlCellTypeLastCell). _
                    Offset(1, 0).Row
    End If
End Function

Usage example: firstblankRow(thisworkbook.Sheets(1)) or pass any worksheet.

Edit: As ooo pointed out, this will error if there are no blank cells in your used range.

answered Sep 19, 2012 at 15:35

Daniel's user avatar

DanielDaniel

13k2 gold badges36 silver badges60 bronze badges

11

I would have done it like this. Short and sweet :)

Sub test()
Dim rngToSearch As Range
Dim FirstBlankCell As Range
Dim firstEmptyRow As Long

Set rngToSearch = Sheet1.Range("A:A")
    'Check first cell isn't empty
    If IsEmpty(rngToSearch.Cells(1, 1)) Then
        firstEmptyRow = rngToSearch.Cells(1, 1).Row
    Else
        Set FirstBlankCell = rngToSearch.FindNext(After:=rngToSearch.Cells(1, 1))
        If Not FirstBlankCell Is Nothing Then
            firstEmptyRow = FirstBlankCell.Row
        Else
            'no empty cell in range searched
        End If
    End If
End Sub

Updated to check if first row is empty.

Edit: Update to include check if entire row is empty

Option Explicit

Sub test()
Dim rngToSearch As Range
Dim firstblankrownumber As Long

    Set rngToSearch = Sheet1.Range("A1:C200")
    firstblankrownumber = FirstBlankRow(rngToSearch)
    Debug.Print firstblankrownumber

End Sub

Function FirstBlankRow(ByVal rngToSearch As Range, Optional activeCell As Range) As Long
Dim FirstBlankCell As Range

    If activeCell Is Nothing Then Set activeCell = rngToSearch.Cells(1, 1)
    'Check first cell isn't empty
    If WorksheetFunction.CountA(rngToSearch.Cells(1, 1).EntireRow) = 0 Then
        FirstBlankRow = rngToSearch.Cells(1, 1).Row
    Else

        Set FirstBlankCell = rngToSearch.FindNext(After:=activeCell)
        If Not FirstBlankCell Is Nothing Then

            If WorksheetFunction.CountA(FirstBlankCell.EntireRow) = 0 Then
                FirstBlankRow = FirstBlankCell.Row
            Else
                Set activeCell = FirstBlankCell
                FirstBlankRow = FirstBlankRow(rngToSearch, activeCell)

            End If
        Else
            'no empty cell in range searched
        End If
    End If
End Function

answered Sep 19, 2012 at 16:52

1

Update

Inspired by Daniel’s code above and the fact that this is WAY! more interesting to me now then the actual work I have to do, i created a hopefully full-proof function to find the first blank row in a sheet. Improvements welcome! Otherwise, this is going to my library :)
Hopefully others benefit as well.

    Function firstBlankRow(ws As Worksheet) As Long
'returns the row # of the row after the last used row
'Or the first row with no data in it

    Dim rngSearch As Range, cel As Range

    With ws

        Set rngSearch = .UsedRange.Columns(1).Find("") '-> does blank exist in the first column of usedRange

        If Not rngSearch Is Nothing Then

            Set rngSearch = .UsedRange.Columns(1).SpecialCells(xlCellTypeBlanks)

            For Each cel In rngSearch

                If Application.WorksheetFunction.CountA(cel.EntireRow) = 0 Then

                    firstBlankRow = cel.Row
                    Exit For

                End If

            Next

        Else '-> no blanks in first column of used range

            If Application.WorksheetFunction.CountA(Cells(.Rows.Count, 1).EntireRow) = 0 Then '-> is the last row of the sheet blank?

                '-> yeap!, then no blank rows!
                MsgBox "Whoa! All rows in sheet are used. No blank rows exist!"


            Else

                '-> okay, blank row exists
                firstBlankRow = .UsedRange.SpecialCells(xlCellTypeBlanks).Row + 1

            End If

        End If

    End With

End Function

Original Answer

To find the first blank in a sheet, replace this part of your code:

Cells(1, 1).Select
For Each Cell In ws.UsedRange.Cells
    If Cell.Value = "" Then Cell = Num
    MsgBox "Checking cell " & Cell & " for value."
Next

With this code:

With ws

    Dim rngBlanks As Range, cel As Range

    Set rngBlanks = Intersect(.UsedRange, .Columns(1)).Find("")

    If Not rngBlanks Is Nothing Then '-> make sure blank cell exists in first column of usedrange
        '-> find all blank rows in column A within the used range
        Set rngBlanks = Intersect(.UsedRange, .Columns(1)).SpecialCells(xlCellTypeBlanks)

        For Each cel In rngBlanks '-> loop through blanks in column A

            '-> do a countA on the entire row, if it's 0, there is nothing in the row
            If Application.WorksheetFunction.CountA(cel.EntireRow) = 0 Then
                num = cel.Row
                Exit For
            End If

        Next
    Else

        num = usedRange.SpecialCells(xlCellTypeLastCell).Offset(1).Row                 

    End If


End With

answered Sep 19, 2012 at 15:37

Scott Holtzman's user avatar

Scott HoltzmanScott Holtzman

27k5 gold badges36 silver badges72 bronze badges

11

I know this is an older thread however I needed to write a function that returned the first blank row WITHIN a range. All of the code I found online actually searches the entire row (even the cells outside of the range) for a blank row. Data in ranges outside the search range was triggering a used row. This seemed to me to be a simple solution:

Function FirstBlankRow(ByVal rngToSearch As Range) As Long
   Dim R As Range
   Dim C As Range
   Dim RowIsBlank As Boolean

   For Each R In rngToSearch.Rows
      RowIsBlank = True
      For Each C In R.Cells
         If IsEmpty(C.Value) = False Then RowIsBlank = False
      Next C
      If RowIsBlank Then
         FirstBlankRow = R.Row
         Exit For
      End If
   Next R
End Function

answered Mar 7, 2014 at 17:31

user3393711's user avatar

ActiveSheet.Range("A10000").End(xlup).offset(1,0).Select

SheetJS's user avatar

SheetJS

22.3k12 gold badges64 silver badges75 bronze badges

answered Oct 18, 2013 at 19:24

Josh Z's user avatar

very old thread but .. i was lookin for an «easier»… a smaller code

i honestly dont understand any of the answers above :D
— i´m a noob

but this should do the job. (for smaller sheets)

Set objExcel = CreateObject("Excel.Application")
objExcel.Workbooks.Add

reads every cell in col 1 from bottom up and stops at first empty cell

intRow = 1
Do until objExcel.Cells(intRow, 1).Value = ""
   intRow = intRow + 1
Loop

then you can write your info like this

objExcel.Cells(intRow, 1).Value = "first emtpy row, col 1"
objExcel.Cells(intRow, 2).Value = "first emtpy row, col 2"

etc…

and then i recognize its an vba thread … lol

answered Jul 3, 2014 at 15:43

ultr4low's user avatar

1

Very old thread but a simpler take :)

Sub firstBlank(c) 'as letter
    MsgBox (c & Split(Range(c & ":" & c).Find("", LookIn:=xlValues).address, "$")(2))
End Sub
Sub firstBlank(c) 'as number
    cLet = Split(Cells(1, c).address, "$")(1)
    MsgBox (cLet & Split(Range(cLet & ":" & cLet).Find("", LookIn:=xlValues).address, "$")(2))
End Sub

answered Feb 3, 2017 at 2:22

quantum285's user avatar

quantum285quantum285

1,0322 gold badges11 silver badges22 bronze badges

Function firstBlankRow() As Long
Dim emptyCells As Boolean

    For Each rowinC In Sheet7.Range("A" & currentEmptyRow & ":A5000")   ' (row,col)

        If rowinC.Value = "" Then
            currentEmptyRow = rowinC.row
            'firstBlankRow = rowinC.row 'define class variable to simplify computing complexity for other functions i.e. no need to call function again
            Exit Function   
        End If
    Next

End Function

answered Feb 1, 2018 at 22:15

user8453101's user avatar

Хитрости »

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


Очень часто при внесении данных на лист 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
    ссылки
    статистика

    На чтение 4 мин. Просмотров 11k.

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

    Содержание

    1. Как макрос работает
    2. Код макроса
    3. Как этот код работает
    4. Код макроса
    5. Как этот код работает
    6. Как использовать

    Как макрос работает

    Эти макросы используют элемент Cells и свойство Offset в качестве ключевых инструментов навигации.
    Элемент Cells принадлежит объекту Range. Это дает нам чрезвычайно удобный способ выбора диапазонов с помощью кода. Для этого требуется только относительные строки и столбцы в качестве параметров. Cells(5,4) приводит к строке 5, столбцу 4 (или ячейке D5). Cells(16, 4) приводит к строке 16, столбцу 4 (или ячейке D16).
    Помимо передачи жестких чисел в элемент Cells, вы также можете передавать выражения.
    Cells(Rows.Count, 1) то же самое, что выбрать последнюю строку и первый столбец в таблице. В Excel 2010 переводит к ячейке A1048576.
    Cells(1,Columns.Count) выбирает первую строку и последний столбец в таблице. В Excel 2010 приводит к ячейке XFD1.
    Объединение оператора Cells со свойством End позволяет перейти к последней использованной строке или столбцу. Это утверждение эквивалентно переходит к ячейке A1048576 и нажав Ctrl + Shift + стрелка вверх на клавиатуре. Excel автоматически переходит к последней использованной строки в столбце A.

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

    Переходит к ячейке XFD1 и нажав Ctrl + Shift + стрелка влево на клавиатуре. Это переводит вас к последней использованной колонке в строке 1.

    Cells(1, Columns.Count).End(xlToLeft).Select
    

    Когда вы дойдете до последней строки или столбца, вы сможете использовать свойство Offset для перемещения вниз или к следующей пустой строке или столбцу.
    Свойство Offset использует индекс строки и столбца, чтобы указать изменяющуюся базовую точку.Например, оператор выбирает ячейку А2, так как индекс строки в Offset перемещения строки базовой точки на единицу:

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

    Этот оператор выбирает ячейку С4, и перемещает базовую точку на три строки и два столбца:

    Range("A1").Offset(3, 2).Select
    

    Используя все эти понятия вместе, мы можем создать макрос, который выбирает первую пустую строку или столбец.

    Код макроса

    Sub PervayaPustayaStroka()
    'Шаг 1: Объявляем переменные
    Dim LastRow As Long
    'Шаг 2: Захват последнего использованного номера строки
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    'Шаг 3: Выбираем следующую строку вниз
    Cells(LastRow, 1).Offset(1, 0).Select
    End Sub
    

    Как этот код работает

    1. Шаг 1 первый объявляет переменную Long Integer под названием LastRow — держатель номера строки последней использованной строки.
    2. На шаге 2 мы фиксируем последнюю использованную строку, начиная с самой последней строки в листе и используя свойство End, чтобы перейти к первой непустой ячейке (переход к ячейке A1048576 нажатием Ctrl + Shift + стрелка вверх на клавиатуре).
    3. На этом этапе мы используем свойство Offset для перемещения на одну строку вниз и выбираем первую пустую ячейку в столбце A.

    Код макроса

    Sub PerviiPustoiStolbec()
    'Шаг 1: Объявляем переменные
    Dim LastColumn As Long
    'Шаг 2: захват последнего использованного номера столбца
    LastColumn = Cells(5, Columns.Count).End(xlToLeft).Column
    'шаг 3: выбираем следующий пустой столбец
    Cells(5, LastColumn).Offset(0, 1).Select
    End Sub
    

    Как этот код работает

    1. Сначала мы объявляем переменную Long Integer под названием LastColumn —  держатель номера столбца последнего используемого столбца.
    2. На шаге 2 мы фиксируем последний используемый столбец, начиная с самого последнего столбца в листе и используя свойство End, чтобы перейти к первой непустой колонке
      (эквивалент перейти к ячейке XFD5, нажав Ctrl + Shift + стрелка влево на клавиатуре).
    3. На этом этапе мы используем свойство Offset для перемещения на одну колонку и выбираем первый пустой столбец в строке 5.

    Как использовать

    Вы можете реализовать эти макросы, вставив их в стандартный модуль:

    1. Активируйте редактор Visual Basic, нажав ALT + F11.
    2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
    3. Выберите Insert➜Module.
    4. Введите или вставьте код.

    I have a column A in my sheet like this :

    line 1: hello
    line 2: hello
    line 3:
    line 4: hello
    line 5: 
    line 6: hello
    line 7: 
    line 8: hello
    line 9: hello
    

    I would like to have a function which return for a specific row, the row of the first empty cell starting from the specific row.

    For example :

    If I specify row 1, I would like to get row 3
    If I specify row 6, I would like to get row 7

    Thanks in advance for your help

    Community's user avatar

    asked Feb 19, 2015 at 12:40

    user2443476's user avatar

    2

    How about this? (assumes your data is in column A)

    Function GetNextEmptyCell(sht as worksheet, rw As Long) As Long
        With sht //Change sheet to suit your needs
            GetNextEmptyCell = IIf(IsEmpty(.Range("A" & rw).Offset(1, 0)), rw + 1, .Range("A" & rw).End(xlDown).Row + 1)
        End With
    End Function
    
    Sub Test()
        Debug.Print GetNextEmptyCell(1) // prints 3
        Debug.Print GetNextEmptyCell(4) // prints 5
    End Sub
    

    answered Feb 19, 2015 at 16:22

    Alex P's user avatar

    Alex PAlex P

    12.2k5 gold badges51 silver badges69 bronze badges

    0

    Определение с помощью кода VBA Excel, что диапазон ячеек пуст, то есть, ни одна из ячеек диапазона (строки, столбца) не содержит отображаемого значения.

    Определение пустого диапазона

    Определить в VBA Excel, что диапазон ячеек пуст, можно с помощью функции рабочего листа WorksheetFunction.CountA или свойства диапазона ячеек Range.Text.

    Пример 1

    Определение, что диапазон ячеек пуст, с помощью функции рабочего листа WorksheetFunction.CountA:

    Sub Primer1()

        If WorksheetFunction.CountA(Range(«A1:L8»)) = 0 Then

            MsgBox «Диапазон ячеек ««A1:L8»» пуст»

        Else

            MsgBox «Диапазон ячеек ««A1:L8»» не пуст»

        End If

    End Sub

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

    Пример 2

    Определение, что диапазон ячеек пуст, с помощью свойства Text объекта Range:

    Sub Primer2()

        If Range(«A1:L8»).Text = «» Then

            MsgBox «Диапазон ячеек ««A1:L8»» пуст»

        Else

            MsgBox «Диапазон ячеек ««A1:L8»» не пуст»

        End If

    End Sub

    Свойство Text объекта Range возвратит пустую строку только в том случае, если все ячейки диапазона будут содержать пустые строки и (или) значение Empty. Если одна или более ячеек в диапазоне будут содержать пустую строку, возвращенную формулой, то код второго примера все-равно определит, что диапазон пуст.

    Определение пустой строки

    Определение пустой строки в VBA Excel с помощью свойства Range.Text:

    Sub Primer3()

        If Rows(5).Text = «» Then

            MsgBox «Указанная строка пуста»

        Else

            MsgBox «Указанная строка не пуста»

        End If

    End Sub

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

    Определение пустого столбца

    Определение пустого столбца в VBA Excel с помощью свойства Range.Text:

    Sub Primer4()

        If Columns(7).Text = «» Then

            MsgBox «Указанный столбец пуст»

        Else

            MsgBox «Указанный столбец не пуст»

        End If

    End Sub

    или

    Sub Primer5()

        If Columns(«G»).Text = «» Then

            MsgBox «Указанный столбец пуст»

        Else

            MsgBox «Указанный столбец не пуст»

        End If

    End Sub


    Фразы для контекстного поиска: диапазон пустой, строка пустая, столбец пустой.


    artliker

    1

    28.05.2007, 23:16. Показов 7446. Ответов 4


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

    Совсем простой вопросик от новичка.
    Как в макросе Excel задать поиск первой пустой строки, для того, чтобы туда вставить очередную запись, скопированную из Word-а?

    0 / 0 / 0

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

    Сообщений: 55

    28.05.2007, 23:45

    2

    i = 1
    While Sheets(‘sheet1’).Range(‘a’ + LTrim(Str(i))) <> Empty
    i = i + 1
    Wend
    MsgBox ‘Пустая строка ‘ & i

    Этот пример выдаст номер первой пустой строки по столбцу ‘a’
    Удачи

    URL: www.azbukavb.narod.ru



    0



    artliker

    29.05.2007, 00:24

    3

    а если не только по столбцу ‘а’, а по всем столбцам найти пустую строку?

    VladK

    29.05.2007, 00:28

    4

    Vnachale pritzepi knopku k listu i razbrosanno zapolni yacheyki lyubi’mi znacheniyami. Zatem, vstav’ kod:

    Option Explicit
    Dim LastCol
    Dim LastRow
    Dim iCol
    Dim iRow
    Dim okToInsert

    Private Sub CommandButton1_Click()
    Range(‘A1’).Select
    ActiveCell.SpecialCells(xlLastCell).Select
    LastCol = ActiveCell.Column
    LastRow = ActiveCell.Row

    For iRow = 1 To LastRow
    okToInsert = True
    For iCol = 1 To LastCol
    If Cells(iRow, iCol).Value <> vbNullString Then okToInsert = False
    Next iCol
    If okToInsert = True Then
    ‘Insert whatever you need wherever you want:
    Cells(iRow, 1) = ‘Hurra!!’
    End If
    Next iRow

    End Sub

    VladK

    29.05.2007, 00:34

    5

    Moy primer ischet vse pustie stroki i vstavlyaet text v ih pervuyu kolonku. Ti’ legko moghesh’ ego izmenit’, chtobi’ ostanovit’sya ka tol’ko pervaya netronutaya (chistaya) stroka naydena.

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