На чтение 4 мин. Просмотров 10.9k.
Что делает макрос: Вы часто можете столкнуться с необходимостью добавить строки или столбцы к существующему набору данных. Этот макрос позволяет автоматически найти и выбрать первую пустую строку или столбец. Он предназначен для использования в сочетании с другими макрокомандами.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
Эти макросы используют элемент 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 первый объявляет переменную Long Integer под названием LastRow — держатель номера строки последней использованной строки.
- На шаге 2 мы фиксируем последнюю использованную строку, начиная с самой последней строки в листе и используя свойство End, чтобы перейти к первой непустой ячейке (переход к ячейке A1048576 нажатием Ctrl + Shift + стрелка вверх на клавиатуре).
- На этом этапе мы используем свойство 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
Как этот код работает
- Сначала мы объявляем переменную Long Integer под названием LastColumn — держатель номера столбца последнего используемого столбца.
- На шаге 2 мы фиксируем последний используемый столбец, начиная с самого последнего столбца в листе и используя свойство End, чтобы перейти к первой непустой колонке
(эквивалент перейти к ячейке XFD5, нажав Ctrl + Shift + стрелка влево на клавиатуре). - На этом этапе мы используем свойство Offset для перемещения на одну колонку и выбираем первый пустой столбец в строке 5.
Как использовать
Вы можете реализовать эти макросы, вставив их в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
Вы часто можете столкнуться с необходимостью добавить строки или столбцы к существующему набору данных. Этот макрос позволяет автоматически найти и выбрать первую пустую строку или столбец. Он предназначен для использования в сочетании с другими макрокомандами.
Эти макросы используют элемент 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