Код VBA для копирования данных из строки 2 в последнюю строку данных на одном листе и вставки в первую пустую строку другого листа - PullRequest
0 голосов
/ 16 октября 2018

Я работаю с несколькими листами в рабочей книге.Каждый лист имеет одинаковую строку заголовка.Я хотел бы написать макрос для копирования диапазона данных из каждого листа (A2: L2 в последнюю строку данных на листе) и вставить его в первую пустую ячейку в столбце A основного листа.

То, что я имею ниже, похоже, не работает.Любая помощь приветствуется.

Dim Lastrow As Integer
Lastrow = ActiveSheet.Cells(Rows.Count,1).End(xlUp).Row

Sheets("Master Sheet").Range("A2:L10000).Clear

Sheets("Sheet1").Activate
Range("A2:L" & Lastrow).Select
Selection.Copy
Sheets("Master Sheet").Select
Range("A30000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1,0).Range("A1").Select
ActiveSheet.Paste

Sheets("Sheet2").Activate
Range("A2:L" & Lastrow).Select
Selection.Copy
Sheets("Master Sheet").Select
Range("A30000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste

1 Ответ

0 голосов
/ 16 октября 2018

Ты почти там, судя по всему.Похоже, вы записали макрос, который является хорошим местом для начала.Причина, по которой ваш конкретный код может не работать, из-за Sheets("Master Sheet").Range("A2:L10000).Clear.Вам не хватает конечной кавычки внутри диапазона.В любом случае, я предпочел пропустить это, чтобы вы случайно не очистили свой лист при перемещении данных по

Так что обычно лучше избегать использования select и activate,но с рекордером вы не можете сказать много по этому вопросу.Ниже вы можете увидеть, как я могу делать операции напрямую с диапазоном.

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

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

Интересно, что когда вы копируете что-то, вам нужно только указать верхнюю левую ячейку изаполню все остальное.Это делает жизнь немного проще, потому что вам не нужно вычислять точные размеры массива, который вы вставляете.Функция Copy в VBA имеет необязательный параметр, называемый Destination, который можно использовать, чтобы указать, куда вы хотите сразу вставить его.

Также полезно полностью указывать диапазоны при их использовании.поэтому вместо Range вы можете увидеть, как я использую ThisWorkbook.Worksheets("Master Sheet").Range.Это говорит компьютеру, где именно вы хотите сослаться;тогда как Range делает компьютер своего рода догадкой, поэтому он предполагает, что вы имеете в виду активный лист, который может быть не тем, что вы хотите.

Sub Paster()
    Dim LastRowCurr As Long
    Dim LastRowMaster As Long
    Dim wksht As Worksheet
    For Each wksht In ThisWorkbook.Worksheets
        If Not wksht.Name = "Master Sheet" Then
            LastRowCurr = wksht.Cells(wksht.Rows.Count, 1).End(xlUp).Row
            LastRowMaster = Worksheets("Master Sheet").Cells(Worksheets("Master Sheet").Rows.Count, 1).End(xlUp).Row + 1
            Range("A2:L" & LastRowCurr).Copy Destination:=ThisWorkbook.Worksheets("Master Sheet").Cells(LastRowMaster, "A")
        End If
    Next wksht
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...