Как скопировать фиксированную ячейку во внешнюю пустую ячейку - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь скопировать фиксированный диапазон столбцов (D20: D39) в пустой столбец, скажем, K20: K39. Столбцы обновляются каждый раз, когда я обновляюсь (D20: D39), то есть K, L, M, N ... будут обновляться, когда я хочу скопировать (D20: D39). Я не разбираюсь в программировании и компьютерных науках и просто пытаюсь сделать свою электронную таблицу эффективной. Кто-нибудь может помочь?

Я смотрел на некоторые другие темы, но в основном упоминал о копировании в отдельный лист. Никто не упомянул об этом "скользящем" механизме копирования и вставки.

1 Ответ

0 голосов
/ 14 октября 2019

Следующее вычислит последний использованный столбец (в строке 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...