Как скопировать формулу в excel макрос

Копирование формул без сдвига ссылок

Проблема

Предположим, что у нас есть вот такая несложная таблица, в которой подсчитываются суммы по каждому месяцу в двух городах, а затем итог переводится в евро по курсу из желтой ячейки J2.

exact-formulas-copy1.png

Проблема в том, что если скопировать диапазон D2:D8 с формулами куда-нибудь в другое место на лист, то Microsoft Excel автоматически скорректирует ссылки в этих формулах, сдвинув их на новое место и перестав считать:

exact-formulas-copy2.png

Задача: скопировать диапазон с формулами так, чтобы формулы не изменились и остались теми же самыми, сохранив результаты расчета.

Способ 1. Абсолютные ссылки

Как можно заметить по предыдущей картинке, Excel сдвигает только относительные ссылки. Абсолютная (со знаками $) ссылка на желтую ячейку $J$2 не сместилась. Поэтому для точного копирования формул можно временно перевести все ссылки во всех формулах в абсолютные. Нужно будет выделить каждую формулу в строке формул и нажать клавишу F4:

exact-formulas-copy9.png

При большом количестве ячеек этот вариант, понятное дело, отпадает — слишком трудоемко.

Способ 2. Временная деактивация формул

Чтобы формулы при копировании не менялись, надо (временно) сделать так, чтобы Excel перестал их рассматривать как формулы. Это можно сделать, заменив на время копирования знак «равно» (=) на любой другой символ, не встречающийся обычно в формулах, например на «решетку» (#) или на пару амперсандов (&&). Для этого:

  1. Выделяем диапазон с формулами (в нашем примере D2:D8)
  2. Жмем Ctrl+H на клавиатуре или на вкладке Главная — Найти и выделить — Заменить (Home — Find&Select — Replace)

    exact-formulas-copy3.png

  3. В появившемся диалоговом окне вводим что ищем и на что заменяем и в Параметрах (Options) не забываем уточнить Область поиска — Формулы. Жмем Заменить все (Replace all).
  4. Копируем получившийся диапазон с деактивированными формулами в нужное место:

    exact-formulas-copy4.png

  5. Заменяем # на = обратно с помощью того же окна, возвращая функциональность формулам.

Способ 3. Копирование через Блокнот

Этот способ существенно быстрее и проще.

Нажмите сочетание клавиш Ctrl+Ё или кнопку Показать формулы на вкладке Формулы (Formulas — Show formulas), чтобы включить режим проверки формул — в ячейках вместо результатов начнут отображаться формулы, по которым они посчитаны:

exact-formulas-copy5.png

Скопируйте наш диапазон D2:D8 и вставьте его в стандартный Блокнот:

exact-formulas-copy6.png

Теперь выделите все вставленное (Ctrl+A), скопируйте в буфер еще раз (Ctrl+C) и вставьте на лист в нужное вам место:

exact-formulas-copy7.png

Осталось только отжать кнопку Показать формулы (Show Formulas), чтобы вернуть Excel в обычный режим.

Примечание: этот способ иногда дает сбой на сложных таблицах с объединенными ячейками, но в подавляющем большинстве случаев — работает отлично.

Способ 4. Макрос

Если подобное копирование формул без сдвига ссылок вам приходится делать часто, то имеет смысл использовать для этого макрос. Нажмите сочетание клавиш Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставьте новый модуль через меню Insert — Module  и скопируйте туда текст вот такого макроса:

Sub Copy_Formulas()
    Dim copyRange As Range, pasteRange As Range
    
    On Error Resume Next
    Set copyRange = Application.InputBox("Выделите ячейки с формулами, которые надо скопировать.", _
                                "Точное копирование формул", Default:=Selection.Address, Type:=8)
    If copyRange Is Nothing Then Exit Sub
    Set pasteRange = Application.InputBox("Теперь выделите диапазон вставки." & vbCrLf & vbCrLf & _
                                          "Диапазон должен быть равен по размеру исходному " & vbCrLf & _
                                          "диапазону копируемых ячеек.", "Точное копирование формул", _
                                          Default:=Selection.Address, Type:=8)
    
    If pasteRange.Cells.Count <> copyRange.Cells.Count Then
        MsgBox "Диапазоны копирования и вставки разного размера!", vbExclamation, "Ошибка копирования"
        Exit Sub
    End If
    
    If pasteRange Is Nothing Then
        Exit Sub
    Else
        pasteRange.Formula = copyRange.Formula
    End If
End Sub

Для запуска макроса можно воспользоваться кнопкой Макросы на вкладке Разработчик (Developer — Macros) или сочетанием клавиш Alt+F8. После запуска макрос попросит вас выделить диапазон с исходными формулами и диапазон вставки и произведет точное копирование формул автоматически:

exact-formulas-copy8.png

Ссылки по теме

  • Удобный просмотр формул и результатов одновременно
  • Зачем нужен стиль ссылок R1C1 в формулах Excel
  • Как быстро найти все ячейки с формулами
  • Инструмент для точного копирования формул из надстройки PLEX

Группа: Пользователи

Ранг: Новичок

Сообщений: 45


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Здравствуйте, может мой вопрос уже изъезжен, но не могу найти решение.
Необходимо скопировать формулу из ячейки одного документа в ячейку другого документа.
Опишу кратко, код там большой но все упирается в следующий отрезок.
Допустим в ячейке есть формула A1+B1
[vba]

Код

Set WS1 = Workbooks.Item(«Договоры1.xlsm»).Sheets(«Договоры»)
Set WS2 = Workbooks.Item(«Договоры2.xlsm»).Sheets(«Договоры»)
WS1.Cells(1, 2).Copy: WS2.Cells(1, 2).PasteSpecial xlPasteValues   ‘Копирую значения
WS1.Cells(1, 2).Copy: WS2.Cells(1, 2).PasteSpecial xlPasteFormulas    ‘Копирую формулы

[/vba]

В итоге в файл «Договоры2» копируется ячейка, а формула в ней ссылается на ячейки файла «Договоры1»
с результатом ‘C:…Договоры1′!A1+C:…Договоры1’!B1
Как быть? нужно чтобы получилось A1+B1
Я так понимаю можно какой то приписать параметр может быть?

#excel #vba #excel-formula #excel-365

Вопрос:

Итак, у меня есть рабочая тетрадь, которую я настраивал так:

Снимок экрана рабочей книги (ячейка с 2 в ней-это я вручную вставляю формулу в эту ячейку)

Другой снимок экрана с только что рассчитанной формулой и пустой ячейкой под ней

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

До сих пор мне удавалось разобраться во всем этом самостоятельно, но я не могу понять, как реализовать то, что я хочу сделать дальше:

  • После того, как формула увидит, что в строке есть данные, и отредактирует целевую ячейку, я также хочу, чтобы она скопировала саму формулу в ячейку непосредственно под ней (поэтому убедитесь, что каждая строка имеет эту функциональность по мере заполнения).

Я пытался создать функцию в vba, которая делает это, но мне трудно понять, как это сделать. Я пытался использовать такие вещи, как [formulaCell].FormulaLocal и PasteSpecial и тому подобное, но, хотя иногда мне удавалось успешно копировать формулу, она всегда либо использует абсолютные ссылки, либо относительные ссылки, которые не меняются (т. Е. Если целевая ячейка равна $A2 в исходной формуле, целевая ячейка по-прежнему равна $A2 в вставленной формуле, и ячейка, на которую она ссылается, не меняется. Я хочу, чтобы он вставлялся как ячейка $A3, так как он вставляется в строку 3 здесь.)

Вот весь пользовательский код, который я написал в этом модуле (и полностью в рабочей книге):

 Function CopyCellContents2(copyFrom As Range, CopyTo As Range) ' reference only, I don't use this in the function copyFrom.Parent.Evaluate "CopyOver2(" amp; copyFrom.Address(False, False) _   amp; "," amp; CopyTo.Address(False, False) amp; ")" CopyCellContents2 = "1" End Function ' (can you tell i copy-pasted from an online tutorial lol)  Private Sub CopyOver2(copyFrom As Range, CopyTo As Range) ' same as above function  CopyTo.Value = copyFrom.Value End Sub  Function CopyFormulaDown(copy__From As Range) ' This is the function that I can't make work copy__From.Parent.Evaluate "CopyForm(" amp; copy__From.Address(False, False) _  amp; ")" CopyFormulaDown = "1" End Function  Private Sub CopyForm(copy__From As Range) ' Same as above  startAddress = ActiveCell.Address ActiveCell.Address = copy__From.Address(False, False) ActiveCell.Select Selection.copy ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste ActiveCell.Address = startAddress ActiveCell.Select Application.CutCopyMode = False  End Sub  Function StaticDate(Copy_To As Range) ' This works well Copy_To.Parent.Evaluate "CopyDate(" _  amp; Copy_To.Address(False, False) amp; ")" StaticDate = "1" End Function  Private Sub CopyDate(Copy_To As Range) ' Same as above  Copy_To.Value = Int(Now()) End Sub  Function BlankOtherCell(BlankedCell As Range) ' This also works how I want it to BlankedCell.Parent.Evaluate "CellBlank(" _  amp; BlankedCell.Address(False, False) amp; ")" BlankOtherCell = "1" End Function  Private Sub CellBlank(BlankedCell As Range) ' Ditto  BlankedCell.Value = "" End Sub    

сама формула, то:

 =IF(AND(COUNTBLANK($B2:$J2)lt;9,ISBLANK($A2)),(StaticDate($A2) CopyFormulaDown($XFD2)),IF(COUNTBLANK($B2:$J2)=9,(BlankOtherCell($A2) BlankOtherCell($XFD3)),"Date Previously Applied"))  

I’m learning as I go so I’m no expert or anything, but I’m having a hard time finding a solution to this one. That wasn’t the only iteration of the broken function I’ve tried, it’s just the latest (I was messing around in the macro recorder in desperation for this one, lol). I’d like to figure this out though since copy-pasting the formula every time manually is a pain and pasting it into the whole column makes excel run like me uphill (slowly and poorly). I’d appreciate any help anyone could give me here, and thanks for reading!

Хотел бы скопировать формулу из ячейки в диапазон с помощью переменных. Он отлично работает с xlPasteFormulas, но этого следует избегать. В этой формуле использованы неправильные ссылки, поэтому конечный результат неверен:

With ActiveSheet
    .Range(.Cells(rowStarWs1, colAct), .Cells(rowLast, colAct)).Formula = .Cells(rowSuch2Ws1, colAct).Formula 
End With

Пример: формула сохраняется в ячейке C3 (например, A3 * B3)

Я хочу вставить формулу в диапазон C10: C13. Диапазон задается моими переменными.

Результат должен выглядеть, как показано ниже (желтые ячейки)

enter image description here

2 ответа

Лучший ответ

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

Sub f()

    Dim f As String
    f = Range("C3").FormulaR1C1
    
    Range("C10:C13").FormulaR1C1 = f
    
End Sub

Или

Range("C10:C13").FormulaR1C1 = Range("C3").FormulaR1C1


2

Scott Holtzman
9 Дек 2020 в 00:56

Для этой цели вы можете использовать FillDown.

Cells(10, 3).Formula = Cells(3, 3).FormulaR1C1
Range("C10:C14").FillDown

FillDown копирует формулу из первой ячейки определенного диапазона во все его ячейки. Следовательно, первая строка кода заполняет эту первую ячейку. Присвоение формата R1C1 свойству Formula изменяет ячейки, указанные в формуле, без использования формата R1C1 в выходных данных.


0

Variatus
9 Дек 2020 в 01:22

  • Remove From My Forums
  • Question

  • Hi, I’m having trouble with copying a formula down in a VBA statement. Typically, when you click and drag a formula down, the cell reference changes as you move down or across or both. When I try to copy a formula down in VBA, the exact same formula is populated
    instead of the modified cell references. Am I doing something incorrectly? Is there another option that I might be missing?

    The statement I used is a typical Range gets Range where each cell is supposed to copy a static formula from one column to all the others below it in a loop. Is there something special or different about copying formulas?

    As always, thank you in advance for any help you can provide.


    Vinny

Answers

  • Hi Vinny,

    Do you want that when it has absolute reference, it just change the row of the formula, if it has no absolute references, it should change the column reference? If so, I suggest you try the code below which is suggested by Hans:

        range("C19").Select
        Selection.Copy
        range("F20").PasteSpecial xlPasteFormulas

    Best Regards,

    Edward


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    Click
    HERE to participate the survey.

    • Marked as answer by

      Tuesday, September 22, 2015 3:20 PM

Копирование формул

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

помощью маркера заполнения (см. рис. 2))
мы
можем легко заполнить весь столбец
вычисляемыми по формуле значениями,
набрав при этом формулу только один раз
в первой ячейке данного столбца.

Пример. В
таблице, приведенной на рис. 18, рассчитать
сумму проданных товаров (Сумма =
Цена*Количество).


+

Рисунок
18 – Использование маркера заполнения
для
ввода формулы в ячейки столбца

Формула
для расчета суммы товаров набирается
в ячейке D2 (=В2*С2), затем с помощью маркера
заполнения она вносится в ячейки D3 и
D4.

Вычисление части формулы

При
поиске ошибок в составленной формуле
бывает удобно посмотреть результат
вычислений какой-то части формулы. Для
этого:

  1. Сделайте активной ячейку, содержащую
    формулу.

  2. В
    строке формул выделите часть формулы,
    которую нужно вычислить (рис. 19):

Рисунок 19 –
Вычисление части формулы

  1. Поочередно
    нажмите кнопки F9
    (вычисление), Enter
    (
    результат
    вычисления вставить в формулу) и Esc
    (возврат формулы в исходное состояние).

Ввод ссылок на ячейки

Указать
положение ячейки можно с помощью
относительной
или
абсолютной
адресации.
Когда вы используете относительную
адресацию,
ссылки в формулах автоматически
изменяются при копировании формулы в
другое место. Например, если в ячейке
С7 содержится формула =С4*В7, то при
копировании этой формулы в ячейку С8
она преобразуется в =С5*В8.

Чтобы
ссылки в формуле не изменялись при
копировании формулы в другую ячейку,
надо использовать абсолютные
ссылки. Они обозначаются
знаком «$». Например, $С$4 – зафиксирована
ячейка С4.

Если
при копировании формулы нужно сохранить
фиксированным только один параметр,
т.е. номер строки или номер столбца,
используются смешанные
ссылки. Например, $СЗ
– номер столбца не меняется, номер
строки будет подстраиваться под новое
расположение формулы при копировании.
Для С$3 – фиксированный номер строки.

Пример
ввода ссылок на ячейки:

  1. Выделить ячейку, в которую нужно ввести
    формулу.

  2. Введите
    знак равенства «=». Затем введите адрес
    ячейки, которая должна быть в формуле,
    или щелкните по ней. Полученная ссылка
    будет относительной.

  3. Чтобы
    из относительной ссылки получить
    абсолютную или смешанную ссылку, нажмите
    необходимое число раз клавишу F4,
    пока ссылка не отобразится в нужном
    виде.

  4. Продолжайте
    ввод других значений, ссылок и операторов.

  5. Если
    формула завершена, нажмите Enter.

8 Функции ms Excel

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

Вызов функций, задание аргументов

Функцию
можно ввести обычным путем с клавиатуры,
но чтобы избежать синтаксических ошибок
при наборе формул, пользуйтесь Мастером
функций
(Вставка
/ Функции
или кнопка «Вставка
функции»
в строке формул). Для этого вам необходимо:

1 Выделить
ячейку, в которую надо поместить формулу,
и выполнить одно из следующих действий:

– из
основного меню вызовите команду Вставка
/ Функция;

– в
строке формул нажмите кнопку

(вставка функции). Откроется окно первого
шага Мастера функций
(рис. 20).

Рисунок 20 –
Мастер функций – шаг 1

2
Двигаясь по категориям и по названиям
функций, выберите необходимую функцию
(например, категория Статистические,
функция СРЗНАЧ).
Нажмите ОК.

3
Во втором окне Мастера
следует указать необходимые аргументы
функции (выделите диапазон ячеек или
отдельные ячейки) (рис. 21).

Рисунок
21 – Мастер функций – шаг 2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как скопировать формулу в excel для всей строки
  • Как скопировать формулу в excel во все листы книги
  • Как скопировать формулу excel в другой документ
  • Как скопировать формулу в excel в одном столбце
  • Как скопировать форматы ячеек в excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии