Версия для печати

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

Что умеет Excel

 

Иногда формула в ячейке нужна лишь на короткое время — только для получения результата. А затем уже не нужна ни сама формула, ни ячейки, на которые она ссылается. Но вот беда — если удалить ячейки, то формула «ломается», как это говорится. Т.е. в ячейке получается либо #ЗНАЧ! либо #ССЫЛКА!. Или Вам надо просто зафиксировать значение, полученное в результате работы формулы. Т.е. чтобы формулы там не было, а было только значение. Как ни странно, но делается это проще простого:

Выделяете ячейку/несколько ячеек с формуламиКопируетеПравая кнопка мышиСпециальная вставкаЗначения

Специальная вставка

Вот и все. Больше формул нет. Так же подобное можно сделать при помощи кода VBA:

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

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

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

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

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

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

Как быстрее вызвать:
Вообще данную команду можно вывести на Быструю панель и использовать в одно нажатие тогда, когда нужно.

В 2007 Excel это делается через Меню-Параметры Excel-Настройка. Находите нужную команду(Вставить значения) и добавляете;
В 2003 Excel: Сервис-Настройка-вкладка Команды-категория «Правка»-Вставить значения.

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

А если Вы один раз выполните вот такой код:

Sub Add_PasteSpecials()
    Application.CommandBars("Cell").Controls.Add ID:=370, before:=4
End Sub
Sub Add_PasteSpecials()
    Application.CommandBars("Cell").Controls.Add ID:=370, before:=4
End Sub

то у Вас в контекстном меню мыши появится команда — «Вставить значения». Она полностью дублирует стандартную, только вызвать её быстрее — одно нажатие и все.

Также см.:
Вставить значения



Поддержать автора сайта
Поделиться ссылкой
  1. Cаша
    3 Июнь 2011 в 01:59 | #1

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

  2. 3 Июнь 2011 в 10:47 | #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
    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. Рюдо
    9 Июль 2011 в 21:55 | #3

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

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

  4. 9 Июль 2011 в 22:16 | #4

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

  5. 2 Сентябрь 2011 в 13:29 | #5

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

  6. 2 Сентябрь 2011 в 15:08 | #6

    Вместо

    wsSh.UsedRange.Value = wsSh.UsedRange.Value
    wsSh.UsedRange.Value = wsSh.UsedRange.Value

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

    wsSh.Range("A1:B10").Value = wsSh.Range("A1:B10").Value
    wsSh.Range("A1:B10").Value = wsSh.Range("A1:B10").Value
  7. Сергей
    27 Январь 2012 в 10:51 | #7

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

  8. Сергей
    27 Январь 2012 в 12:21 | #8

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

  9. Шамиль
    9 Февраль 2012 в 13:32 | #9

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

    Sub Add_PasteSpecials()
        Application.CommandBars("Cell").Controls.Add ID:=370, before:=4
    End Sub
    Sub Add_PasteSpecials()
        Application.CommandBars("Cell").Controls.Add ID:=370, before:=4
    End Sub
  10. Денис
    12 Март 2012 в 18:04 | #10

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

  11. 12 Март 2012 в 22:01 | #11

    Денис, очень просто:

    Application.CommandBars("Cell").Reset
    Application.CommandBars("Cell").Reset
  12. Денис
    13 Март 2012 в 11:00 | #12

    Спасибо!!!

  13. алексей
    31 Март 2012 в 01:39 | #13

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

    Sub Formula_to_Value()
        Dim rFrmlRng As Range, rArea As Range
        Set rFrmlRng = Range(ActiveCell.Address & "," & Selection.Address)
        If rFrmlRng Is Nothing Then Exit Sub
        For Each rArea In rFrmlRng.Areas
            rArea.Value = rArea.Value
        Next rArea
    End Sub
    Sub Formula_to_Value()
        Dim rFrmlRng As Range, rArea As Range
        Set rFrmlRng = Range(ActiveCell.Address & "," & Selection.Address)
        If rFrmlRng Is Nothing Then Exit Sub
        For Each rArea In rFrmlRng.Areas
            rArea.Value = rArea.Value
        Next rArea
    End Sub
  14. 31 Март 2012 в 10:50 | #14

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

    Sub Formula_to_Value()
        Dim rArea As Range
        For Each rArea In Selection.Areas
            rArea.Value = rArea.Value
        Next rArea
    End Sub
    Sub Formula_to_Value()
        Dim rArea As Range
        For Each rArea In Selection.Areas
            rArea.Value = rArea.Value
        Next rArea
    End Sub

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