#excel #vba #copy-paste
#excel #vba #копировать-вставить
Вопрос:
у меня есть этот цикл, перебирающий строки листа, и мне нужно вставить тот же диапазон ячеек на другой лист с той же структурой.
For i = 1 To NumRows
Set rng = sheet.Range("D" amp; i)
rng.EntireRow.Copy otherSheet.Cells(i LastRow, 1)
Next i
Теперь, если мне нужно вставить только значения из всего потока в «otherSheet», как я могу этого добиться?
Комментарии:
1. Но разве вам не нужно копировать весь диапазон от первой строки до
NumRows
? Если да, его можно скопировать сразу и очень быстро, используя массив… Тогда зачем копировать всю строку, а не только используемый диапазон? Куда вы хотите вставить? В ячейке «A1» или в первой пустой ячейке столбца A: A?2. Почему бы не попробовать macro recorder или Google, это обычный вопрос?
3. На самом деле у меня много листов, которые мне нужно объединить в один большой (здесь он называется «otherSheet»). Поэтому мне нужно запомнить последнюю пустую строку на большом листе, чтобы знать, с чего начать вставку строк, когда я перехожу к следующему листу (я перебираю листы) в переменной Lastrow. что вы имеете в виду под «использованием массива»? не могли бы вы быть более конкретными? Спасибо
4. Я подготовлю ответ. Я попробую прокомментировать это, и вы увидите, как можно использовать такой массив. Работа только в памяти сделает код очень быстрым.
5. @FaneDuru спасибо большое
Ответ №1:
Пожалуйста, протестируйте следующий код. Предполагается, что ваша первая строка на каждом листе может использоваться как ссылка для вычисления количества вычисляемых столбцов. Если это не так, пожалуйста, укажите, какая строка будет использоваться:
Sub testCopyRangeFromAllSheetsToMaster()
Dim sh As Worksheet, shCons As Worksheet, lastR As Long, lastC As Long
Dim lastRCons As Long, arr
Set shCons = Worksheets("otherSheet") 'use here your consolidation sheet to copy the range
For Each sh In ThisWorkbook.Sheets
If sh.Name <> shCons.Name Then
lastR = sh.Range("A" amp; rows.count).End(xlUp).row 'last row in the sheet to copy from
lastC = sh.cells(1, Columns.count).End(xlToLeft).Column 'last column
arr = sh.Range("A1", sh.cells(lastR, lastC)).Value 'Put the range in an array
lastRCons = shCons.Range("A" amp; rows.count).End(xlUp).row 1 'last empty row in the consolidation sheet
'drop the array content at once:
shCons.Range("A" amp; lastRCons).Resize(UBound(arr), UBound(arr, 2)).Value = arr
End If
Next sh
MsgBox "Ready..."
End Sub
Если вы хотите избежать копирования заголовков, вам следует заменить sh.Range("A1"...
на sh.Range("A2"...
. Это означает, что массив создается, начиная со второй строки.
Комментарии:
1. @Syertim: Рад, что смог помочь!