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

Всем доброго дня!
Excel 2007
Есть необходимость программно скопировать формулу из верхней ячейки в следующую пустую одного и того же столбца.
Событие происходит не в модуле, а на листе (Private Sub Worksheet_Change(ByVal Target As Range))
Что делаю:

1. Объявляю переменные
Dim a
Dim b

2. Нахожу последнюю пустую строку
LastRow = Cells(Rows.Count, 1).End(xlUp).Row

3. Выбираю со смещением нужную мне ячейку, где уже есть формула.
Cells(LastRow — 0, 6).Select

4. Загоняю формулу в переменную а
a = Cells(LastRow — 0, 6).Formula

Если посмотреть «а», то моя формула там сохранена в виде строки типа «=бла бла бла»

5. Выбираю следующую вниз пустую ячейку, чтоб скопировать формулу из переменной «а»
ActiveCell.Offset(1, 0).Select

И тут загвоздка.
Метод copy paste не работает, ошибка Object required
Назначение переменной «а» в качестве as Range почему-то не работает или я туплю (начал хорошо отмечать праздник…)

Вопрос: как скопировать формулу?

Содержание

  1. Как скопировать формулу/формулы в Excel, копирование и вставка формул
  2. Что такое формула?
  3. Ссылки в формулах
  4. Относительные ссылки на ячейки
  5. Абсолютные ссылки на ячейки
  6. Смешанные ссылки на ячейки
  7. Трехмерные ссылки на ячейки
  8. Как создать формулу и ввести ее в ячейку?
  9. Простые формулы
  10. Формулы с использованием относительных ссылок
  11. Формулы с использованием абсолютных ссылок
  12. Как ввести одну формулу одновременно в несколько ячеек?
  13. Как выделить все ячейки с формулами?
  14. Как скопировать формулу из одной ячейки в другую?
  15. Как заменить формулу результатом ее вычисления?
  16. Как ускорить работу с формулами при создании и редактировании таблиц?
  17. Копирование формул без сдвига ссылок
  18. Проблема
  19. Способ 1. Абсолютные ссылки
  20. Способ 2. Временная деактивация формул
  21. Способ 3. Копирование через Блокнот
  22. Способ 4. Макрос
  23. Vba excel скопировать только формулы

Как скопировать формулу/формулы в Excel, копирование и вставка формул

Работа с формулами является неотъемлемой частью создания и редактирования таблиц в Excel. При этом создаются как простые, так и вложенные формулы, содержащие относительные, абсолютные и смешанные ссылки на ячейки. При внесении формул в таблицы, наиболее распространенными операциями являются копирование и вставка формул.

Что такое формула?

Формулы — это некоторые выражения, выполняющие вычисления между операндами при помощи операторов. Формулам всегда предшествует знак равенства, за которым следуют операнды и операторы.

Операнды — это элементы вычисления (ссылки, функции и константы ).

Ссылки — это адреса ячеек или их диапазонов.

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

Константы — это постоянные значения, как текстовые, так и числовые.

Операторы — это знаки или символы, определяющие тип вычисления в формуле над операндами. Используются математические, текстовые, операторы сравнения и операторы ссылок.

Ссылки в формулах

Для создания связей между ячейками используются ссылки. Различают три типа ссылок — относительные, абсолютные и смешанные. По умолчанию в Excel используются относительные ссылки.

Относительные ссылки на ячейки

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

Абсолютные ссылки на ячейки

Абсолютная ссылка — это неизменяемая ссылка на ячейку, то есть при изменении позиции ячейки с формулой адрес ячейки с абсолютной ссылкой остается неизменным. Абсолютная ссылка указывается символом $ перед именем (номером) столбца и перед номером строки, например $A$1.

Смешанные ссылки на ячейки

Смешанная ссылка — это комбинация относительных и абсолютных ссылок, когда используется либо абсолютная ссылка на столбец и относительная на строку, либо абсолютная на строку и относительная на столбец, например $A1 или A$1. При изменении позиции ячейки с формулой, содержащей смешанные ссылки, относительная часть ссылки изменяется, а абсолютная остается неизменной.

Трехмерные ссылки на ячейки

Трехмерные ссылки — это ссылки на одну и ту же ячейку или даипазон ячеек, расположенных на нескольких листах одной книги. Трехмерная ссылка кроме имени столбца и номера строки включает в себя имя листа и имеет следующий вид Лист1:Лист3!А1.

Как создать формулу и ввести ее в ячейку?

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

Простые формулы

Простая формула — это формула, содержащая только числовые константы и операторы.

Для того чтобы создать простую формулу, необходимо:

— выделить ячейку, в которой будет находиться формула;

— ввести с клавиатуры символ равно (=);

— ввести число, затем знак действия, затем следующее число и так далее (например =2+3*4);

— нажать Enter для перехода вниз, Shift+Enter для перехода вверх, Tab для перехода вправо или Shift+Tab для перехода влево.

Формулы с использованием относительных ссылок

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

— выделить ячейку, в которой будет находиться формула;

— ввести символ равенства (=) с клавиатуры;

— ввести адрес ячейки, содержащей нужное значение (можно кликнуть курсором мыши по нужной ячейке);

— вставить в формулу оператор, ввести адрес следующей ячейки и так далее;

— завершить создание формулы аналогично тому, как это описано в предыдущем случае.

Формулы с использованием абсолютных ссылок

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

— выделить ячейку, в которой будет находится формула;

— ввести символ равенства (=) с клавиатуры;

— создать нужную формулу с использованием относительных ссылок на ячейки;

— не закрепляя созданную формулу, кликнуть курсором ввода текста в адресном окошке перед адресом той ячейки, которую необходимо сделать абсолютной ссылкой;

— нажать на клавиатуре F4;

— завершить создание формулы клавишей Enter.

Как ввести одну формулу одновременно в несколько ячеек?

Для ввода одной формулы в диапазон ячеек необходимо:

— выделить диапазон ячеек;

— ввести формулу в первую ячейку диапазона;

— закрепить результат сочетанием клавиш Ctrl+Enter.

Как выделить все ячейки с формулами?

В версиях приложения Excel 2007 и выше существует возможность выделять группы ячеек, объединенные общим признаком, например можно найти и выделить все ячейки, содержащие формулы. Для этого на вкладке «Главная» нужно раскрыть меню кнопки «Найти и выделить» и выбрать пункт «Формулы» в списке команд.

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

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

Скопировать формулу из выбранной ячейки можно любым известным способом (при помощи кнопки «Копировать» на вкладке «Главная», при помощи сочетания горячих клавиш Ctrl+C, при помощи пункта «Копировать» в контекстном меню и так далее). После того как формула скопирована, необходимо выделить ячейку, в которую нужно вставить формулу и использовать любой известный способ вставки (кнопкой «Вставить» на вкладке «Главная», сочетанием горячих клавиш Ctrl+V, выбрав пункт «Вставить» из контекстного меню, выбрав пункт «Специальная вставка»). После этого закрепить результат кликом по клавише Enter. Для копирования формулы можно использовать также способ, при котором курсор мыши наводится на правый нижний угол маркера выделения до появления тонкого черного крестика и при нажатой левой кнопке мыши протягивается по всему диапазону. При этом в каждой следующей ячейке формула будет иметь ссылки на новые соответствующие ячейки.

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

Как заменить формулу результатом ее вычисления?

Если скопировать ячейку или диапазон ячеек с формулами, а вставку осуществить при помощи пункта «Вставить значения» (вкладка «Главная»/группа «Буфер обмена»/кнопка «Вставить», либо контекстное меню «Специальная вставка»/»Значения»), то в результате этой операции вместо формул будут отображены значения, полученные в результате вычисления этих формул. Если скопировать диапазон ячеек с формулами и в этот же диапазон вставить значения, то формулы этого диапазона будут заменены результатами их вычислений.

Как ускорить работу с формулами при создании и редактировании таблиц?

Копировать формулы в таблицах стандартными средствами Excel приятно и легко до тех пор, пока формулы несложные, однотипные и расположены в непрерывных диапазонах ячеек. На практике же часто встречаются такие таблицы, где информация сгруппирована по различным видам, типам, группам, срокам, наименованиям и так далее. Соответственно и формулы в таких таблицах расположены не подряд, а с различными промежутками и редактировать такие таблицы (например добавлять новые столбцы или строки) довольно проблематично из-за большого количества повторения одной и той же операции копирования-вставки. Еще более усугубляется такая ситуация тем, что формулы сложные и со смешанными ссылками. Копирование и вставка таких формул зачастую приводит к нежелательным смещениям адресов ячеек и их диапазонов, копировать же текст формул не вполне удобно.

Облегчает и ускоряет работу при копировании формул, текста формул и значений формул, а также при замене формул их значениями VBA-надстройка для Excel, позволяющая в указанном диапазоне копировать все ячейки с формулами и вставлять в соседние ячейки с заданным смещением как формулы и тексты формул, так и значения. Диалоговое окно надстройки и ссылка для скачивания представлены ниже.

Надстройка позволяет:

1. Одним кликом мыши вызывать диалоговое окно макроса прямо из панели инструментов Excel;

2. в выбранном диапазоне находить ячейки с формулами, копировать их и вставлять с заданным смещением;

3. выбирать один из трех режимов копирования формул:

— «Скопировать формулы» — простое копирование формул, при котором все ссылки, используемые в формулах, автоматически изменяются в соответствии с новым размещением формул;

— «Скопировать текст формул» — точное копирование формул, без изменения ссылок, используемых в формулах;

— «Скопировать значения формул» — копирование, при котором формулы заменяется результатамм их вычислений.

4. заменять формулы выбранного диапазона результатами вычисления (если выбрать опцию «Скопировать значения формул», а в полях, где задается смещение установить нули).

Источник

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

Проблема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Источник

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

    = Мир MS Excel/Перенос формул в макрос — Мир MS Excel

    Войти через uID

    Войти через uID

    Модератор форума: _Boroda_, китин

    Мир MS Excel » Вопросы и решения » Готовые решения » Перенос формул в макрос (Excel)

    Перенос формул в макрос

    anisimovaleksandr32 Дата: Понедельник, 25.01.2021, 12:44 | Сообщение № 1

    ‘Средняя прочность серии образцов, Мпа в графе (13)

    ‘With Range(«O31:O36»)
    ‘.FormulaR1C1 = _
    ‘»=IF(AND(R[-13]C[4]=»»Раствор»»,COUNT(RC[-1]:R[5]C[-1])=3),AVERAGE(RC[-1]:R[5]C[-1]),IF(AND(R[-13]C[4]=»»Раствор»»,COUNT(RC[-1]:R[5]C[-1])>3),»»Только 3-и образца»»,IF(COUNT(RC[-1]:R[5]C[-1])>5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1)-SMALL(RC[-1]:R[5]C[-1],2))/4),2),IF(COUNT(RC[-1]:R[5]C[-1])=5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/» & _
    ‘»(COUNT(RC[-1]:R[5]C[-1])=4,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/3),2),IF(COUNT(RC[-1]:R[5]C[-1])=3,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/2),2),IF(COUNT(RC[-1]:R[5]C[-1])

    ‘Средняя прочность серии образцов, Мпа в графе (13)

    ‘With Range(«O31:O36»)
    ‘.FormulaR1C1 = _
    ‘»=IF(AND(R[-13]C[4]=»»Раствор»»,COUNT(RC[-1]:R[5]C[-1])=3),AVERAGE(RC[-1]:R[5]C[-1]),IF(AND(R[-13]C[4]=»»Раствор»»,COUNT(RC[-1]:R[5]C[-1])>3),»»Только 3-и образца»»,IF(COUNT(RC[-1]:R[5]C[-1])>5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1)-SMALL(RC[-1]:R[5]C[-1],2))/4),2),IF(COUNT(RC[-1]:R[5]C[-1])=5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/» & _
    ‘»(COUNT(RC[-1]:R[5]C[-1])=4,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/3),2),IF(COUNT(RC[-1]:R[5]C[-1])=3,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/2),2),IF(COUNT(RC[-1]:R[5]C[-1]) anisimovaleksandr32

    ‘Средняя прочность серии образцов, Мпа в графе (13)

    ‘With Range(«O31:O36»)
    ‘.FormulaR1C1 = _
    ‘»=IF(AND(R[-13]C[4]=»»Раствор»»,COUNT(RC[-1]:R[5]C[-1])=3),AVERAGE(RC[-1]:R[5]C[-1]),IF(AND(R[-13]C[4]=»»Раствор»»,COUNT(RC[-1]:R[5]C[-1])>3),»»Только 3-и образца»»,IF(COUNT(RC[-1]:R[5]C[-1])>5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1)-SMALL(RC[-1]:R[5]C[-1],2))/4),2),IF(COUNT(RC[-1]:R[5]C[-1])=5,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/» & _
    ‘»(COUNT(RC[-1]:R[5]C[-1])=4,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/3),2),IF(COUNT(RC[-1]:R[5]C[-1])=3,ROUND(((SUM(RC[-1]:R[5]C[-1])-SMALL(RC[-1]:R[5]C[-1],1))/2),2),IF(COUNT(RC[-1]:R[5]C[-1]) Автор — anisimovaleksandr32
    Дата добавления — 25.01.2021 в 12:44

    Gustav Дата: Понедельник, 25.01.2021, 15:35 | Сообщение № 2
    lebensvoll Дата: Понедельник, 25.01.2021, 17:20 | Сообщение № 3

    Gustav, спасибо огромное за ответ.

    Прошу меня простить за то что создал тему не со своего профиля (не смог вспомнить свой старый). А когда вспомнил и во становил, то тему решил не удалять (((((

    Gustav, спасибо огромное за ответ.

    Прошу меня простить за то что создал тему не со своего профиля (не смог вспомнить свой старый). А когда вспомнил и во становил, то тему решил не удалять (((((

    Кто бы ты ни был, мир в твоих руках

    Ответить

    Сообщение Gustav, спасибо огромное за ответ.

    Прошу меня простить за то что создал тему не со своего профиля (не смог вспомнить свой старый). А когда вспомнил и во становил, то тему решил не удалять (((((

    Gustav Дата: Понедельник, 25.01.2021, 18:24 | Сообщение № 4

    А фиг знает. честно говоря, сам первый раз с таким сталкиваюсь. И поэтому я бы советовал в данном случае не пользоваться макрорекордером, а создавать формулы с помошью свойства FormulaLocal объекта Range. Преимущество, в первую очередь, состоит в том, что Вы берете за основу формулу в ее, так сказать, естественном виде, в котором она отображается в окне формул (ну, если только, конечно, Вы не ярый фанат адресации R1C1). Сопровождать формулу в таком естественном виде значительно проще, чем в формате R1C1. Пожалуй, при этом единственное, но вполне преодолимое, неудобство заключается в необходимости удвоения в коде VBA двойных кавычек, если таковые имеются в формуле.

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

    1. Копируем текст формулы в Блокнот (Notepad) и разбиваем на несколько строк примерно равной длины. Разбивать можно в любом месте, хоть посредине функции — это нестрашно:
    [vba]

    А фиг знает. честно говоря, сам первый раз с таким сталкиваюсь. И поэтому я бы советовал в данном случае не пользоваться макрорекордером, а создавать формулы с помошью свойства FormulaLocal объекта Range. Преимущество, в первую очередь, состоит в том, что Вы берете за основу формулу в ее, так сказать, естественном виде, в котором она отображается в окне формул (ну, если только, конечно, Вы не ярый фанат адресации R1C1). Сопровождать формулу в таком естественном виде значительно проще, чем в формате R1C1. Пожалуй, при этом единственное, но вполне преодолимое, неудобство заключается в необходимости удвоения в коде VBA двойных кавычек, если таковые имеются в формуле.

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

    1. Копируем текст формулы в Блокнот (Notepad) и разбиваем на несколько строк примерно равной длины. Разбивать можно в любом месте, хоть посредине функции — это нестрашно:
    [vba]

    А фиг знает. честно говоря, сам первый раз с таким сталкиваюсь. И поэтому я бы советовал в данном случае не пользоваться макрорекордером, а создавать формулы с помошью свойства FormulaLocal объекта Range. Преимущество, в первую очередь, состоит в том, что Вы берете за основу формулу в ее, так сказать, естественном виде, в котором она отображается в окне формул (ну, если только, конечно, Вы не ярый фанат адресации R1C1). Сопровождать формулу в таком естественном виде значительно проще, чем в формате R1C1. Пожалуй, при этом единственное, но вполне преодолимое, неудобство заключается в необходимости удвоения в коде VBA двойных кавычек, если таковые имеются в формуле.

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

    1. Копируем текст формулы в Блокнот (Notepad) и разбиваем на несколько строк примерно равной длины. Разбивать можно в любом месте, хоть посредине функции — это нестрашно:
    [vba]

    lebensvoll Дата: Понедельник, 25.01.2021, 18:51 | Сообщение № 5

    Gustav, СПАСИБО за такой подробнейший подход к записи
    Я делал грубо.
    1. Формулы и так создавались с трудом и долго правились и поправлялись
    2. В VBA я не силен (((( форум во многом помогал. Но я эту процедуру делал так:
    копировал формулу
    вставал на нужную ячейку, включал «запись» и вставлял скопированную формулу, останавливал запись и потом уже получишвийся код-формулу подставлял куда нужно.
    Если во многом формулы так получались на ура. То именно с этими тремя формулами возникали проблемы ((((
    Буду пробовать Ваше предложенное

    Но у меня же будет не одна формула а много их ((((

    СПАСИБО ВАМ ОГРОМНЕЙШЕЕ

    Gustav, СПАСИБО за такой подробнейший подход к записи
    Я делал грубо.
    1. Формулы и так создавались с трудом и долго правились и поправлялись
    2. В VBA я не силен (((( форум во многом помогал. Но я эту процедуру делал так:
    копировал формулу
    вставал на нужную ячейку, включал «запись» и вставлял скопированную формулу, останавливал запись и потом уже получишвийся код-формулу подставлял куда нужно.
    Если во многом формулы так получались на ура. То именно с этими тремя формулами возникали проблемы ((((
    Буду пробовать Ваше предложенное

    Но у меня же будет не одна формула а много их ((((

    СПАСИБО ВАМ ОГРОМНЕЙШЕЕ lebensvoll

    Кто бы ты ни был, мир в твоих руках

    Сообщение Gustav, СПАСИБО за такой подробнейший подход к записи
    Я делал грубо.
    1. Формулы и так создавались с трудом и долго правились и поправлялись
    2. В VBA я не силен (((( форум во многом помогал. Но я эту процедуру делал так:
    копировал формулу
    вставал на нужную ячейку, включал «запись» и вставлял скопированную формулу, останавливал запись и потом уже получишвийся код-формулу подставлял куда нужно.
    Если во многом формулы так получались на ура. То именно с этими тремя формулами возникали проблемы ((((
    Буду пробовать Ваше предложенное

    Но у меня же будет не одна формула а много их ((((

    СПАСИБО ВАМ ОГРОМНЕЙШЕЕ Автор — lebensvoll
    Дата добавления — 25.01.2021 в 18:51

    RAN Дата: Понедельник, 25.01.2021, 18:55 | Сообщение № 6
    Быть или не быть, вот в чем загвоздка!

    Ответить

    Gustav Дата: Понедельник, 25.01.2021, 19:18 | Сообщение № 7
    RAN Дата: Понедельник, 25.01.2021, 20:33 | Сообщение № 8
    Быть или не быть, вот в чем загвоздка!

    Ответить

    lebensvoll Дата: Среда, 27.01.2021, 21:31 | Сообщение № 9

    With Range(«O31:P36»)
    .FormulaR1C1 = _
    «=IF(R[-13]C[3]=»»Раствор»»,IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>—VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),»»B»»&ROUND(RC[-1]*0.8,)&»» > B»»&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),»»В»»&ROUND(RC[-1]*0.8,)&»»

    With Range(«B39:P39»)
    .FormulaR1C1 = _
    «=IF(R[-21]C[16]=»»Бетон»»,» & _
    «IF(VALUE(R[-13]C[13]) 27,» & _
    «ROUND(R[-8]C[12]*0.8,)>—VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)),» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактический класс бетона В»»&ROUND(R[-8]C[12]*0.8,)&»» , что составляет «»&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»» % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105″»,» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактический класс бетона В»»&ROUND(R[-8]C[12]*0.8,)&»» , что составляет «»&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»» % это меньше от проектного класса, на «»&100-ROUND(R[-8]C[12]*0,8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»»% .»»)),» & _
    «IF(VALUE(R[-13]C[13]) 27,» & _
    «ROUND(R[-8]C[12]*VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),) >—VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)),» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактическая прочность раствора «»& ROUND(R[-8]C[12],2) &»» МПа, что составляет «»&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2, FALSE),)&»» % от проектной марки.»»,» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактическая прочность раствора «»& ROUND(R[-8]C[12],2) &»» МПа, что составляет «»&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&»» % это меньше от проектной марки на «»&100-ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&»» %.»»)))»
    .Value = .Value
    End With

    With Range(«O31:P36»)
    .FormulaR1C1 = _
    «=IF(R[-13]C[3]=»»Раствор»»,IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>—VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),»»B»»&ROUND(RC[-1]*0.8,)&»» > B»»&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),»»В»»&ROUND(RC[-1]*0.8,)&»»

    With Range(«B39:P39»)
    .FormulaR1C1 = _
    «=IF(R[-21]C[16]=»»Бетон»»,» & _
    «IF(VALUE(R[-13]C[13]) 27,» & _
    «ROUND(R[-8]C[12]*0.8,)>—VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)),» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактический класс бетона В»»&ROUND(R[-8]C[12]*0.8,)&»» , что составляет «»&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»» % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105″»,» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактический класс бетона В»»&ROUND(R[-8]C[12]*0.8,)&»» , что составляет «»&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»» % это меньше от проектного класса, на «»&100-ROUND(R[-8]C[12]*0,8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»»% .»»)),» & _
    «IF(VALUE(R[-13]C[13]) 27,» & _
    «ROUND(R[-8]C[12]*VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),) >—VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)),» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактическая прочность раствора «»& ROUND(R[-8]C[12],2) &»» МПа, что составляет «»&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2, FALSE),)&»» % от проектной марки.»»,» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактическая прочность раствора «»& ROUND(R[-8]C[12],2) &»» МПа, что составляет «»&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&»» % это меньше от проектной марки на «»&100-ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&»» %.»»)))»
    .Value = .Value
    End With

    Кто бы ты ни был, мир в твоих руках

    Ответить

    With Range(«O31:P36»)
    .FormulaR1C1 = _
    «=IF(R[-13]C[3]=»»Раствор»»,IF(VALUE(R[-5]C)>27,ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE),ROUND(RC[-1],2)*100/VLOOKUP(R[-12]C[3],Класс!R[-26]C[-11]:R[-13]C[-9],2,FALSE)),IF(VALUE(R[-5]C)>27,(IF(ROUND(RC[-1]*0.8,)>—VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),»»B»»&ROUND(RC[-1]*0.8,)&»» > B»»&VLOOKUP(R[-12]C[3],Класс!R[-26]C[-14]:R[-13]C[-12],3,FALSE),»»В»»&ROUND(RC[-1]*0.8,)&»»

    With Range(«B39:P39»)
    .FormulaR1C1 = _
    «=IF(R[-21]C[16]=»»Бетон»»,» & _
    «IF(VALUE(R[-13]C[13]) 27,» & _
    «ROUND(R[-8]C[12]*0.8,)>—VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)),» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактический класс бетона В»»&ROUND(R[-8]C[12]*0.8,)&»» , что составляет «»&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»» % от проектного класса. Конструкция подлежит приемке в соответствии с п. 8.5.2 ГОСТ 18105″»,» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактический класс бетона В»»&ROUND(R[-8]C[12]*0.8,)&»» , что составляет «»&ROUND(R[-8]C[12]*0.8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»» % это меньше от проектного класса, на «»&100-ROUND(R[-8]C[12]*0,8/VLOOKUP(R[-20]C[16],Класс!R5C1:R18C3,3,FALSE)*100,)&»»% .»»)),» & _
    «IF(VALUE(R[-13]C[13]) 27,» & _
    «ROUND(R[-8]C[12]*VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),) >—VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],3,FALSE)),» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактическая прочность раствора «»& ROUND(R[-8]C[12],2) &»» МПа, что составляет «»&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2, FALSE),)&»» % от проектной марки.»»,» & _
    «»»ЗАКЛЮЧЕНИЕ: В возрасте «»&R[-13]C[13]&»» суток фактическая прочность раствора «»& ROUND(R[-8]C[12],2) &»» МПа, что составляет «»&ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&»» % это меньше от проектной марки на «»&100-ROUND(R[-8]C[12]*100/VLOOKUP(R[-20]C[16],Класс!R[-34]C[2]:R[-21]C[4],2,FALSE),)&»» %.»»)))»
    .Value = .Value
    End With

    Источник

    Adblock
    detector

    I have an existing VBA code that copies an Excel worksheet from my source workbook (Sourcewb) into a new destination workbook (Destwb) but pastes values only. I need a specific range (D31:E38) in the Destwb to include the formulas from the source workbook. I found this code:

    Range("A1:I1105").Copy Sheets("Sheet2").Range("B2")
    

    On this site (another question) that seems related but don’t know how to modify it to work in my application. I have added a comment line » ‘Insert total formulas in Calc sheet» for where I think the additional code would go. Here is my existing code:

    Set Sourcewb = ActiveWorkbook
    
    'Copy the sheet to a new workbook
    Sheets("Calculation").Copy
    Set Destwb = ActiveWorkbook
    
    'Determine the Excel version and file extension/format
    With Destwb
        If Val(Application.Version) < 12 Then
            'You use Excel 97-2003
            FileExtStr = ".xls": FileFormatNum = -4143
        Else
            'You use Excel 2007-2013
                FileExtStr = ".xlsx": FileFormatNum = 51
            End If
    End With
    
    'Change all cells in the worksheet to values if you want
    With Destwb.Sheets(1).UsedRange
        Application.CutCopyMode = False
        ActiveSheet.Unprotect
            .Cells.Copy
            .Cells.PasteSpecial xlPasteValues
            .Cells(1).Select
    End With
    Application.CutCopyMode = False
    
    'Insert total formulas in Calc sheet
    
    'Save the new workbook and close it
    TempFilePath = Sheets("Calculation").Range("L4").Value
    TempFileName = Range("L3").Value
    
    With Destwb
        .SaveAs TempFilePath & "" & TempFileName & FileExtStr, FileFormat:=FileFormatNum
        .Close SaveChanges:=True
    End With
    
    MsgBox "You can find the new file in " & TempFilePath
    

    shA.t's user avatar

    shA.t

    16.4k5 gold badges53 silver badges111 bronze badges

    asked May 12, 2015 at 15:08

    user2962699's user avatar

    1

    You could copy the whole thing first, like you are doing and then overwrite the cells in Destwb D31:E38 with the formulas from the cells in Sourcewb. Assuming the range of interest in Sourcewb is «D31:E38» and that the destination range and source range are the same size, you could do the following:

    'Copy all cells
    'Your code here
    
    'New code
    set formulaRngFromSource = Sourcewb.Sheets("Calculation").Range("D31:E38")
    set formulaRngToDest = Destwb.Sheets(1).Range("D31:E38")
    
    i = 1
    for each range in formulaRngFromSource
         formulaRngToDest(i).Formula = range.Formula
         i = i + 1
    next range
    

    shA.t's user avatar

    shA.t

    16.4k5 gold badges53 silver badges111 bronze badges

    answered May 12, 2015 at 15:28

    deasa's user avatar

    deasadeasa

    60610 silver badges24 bronze badges

    0

    You can try with: ActiveSheet.PasteSpecial Paste:=xlFormulas

    ActiveSheet.Unprotect
    ...
        .Cells.Copy
        .Cells.PasteSpecial xlPasteValues
        .Cells.PasteSpecial xlFormulas
        .Cells(1).Select
    End With
    

    shA.t's user avatar

    shA.t

    16.4k5 gold badges53 silver badges111 bronze badges

    answered May 12, 2015 at 15:21

    Javysk's user avatar

    JavyskJavysk

    3512 silver badges16 bronze badges

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

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

    Сообщений: 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
    Я так понимаю можно какой то приписать параметр может быть?

    Вопрос:

    [Последний вывод] Я обнаружил, что value(11) может иногда копировать формулы, но не всегда. Формулы типа sumproduct и sumif не могут быть скопированы, но простые арифметические операции могут быть скопированы. Это так странно! Я до сих пор не могу понять, почему.

    Я знаю, что если я хочу только копировать значения, самый быстрый способ –

    Range("A1").Value = Range("A2").Value
    

    Если я хочу скопировать форматирование и значения, самый быстрый способ –

    Range("A1").Value(11) = Range("A2").Value(11)
    

    Если я хочу скопировать формулы, самый быстрый способ –

    Range("A1").Formula = Range("A2").Formula
    

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

    Лучший ответ:

    Я просто нашел простой ответ.

    Range("A1").Value(11) = Range("A2").Value(11)
    Range("A1").Formula = Range("A2").Formula
    

    Так как value(11) терпит неудачу при копировании некоторых сложных формул (я не знаю, почему, должно быть, ошибка в Excel), я добавил вторую строку, чтобы снова вставить формулу. Это должно гарантировать правильность копирования всех формул.

    Ответ №1

    Как о суб подобном:

    Sub copyFormattingAndFormulas(source As Range, target As Range)
    
    Dim sourceCell, targetCell As Range
    Dim i, j, lastRow, lastColumn As Integer
    lastRow = source.rows.count + source.row - 1
    lastColumn = source.columns.count + source.Column - 1
    For i = source.row To lastRow
    For j = source.Column To lastColumn
    Set sourceCell = Cells(source.row + i - 1, source.Column + j - 1)
    Set targetCell = Cells(target.row + i - 1, target.Column + j - 1)
    targetCell.value(11) = sourceCell.value(11)
    targetCell = sourceCell.Formula
    Next
    Next
    
    End Sub
    

    Все, что он делает, – это то, что вы показали в вопросе (полезно знать о .value(11)!) в цикле для заданного диапазона.

    Ответ №2

    Чтобы скопировать формулы с форматированием в исходном диапазоне и сохранить относительные формулы (например, как с помощью Ctr-C и Ctr-V), используйте этот метод копирования и вставки:

    Range("A1").Copy Range("A2")
    

    Владимир_Сар

    58 / 57 / 13

    Регистрация: 10.09.2009

    Сообщений: 255

    1

    Подскажите, как копировать формулы с ячеек листа екселя на другой лист

    20.10.2009, 15:34. Показов 8081. Ответов 4

    Метки нет (Все метки)


    Студворк — интернет-сервис помощи студентам

    Пробовал по разному

    Visual Basic
    1
    
    Worksheets("Main").Cells(r , k) = Worksheets(List).Cells(r ,  k)

    копирует значение, но не формулу, потом попробовал по стандарту

    Visual Basic
    1
    2
    3
    4
    5
    6
    
    Worksheets(List).Activate
            Cells(r , k).Select
            Selection.Copy
            Worksheets("Main").Activate
            Cells(r , k).Select
            ActiveSheet.Paste

    Если слишком много ячеек копировать противно мерцает экран
    Может еще есть способы, буду Вам благодарен



    0



    Programming

    Эксперт

    94731 / 64177 / 26122

    Регистрация: 12.04.2006

    Сообщений: 116,782

    20.10.2009, 15:34

    4

    EducatedFool

    0 / 0 / 0

    Регистрация: 28.09.2009

    Сообщений: 88

    20.10.2009, 16:30

    2

    Visual Basic
    1
    2
    3
    
    Sub test()
        Worksheets(List).Cells(r, k).Copy Worksheets("Main").Cells(r, k)
    End Sub



    0



    58 / 57 / 13

    Регистрация: 10.09.2009

    Сообщений: 255

    20.10.2009, 16:40

     [ТС]

    3

    Спасибо, правда долго копирует



    0



    Toxa33rus

    3895 / 898 / 122

    Регистрация: 16.04.2009

    Сообщений: 1,824

    20.10.2009, 16:43

    4

    Может так попробовать:

    Visual Basic
    1
    
    Worksheets("Main").Cells(r, k).formula = Worksheets(List).Cells(r, k).formula



    1



    58 / 57 / 13

    Регистрация: 10.09.2009

    Сообщений: 255

    20.10.2009, 16:48

     [ТС]

    5

    Спасибо этот вариант гораздо быстрее



    0



    IT_Exp

    Эксперт

    87844 / 49110 / 22898

    Регистрация: 17.06.2006

    Сообщений: 92,604

    20.10.2009, 16:48

    5

    Like this post? Please share to your friends:
  • Vba excel скопировать столбец в другой столбец
  • Vba excel скопировать лист с новым именем
  • Vba excel скопировать значение в ячейку
  • Vba excel скопировать диапазон ячеек в другую книгу
  • Vba excel скопировать данные с листов в один