Следующее вычислит последний использованный столбец (в строке 20, поскольку мы будем копировать туда), а затем установит значения столбца на один столбец равными значениям в диапазоне от D20 до D39:
Sub coppercopy()
Dim lastcol As Integer
lastcol = Sheets("Sheet1").Cells(20, Columns.Count).End(xlToLeft).Column
Range(Cells(20, lastcol + 1), Cells(39, lastcol + 1)).Value = Range("D20:D39").Value
Range(Cells(42, lastcol + 1), Cells(32, lastcol + 1)).Value = Range("D42:D62").Value
End Sub
Если вы хотите скопировать и вставить вместо установки значений, совпадающих с диапазоном, используйте следующее:
Sub coppercopy()
Dim lastcol As Integer
lastcol = Sheets("Sheet1").Cells(20, Columns.Count).End(xlToLeft).Column
Range("D20:D39").copy
Cells(20, lastcol + 1).PasteSpecial xlPasteValues
End Sub
Редактировать, первый параметр редактируется для включения большего количества диапазонов. Это можно сделать в той же строке, но для удобства чтения кода и простоты использования я поместил его в новую строку. Обратите внимание, что оператор Cells(
всегда принимает нотацию R1C1, в отличие от оператора Range(
. Это означает, что это относится к Cells(Row number, Column number)
. Имея это в виду, это может быть легко обновлено, чтобы включить любой диапазон, который будет скопирован, путем обновления до правильной ссылки на ячейку.
Второе редактирование: Согласно комментариям, диапазон долженбудьте более динамичными, в то же время избавляясь от формулы sum
при копировании. Следующий подпункт адаптирован к этому. Он скопирует весь диапазон, начиная с D20, до последней заполненной строки и при необходимости скопирует ее в следующий доступный столбец. Затем он зацикливается по всему скопированному диапазону + 1 (это должно учитывать формулу sum
в конце диапазона, который необходимо удалить) и, если пропуски найдены (с указанием нового "абзаца)") удаляет ячейку выше (всегда формула sum
для последнего абзаца).
Sub coppercopy()
Dim lastcol As Integer, lastr As Integer, cel As Range
lastcol = Sheets("Sheet1").Cells(20, Columns.Count).End(xlToLeft).Column 'determine last column with values
lastr = Sheets("Sheet1").Range("D" & Rows.Count).End(xlUp).Row 'determine last row with values
Range(Cells(20, lastcol + 1), Cells(lastr, lastcol + 1)).Value = Range("D20:D" & lastr).Value 'copy range to column after last used one
For Each cel In Range(Cells(20, lastcol + 1), Cells(lastr + 1, lastcol + 1)) 'If the copied range does not end with a sum formula, omit the `+ 1` after `lastr`.
If cel.Value = "" Then 'loops over all cells and checks for blanks
cel.Offset(-1, 0).Value = "" 'if blank is found, delete cell above
End If
Next cel
End Sub