Копирование диапазона ячеек и вставка только значений из того же диапазона на другой лист

#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: Рад, что смог помочь!