Макрос REPLACE_by_VAL позволяет в выбранном диапазоне в нескрытых ячейках заменить формулы на значения [vba]
Код
Sub REPLACE_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения If TypeName(Selection) <> "Range" Then Exit Sub Dim iCell As Range, rRange As Range With ActiveSheet.Cells Set rRange = Intersect(Selection, ActiveSheet.UsedRange, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeFormulas)) End With Application.ScreenUpdating = False For Each iCell In rRange iCell.Copy: iCell.PasteSpecial Paste:=xlValues: iCell.Font.Color = vbBlack Next Application.ScreenUpdating = True rRange.Select End Sub
[/vba]
Макрос REPLACE_by_VAL позволяет в выбранном диапазоне в нескрытых ячейках заменить формулы на значения [vba]
Код
Sub REPLACE_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения If TypeName(Selection) <> "Range" Then Exit Sub Dim iCell As Range, rRange As Range With ActiveSheet.Cells Set rRange = Intersect(Selection, ActiveSheet.UsedRange, .SpecialCells(xlCellTypeVisible), .SpecialCells(xlCellTypeFormulas)) End With Application.ScreenUpdating = False For Each iCell In rRange iCell.Copy: iCell.PasteSpecial Paste:=xlValues: iCell.Font.Color = vbBlack Next Application.ScreenUpdating = True rRange.Select End Sub
Private Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения On Error Resume Next With Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)) .Value = .Value End With End Sub
[/vba]
Полирнул старый макрос: [vba]
Код
Private Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения On Error Resume Next With Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)) .Value = .Value End With End Sub
Упс! Как-то я не сообразил, что у Range.SpecialCells(...) тоже в свою очередь должно быть .SpecialCells(...) и это вполне можно использовать вместо Intersect Спасибо, Саш. Ещё короче получилось:[vba]
Код
Private Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения On Error Resume Next With ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeFormulas) .Value = .Value End With End Sub
[/vba]
Упс! Как-то я не сообразил, что у Range.SpecialCells(...) тоже в свою очередь должно быть .SpecialCells(...) и это вполне можно использовать вместо Intersect Спасибо, Саш. Ещё короче получилось:[vba]
Код
Private Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения On Error Resume Next With ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeFormulas) .Value = .Value End With End Sub
Это у меня глюк или ...? Запустите вышеприведенный макрос в приложенном файле. В объединенных ячейках значения получаются 5 и 2 или, как у меня, 5 и 5?
Это у меня глюк или ...? Запустите вышеприведенный макрос в приложенном файле. В объединенных ячейках значения получаются 5 и 2 или, как у меня, 5 и 5?_Boroda_
А ведь и правда лажа почему-то получается… Не пойму, в каком случае? Анализировать и править код, к сожалению абсолютно некогда. Саш, может быть ты подправишь?
А ведь и правда лажа почему-то получается… Не пойму, в каком случае? Анализировать и править код, к сожалению абсолютно некогда. Саш, может быть ты подправишь?Alex_ST
Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения On Error Resume Next For Each Ar In ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeFormulas).Areas Ar.Value = Ar.Value Next End Sub
[/vba]
Леш, только для вас. Любой каприз... [vba]
Код
Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения On Error Resume Next For Each Ar In ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeFormulas).Areas Ar.Value = Ar.Value Next End Sub
Правда, я вспомнил, что .SpecialCells имеет гнусное свойство: если была выделена только одна ячейка, то выделяются все ячейки листа, соответствующие критерию отбора. Ну, для примера, напишите на листе формулы в нескольких ячейках, а потом выделите только одну из них и по F5 выберите только ячейки с формулами. Выберутся все ячейки листа с формулами, а не та, которая была выбрана. Ну и формулы на значения процедура заменит на всём листе, а не только в Selection (что будет сопровождаться соответствующими выражениями пользователя) Для борьбы с этим пришлось процедурку усложнить так: [vba]
Код
Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения Dim rRng As Range, rAr As Range On Error Resume Next With ActiveWindow.RangeSelection.Cells If .Count = 1 Or .MergeCells Then .Item(1) = .Item(1).Value: .Item(1).Font.Color = vbBlack: Exit Sub Else Set rRng = .SpecialCells(xlCellTypeFormulas).SpecialCells(xlCellTypeVisible) End If End With If rRng Is Nothing Then Exit Sub For Each rAr In rRng.Areas: rAr.Value = rAr.Value: Next rRng.Select rRng.Font.Color = vbBlack End Sub
[/vba] но что-то, кажется, перемудрил... А разбираться уже опять некогда.
Правда, я вспомнил, что .SpecialCells имеет гнусное свойство: если была выделена только одна ячейка, то выделяются все ячейки листа, соответствующие критерию отбора. Ну, для примера, напишите на листе формулы в нескольких ячейках, а потом выделите только одну из них и по F5 выберите только ячейки с формулами. Выберутся все ячейки листа с формулами, а не та, которая была выбрана. Ну и формулы на значения процедура заменит на всём листе, а не только в Selection (что будет сопровождаться соответствующими выражениями пользователя) Для борьбы с этим пришлось процедурку усложнить так: [vba]
Код
Sub Replace_by_VAL() ' в выбранном диапазоне в не скрытых ячейках заменить формулы на значения Dim rRng As Range, rAr As Range On Error Resume Next With ActiveWindow.RangeSelection.Cells If .Count = 1 Or .MergeCells Then .Item(1) = .Item(1).Value: .Item(1).Font.Color = vbBlack: Exit Sub Else Set rRng = .SpecialCells(xlCellTypeFormulas).SpecialCells(xlCellTypeVisible) End If End With If rRng Is Nothing Then Exit Sub For Each rAr In rRng.Areas: rAr.Value = rAr.Value: Next rRng.Select rRng.Font.Color = vbBlack End Sub
[/vba] но что-то, кажется, перемудрил... А разбираться уже опять некогда.Alex_ST
tati_2000, как раз всю книгу, оказывается, проще обработать, чем выделенный ограниченный диапазон. Ну, что-то типа этого:[vba]
Код
Sub Replace_by_VAL_in_WB() ' во всей книге заменить формулы на значения Dim rRng As Range, rAr As Range, WSh As Worksheet For Each WSh In Worksheets Set rRng = WSh.Cells.SpecialCells(xlCellTypeFormulas) If Not rRng Is Nothing Then For Each rAr In rRng.Areas: rAr.Value = rAr.Value: Next rAr End If Next WSh End Sub
[/vba]
tati_2000, как раз всю книгу, оказывается, проще обработать, чем выделенный ограниченный диапазон. Ну, что-то типа этого:[vba]
Код
Sub Replace_by_VAL_in_WB() ' во всей книге заменить формулы на значения Dim rRng As Range, rAr As Range, WSh As Worksheet For Each WSh In Worksheets Set rRng = WSh.Cells.SpecialCells(xlCellTypeFormulas) If Not rRng Is Nothing Then For Each rAr In rRng.Areas: rAr.Value = rAr.Value: Next rAr End If Next WSh End Sub