Lost your password?


Хитрости »
Основные понятия (27)
Сводные таблицы и анализ данных (10)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (23)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (68)
Разное (43)
Баги и глюки Excel (5)

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

Иногда формула в ячейке нужна лишь на короткое время - только для получения результата. А затем уже не нужна ни сама формула, ни ячейки, на которые она ссылается. Но вот беда - если удалить ячейки, то формула "ломается", как это говорится. Т.е. в ячейке получается либо #ЗНАЧ! либо #ССЫЛКА!. А иногда необходимо просто зафиксировать значение, полученное в результате работы формулы. Т.е. чтобы формулы там не было, а было только значение. Как ни странно, но делается это проще простого:
Выделяем ячейку(несколько ячеек) с формулами -Копируем -Правая кнопка мыши - Специальная вставка(Paste Special) -Значения(Values).
Специальная вставка

КАК БЫСТРО ВЫЗЫВАТЬ СПЕЦИАЛЬНУЮ ВСТАВКУ ЗНАЧЕНИЙ:
Данную команду можно вынести на Панель быстрого доступа и использовать в одно нажатие тогда, когда нужно. Как это сделать:

  • 2010 Excel и выше Файл- Параметры- Настройка. В выпадающем списке Выбрать команды из: выбираем Все команды. Находим команду Вставить значения и добавляем
  • 2007 Excel Меню- Параметры Excel- Настройка. В выпадающем списке Выбрать команды из: выбираем Все команды. Находим команду Вставить значения и добавляем
  • 2003 Excel: Сервис- Настройка- вкладка Команды- категория Правка- Вставить значения.

Теперь в Панели быстрого доступа появится значок Вставка значений.

Вставка значений при помощи кода на Visual Basic for Application
Тоже самое можно сделать при помощи кода VBA:

Sub Formulas_To_Values()
    Selection.Value = Selection.Value
End Sub

Как использовать: Для начала надо убедиться, что разрешены макросы и при необходимости включить их: почему не работает макрос. Затем копируем код выше, из Excel переходим в редактор VBA(Alt+F11) -Insert -Module. Вставляем туда скопированный код. Теперь код можно вызывать нажатием клавиш Alt+F8 -выделяем Formulas_To_Values -Выполнить(Run).
Данный код заменяет формулы в выделенном диапазоне на значения. Только необходимо учитывать, что выделенный диапазон должен быть неразрывным. Иначе код выдаст ошибку. А такой код:

Sub All_Formulas_To_Values()
    ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
End Sub

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

А следующий код заменит формулы на значения во всех ячейках на всех листах активной книги:

Sub All_Formulas_To_Values_In_All_Sheets()
    Dim wsSh As Worksheet
    For Each wsSh In Worksheets
        wsSh.UsedRange.Value = wsSh.UsedRange.Value
    Next wsSh
End Sub

У этого кода нюансы со связями и скрытыми ячейками точно такие же, как и у предыдущего, но уже в масштабах всех листов книги. Плюс, даже если какие-то листы скрыты - замена будет произведена и на них тоже.


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

Sub All_Formulas_To_Values_OnlyVisible()
    Dim rRng As Range, rArea As Range
    If Selection.Count = 1 Then
        Set rRng = ActiveCell
    Else
        Set rRng = Selection.SpecialCells(12)
    End If
    For Each rArea In rRng.Areas
        rArea.Value = rArea.Value
    Next rArea
End Sub

ДОБАВИТЬ КОМАНДУ "ВСТАВИТЬ ЗНАЧЕНИЯ" В КОНТЕКСТНОЕ МЕНЮ:
Если один раз выполнить код ниже, то в контекстном меню по правому клику мыши появится стандартная команда Вставить значения(Insert Values). Она полностью дублирует стандартную, только вызвать её быстрее - одно нажатие и все.:

Sub Add_PasteSpecials()
    Dim cbb
    Set cbb = Application.CommandBars("Cell").FindControl(ID:=370)
    If Not cbb Is Nothing Then cbb.Delete 'удаляем пункт, если он был уже добавлен ранее
    Application.CommandBars("Cell").Controls.Add ID:=370, before:=4
End Sub

Также см.:
Вставить значения
Формулы перестали считать - как исправить?


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистика
Обсуждение: 50 комментариев
  1. Cаша:

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

  2. А в чем причина такого подхода? Ведь если в других ячейках не формулы - плохо-то не будет. Но раз так надо - макрос ниже сделает именно нужное Вам.

    Sub Formula_to_Value()
        Dim rFrmlRng As Range, rArea As Range
        Set rFrmlRng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas)
        If rFrmlRng Is Nothing Then Exit Sub
        For Each rArea In rFrmlRng.Areas
            rArea.Value = rArea.Value
        Next rArea
    End Sub
  3. Рюдо:

    Ох...
    Огромное спасибо за статью и сайт в целом.

    Я мучаюсь над проблемой, что тут поднята..но мне как раз наоборот надо. Мне надо, что бы он текстовые менял, а формулы не трогал.
    Потому что у меня в файле нужные формулы образуются через команду "СЦЕПИТЬ" и кусков текста формулы.

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

  5. А как заставить первый макрос заменять формулы на значения в определённом диапазоне?

  6. Вместо

    wsSh.UsedRange.Value = wsSh.UsedRange.Value

    вказываете свой диапазон:

    wsSh.Range("A1:B10").Value = wsSh.Range("A1:B10").Value
  7. Сергей:

    Вопрос конечно смешной, но все же. Как удалить комманду из контекстного меню( случайно запустил ваш код несколько раз, теперь там несколько строк вставить значение)

  8. Сергей:

    Вопрос можно снять. Спасибо, разобрался:)

  9. Шамиль:

    А есть такое же для Word-a:

    Sub Add_PasteSpecials()
        Application.CommandBars("Cell").Controls.Add ID:=370, before:=4
    End Sub
  10. Денис:

    Как удалить комманду из контекстного меню( случайно запустил ваш код несколько раз, теперь там несколько строк вставить значение)

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2024 Excel для всех   Войти