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

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

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

Содержание

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

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

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

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

#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. Вопрос обновлен, как и было запрошено. Надеюсь, это то, что вы искали.

Михаил, гляньте, как это делается в макросе удаления пустых строк:  
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

Понравилась статья? Поделить с друзьями:
  • Excel vba найти одинаковые значения в
  • Excel vba объект worksheets
  • Excel vba объект workbook
  • Excel vba найти номер строки по значению
  • Excel vba объект cells