Скопируйте формулу из диапазона [1, X] в диапазон [Y, X] с относительной ссылкой - PullRequest
1 голос
/ 19 января 2020

У меня есть два именованных диапазона: Source G3: M3 и Target G8: M10.

Source содержит формулу, которая ссылается на ячейку вне диапазона в той же строке , Я хочу скопировать его в целевой диапазон, как показано на рисунке.

setup

Я написал следующую подпрограмму

Sub CopyFormulas()

TargetRangeName = "Target"
SourceRangeName = "Source"

Range(TargetRangeName).Clear

Range(TargetRangeName).Formula = Range(SourceRangeName).Formula

End Sub

Формула копируется в диапазон, но относительные ссылки не изменяются правильно, давая результат, показанный на рисунке.

enter image description here

Относительная ссылка начинается с строки 3, а не с первой строки диапазона Target.

Несколько решений, которые не применимы в моем случае:

  • , копирование и вставка приведут к правильный результат, но эта процедура должна повторяться тысячи раз, поэтому производительность является критической, а повышение производительности с помощью назначения в 10 раз
  • меняет формулу, чтобы иметь ссылку в правильном положении, что неприменимо, поскольку Я работаю с большим, сложным и старым файлом, где изменение сотен формул невозможно, и Target может изменить положение относительно Source

Ответы [ 2 ]

4 голосов
/ 19 января 2020

Вы можете сделать это, установив свойство .FormulaR1C1 вместо свойства .Formula. Например:

Public Sub ClientCode()
    Dim srcRng As Range
    Dim tarRng As Range

    Set srcRng = Range("Source")
    Set tarRng = Range("Target")

    tarRng.Formula2R1C1 = srcRng(1).Formula2R1C1
End Sub

.FormulaR1C1 поддерживает относительные ссылки

0 голосов
/ 19 января 2020

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

Вы говорите, что это «большой, сложный и старый файл, в котором меняются сотни формул не представляется возможным, и цель может изменить положение ", но вы не хотите использовать Copy. Ненавижу это тебе ломать, ты не можешь иметь это в обоих направлениях. Либо обновите исходный код, либо скопируйте его.

Range(SourceRangeName).Copy Range (TargetRangeNamw)

Вы можете сохранить некоторые циклы ЦП, удалив Range.Clear, это может и не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...