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

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

27.1k5 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.4k12 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 😀
– 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

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

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

Содержание

  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. Введите или вставьте код.

#vba #excel #loops

#vba #excel #циклы

Вопрос:

Я переформатировал диапазон Sheets("Records") в рабочей книге как a Table (named "RecordsTable") , чтобы упростить выполнение INDEX(MATCH,MATCH) функций для создания отчетов…. но теперь я испортил свою процедуру цикла для заполнения этого диапазона с момента ввода Sheets("FORM") .

Раньше это было:

 Set r = Sheets("Records").Range(A amp; Rows.Count).End(x1Up).Offset(1, 0)

i = 0

   For Each c In Range("dataRange")              
   'dataRange is a list of cells to reference from the FORM input sheet

   r.Offset(0, i).Value = Worksheets("FORM").Range(c)
   i = i   1
Next
  

Однако этот код теперь выбирает первую строку в КОНЦЕ "RecordsTable" (строка 501, поскольку я определил 500 строк в моей таблице) и вставляет туда данные.

Я попытался изменить его на это:

 Set r = Sheets("Records").ListObjects("RecordsTable").DataBodyRange("A" amp; Rows.Count).End(x1Up).Offset(1, 0)

i = 0

   For Each c In Range("dataRange")              

   r.Offset(0, i).Value = Worksheets("FORM").Range(c)
   i = i   1
Next
  

Но этот код по-прежнему выбирает строку 501 и делает эту строку частью "RecordsTable" .
Как я могу правильно Set "r" to = использовать первую пустую строку в "RecordsTable" ?

Для справки, Column "A" in "RecordsTable" имеет заголовок [INV #] . Кроме того, когда я перехожу в "Set r = ..." строку, Rows.Count возвращается значение более 1 миллиона (т. Е. Общее количество строк на листе) — если я правильно понимаю, я хочу, чтобы оно возвращало значение 500 (т. Е. Общее количество строк в таблице) — это правильно?

Редактировать

"dataRange" это список ссылок на ячейки с одним столбцом (у меня они помечены в столбце B, как предлагает @chrisneilsen:

A

J6

Y6

J8

J10

Y8

и т.д.

Это ячейки Sheets("FORM") , из которых мне нужно извлекать данные и заполнять их в моей таблице в порядке, указанном в "dataRange" .

Комментарии:

1. Очень быстрое предложение: посмотрите, как вы разместили рабочий лист перед использованием ListObjects ? Делайте это каждый раз, когда вы используете Range() , Cells() , и т.д. Rows.Count Это подскажет VBA, с какого листа получать эту информацию. В противном случае он использует ActiveSheet , и это может привести к неожиданным результатам.

2. @BruceWayne ^^ Спасибо

Ответ №1:

Предполагая, что у вас действительно есть таблица, добавьте данные в таблицу (ListObject), используя ее свойства и методы:

 Sub Demo()
    Dim lo As ListObject
    Dim c As Range

    Set lo = Worksheets("Records").ListObjects("RecordsTable")

    For Each c In Sheets("V").Range("dataRange")
        If Not lo.InsertRowRange Is Nothing Then
            lo.InsertRowRange.Cells(1, 1) = Sheets("FORM").Range(c)
        Else
            lo.ListRows.Add.Range.Cells(1, 1) = Sheets("FORM").Range(c)
        End If
    Next
End Sub
  

Примечание: зацикливание диапазона на листе V и использование его в качестве указателя на данные на листе FORM , скопированные из вашего ответа — я предполагаю, что вы знаете, что вы здесь делаете

На основе комментария OP, добавление данных в одну новую строку

 Sub Demo()
    Dim lo As ListObject
    Dim c As Range, TableRange As Range
    Dim i As Long

    Set lo = Worksheetsheets("Records").ListObjects("RecordsTable")

    If Not lo.InsertRowRange Is Nothing Then
        Set TableRange = lo.InsertRowRange
    Else
        Set TableRange = lo.ListRows.Add.Range
    End If
    i = 1
    For Each c In Sheets("V").Range("dataRange")
        TableRange.Cells(1, i) = Sheets("FORM").Range(c)
        i = i   1
    Next
End Sub
  

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

Как упоминалось в обновленном OP, если метки столбцов находятся в следующем столбце, замените For цикл этим (и добавьте Dim r as Range, col as long в объявления)

     For Each c In Sheets("V").Range("dataRange")
        If Not c = vbNullString Then
            Set r = Worksheets("FORM").Range(c.Value)
            col = lo.ListColumns(c.Offset(, 1).Value).Index
            TableRange.Cells(1, col) = r.Value
        End If
    Next
  

Комментарии:

1. Спасибо. Я попытался использовать это, и он правильно добавляет строку в таблицу и начинает ввод данных в первом столбце, но последующие итерации продолжают добавлять данные в первый столбец, следующую доступную строку. У меня определено 40 ячеек dataRange , и мне нужно, чтобы каждая из них переходила в следующий столбец после предыдущего.

2. Хорошо, это новая информация. Итак, вы хотите добавить только одну новую строку и вставить все данные в эту строку? См . Обновление

3. Спасибо, Крис. Я пытался решить это с тех пор, как вы опубликовали, и это обновление помогает. Тем не менее, он по-прежнему выдает мне «ошибку, определяемую приложением или объектом» TableRange.Cells(1, i) = Sheets("FORM").Range(c) .

4. Основываясь на вашем коде = Sheets("FORM").Range(c) , я предполагаю dataRange , что это список адресов на листе FROM . Это правильно? Если значение c не является допустимым адресом (например C10') that will cause an error. can you post (edit your Q) some sample data for both , recordsTable` и dataRange

5. Вопрос обновлен, как и было запрошено. Надеюсь, это то, что вы искали.

Вопрос:

Мне нужно найти первую пустую строку в книге и записать информацию в (строка, 1) и (строка, 2). Я думаю, что я в настоящее время довольно застрял…

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

Большое спасибо за любую помощь.

Лучший ответ:

Если вы имеете в виду номер строки после последней используемой строки, вы можете найти ее следующим образом:

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

Если вы имеете в виду строку, которая после этого становится пустой с данными после нее… она становится более сложной.

Здесь написана функция, которая даст вам фактический номер строки первой строки, пустой для предоставленного рабочего листа.

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

Пример использования: firstblankRow(thisworkbook.Sheets(1)) или передать любой рабочий лист.

Изменить: как указывалось Ooo, это будет ошибка, если в используемом диапазоне нет пустых ячеек.

Ответ №1

Я бы сделал это так. Коротко и ясно:)

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

Обновлен, чтобы проверить, пуста ли первая строка.

Изменить: обновить, чтобы включить проверку, если целая строка пуста

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

Ответ №2

Обновление

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

    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

Оригинальный ответ

Чтобы найти первый пробел в листе, замените эту часть вашего кода:

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 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 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

Ответ №3

Я знаю, что это старый поток, но мне нужно написать функцию, которая вернула первую пустую строку WITHIN диапазона. Весь код, который я нашел в Интернете, фактически просматривает всю строку (даже ячейки вне диапазона) для пустой строки. Данные в диапазонах вне диапазона поиска запускали использованную строку. Это казалось мне простым решением:

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

Ответ №4

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

Ответ №5

очень старая нить, но.. я искал “более легкий”… меньший код

Я честно не понимаю ни одного из ответов выше: D
– i’m a noob

но это должно выполнить эту работу. (для небольших листов)

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

читает каждую ячейку в столбце 1 снизу вверх и останавливается в первой пустой ячейке

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

тогда вы можете написать свою информацию следующим образом

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

и т.д.

а затем я узнаю его поток vba… lol

Ответ №6

Очень старая нить, но проще взять:)

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

Ответ №7

Функция firstBlankRow() как долго
  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

Конечная функция

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

Эти макросы используют элемент 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

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

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