Excel:使条件格式化为静态

有没有办法将条件格式转换为Excel中的静态格式?

我试图导出一个Excel工作表的范围到一个新的工作簿,具有相同的外观,但没有公式,链接等。这里的问题是,我有条件格式依赖于导出范围以外的计算。

我已经尝试将工作簿保存为.html,奇怪的是,在IE中格式化显示,而不是在Excel中重新打开时。

下面的想法是从这里采取的,虽然修改,以适应一些新的条件格式结构和您的需求。

它的工作原理是这样的:给定一个带有条件格式的工作簿(制作你的副本),你可以在Sub a()中select你想要从有条件格式转换为直接格式的单元格的范围,然后运行macros。 之后,只需手动删除条件格式,并presto!

对不起,代码长度…生活有时是这样的:(

Option Explicit Sub a() Dim iconditionno As Integer Dim rng, rgeCell As Range Set rng = Range("A1:A10") For Each rgeCell In rng If rgeCell.FormatConditions.Count <> 0 Then iconditionno = ConditionNo(rgeCell) If iconditionno <> 0 Then rgeCell.Interior.ColorIndex = rgeCell.FormatConditions(iconditionno).Interior.ColorIndex rgeCell.Font.ColorIndex = rgeCell.FormatConditions(iconditionno).Font.ColorIndex End If End If Next rgeCell End Sub Private Function ConditionNo(ByVal rgeCell As Range) As Integer Dim iconditionscount As Integer Dim objFormatCondition As FormatCondition For iconditionscount = 1 To rgeCell.FormatConditions.Count Set objFormatCondition = rgeCell.FormatConditions(iconditionscount) Select Case objFormatCondition.Type Case xlCellValue Select Case objFormatCondition.Operator Case xlBetween: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True And _ Compare(rgeCell.Value, "<=", objFormatCondition.Formula2) = True Then _ ConditionNo = iconditionscount Case xlNotBetween: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True And _ Compare(rgeCell.Value, ">=", objFormatCondition.Formula2) = True Then _ ConditionNo = iconditionscount Case xlGreater: If Compare(rgeCell.Value, ">", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlEqual: If Compare(rgeCell.Value, "=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlGreaterEqual: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlLess: If Compare(rgeCell.Value, "<", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlLessEqual: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlNotEqual: If Compare(rgeCell.Value, "<>", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount If ConditionNo > 0 Then Exit Function End Select Case xlExpression If Application.Evaluate(objFormatCondition.Formula1) Then ConditionNo = iconditionscount Exit Function End If End Select Next iconditionscount End Function Private Function Compare(ByVal vValue1 As Variant, _ ByVal sOperator As String, _ ByVal vValue2 As Variant) As Boolean If Left(CStr(vValue1), 1) = "=" Then vValue1 = Application.Evaluate(vValue1) If Left(CStr(vValue2), 1) = "=" Then vValue2 = Application.Evaluate(vValue2) If IsNumeric(vValue1) = True Then vValue1 = CDbl(vValue1) If IsNumeric(vValue2) = True Then vValue2 = CDbl(vValue2) Select Case sOperator Case "=": Compare = (vValue1 = vValue2) Case "<": Compare = (vValue1 < vValue2) Case "<=": Compare = (vValue1 <= vValue2) Case ">": Compare = (vValue1 > vValue2) Case ">=": Compare = (vValue1 >= vValue2) Case "<>": Compare = (vValue1 <> vValue2) End Select End Function 

当人们说“嘿,你为什么不以这种方式做整个事情”时,我讨厌它,但是我只是把它扔在那里:当我以前想要这样做时,我已经做到了通过首先复制有问题的整个工作表,然后复制并粘贴公式作为值(根本不移动它们的位置)。 这会明显冻结条件格式,但也意味着重新计算工作簿不会为您留下不适合格式化的值。

如果这不起作用,Belisarius的代码看起来很棒。

我已经把Belisarius和Cameron Forward的join。 你必须select你想冻结的区域(大的select可能需要一段时间)。 我注意到,如果在单元格上出现excel错误,可能会导致exception,但在Excel 2010中这是非常有效的。顺便说一句,谢谢大家!


 Option Explicit Sub FreezeConditionalFormattingOnSelection() Call FreezeConditionalFormatting(Selection) Selection.FormatConditions.Delete End Sub Public Function FreezeConditionalFormatting(Rng As Range) Rem Originally posted by http://stackoverflow.com/users/353410/belisarius Rem at http://stackoverflow.com/questions/4692918/excel-make-conditional-formatting-static Rem Modified 2012-04-20 by gcl to: Rem (a) be a function taking target range as an argument, and Rem (b) to cancel any multiple selection before processing in order to work around a bug Rem in Excel 2003 wherein querying the formula on any cell in a multiple/extended selection Rem returns the conditional formatting on the first cell in that selection! Rem (c) return number of cells that it modified. Dim iconditionno As Integer Dim rgeCell As Range Dim nCFCells As Integer Dim rgeOldSelection As Range Set rgeOldSelection = Selection 'new nCFCells = 0 For Each rgeCell In Rng rgeCell.Select 'new If rgeCell.FormatConditions.Count <> 0 Then iconditionno = ConditionNo(rgeCell) If iconditionno <> 0 Then rgeCell.Interior.ColorIndex = rgeCell.FormatConditions(iconditionno).Interior.ColorIndex rgeCell.Font.ColorIndex = rgeCell.FormatConditions(iconditionno).Font.ColorIndex nCFCells = nCFCells + 1 End If End If Next rgeCell rgeOldSelection.Select 'new FreezeConditionalFormatting = nCFCells End Function Private Function ConditionNo(ByVal rgeCell As Range) As Integer Rem posted by http://stackoverflow.com/users/353410/belisarius Rem at http://stackoverflow.com/questions/4692918/excel-make-conditional-formatting-static Dim iconditionscount As Integer Dim objFormatCondition As FormatCondition Dim f3 As String For iconditionscount = 1 To rgeCell.FormatConditions.Count Set objFormatCondition = rgeCell.FormatConditions(iconditionscount) Select Case objFormatCondition.Type Case xlCellValue Select Case objFormatCondition.Operator Case xlBetween: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True And _ Compare(rgeCell.Value, "<=", objFormatCondition.Formula2) = True Then _ ConditionNo = iconditionscount Case xlNotBetween: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True And _ Compare(rgeCell.Value, ">=", objFormatCondition.Formula2) = True Then _ ConditionNo = iconditionscount Case xlGreater: If Compare(rgeCell.Value, ">", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlEqual: If Compare(rgeCell.Value, "=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlGreaterEqual: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlLess: If Compare(rgeCell.Value, "<", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlLessEqual: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlNotEqual: If Compare(rgeCell.Value, "<>", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount If ConditionNo > 0 Then Exit Function End Select Case xlExpression f3 = objFormatCondition.Formula1 f3 = Application.ConvertFormula(Formula:=f3, FromReferenceStyle:=xlA1, ToReferenceStyle:=xlR1C1, RelativeTo:=objFormatCondition.AppliesTo.Cells(1, 1)) f3 = Application.ConvertFormula(Formula:=f3, FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlR1C1, ToAbsolute:=xlAbsolute, RelativeTo:=rgeCell) f3 = Application.ConvertFormula(Formula:=f3, FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlA1) If Application.Evaluate(f3) Then ConditionNo = iconditionscount Exit Function End If End Select Next iconditionscount End Function Private Function Compare(ByVal vValue1 As Variant, _ ByVal sOperator As String, _ ByVal vValue2 As Variant) As Boolean If Left(CStr(vValue1), 1) = "=" Then vValue1 = Application.Evaluate(vValue1) If Left(CStr(vValue2), 1) = "=" Then vValue2 = Application.Evaluate(vValue2) If IsNumeric(vValue1) = True Then vValue1 = CDbl(vValue1) If IsNumeric(vValue2) = True Then vValue2 = CDbl(vValue2) Select Case sOperator Case "=": Compare = (vValue1 = vValue2) Case "<": Compare = (vValue1 < vValue2) Case "<=": Compare = (vValue1 <= vValue2) Case ">": Compare = (vValue1 > vValue2) Case ">=": Compare = (vValue1 >= vValue2) Case "<>": Compare = (vValue1 <> vValue2) End Select End Function 

感谢Belisarius非常有用的答案! 但是,它会在Excel 2003中遇到一个错误,其中在多个/扩展select中的任何单元格上查询条件格式公式将返回该select中第一个单元格的公式。 要解决这个问题,我必须在开始时取消任何select,并在最后恢复。 我也改变了他的子程序到一个函数,该函数接受一个范围并返回被修改的单元格的数量,并添加了一个包装器子例程,将其应用到当前的select,并删除任何条件格式(因为它不再需要),所以你不再需要修改它来硬编码你的目标范围。

 Option Explicit Sub FreezeConditionalFormattingOnSelection() Call FreezeConditionalFormatting(Selection) Selection.FormatConditions.Delete End Sub Public Function FreezeConditionalFormatting(rng As Range) Rem Originally posted by http://stackoverflow.com/users/353410/belisarius Rem at http://stackoverflow.com/questions/4692918/excel-make-conditional-formatting-static Rem Modified 2012-04-20 by gcl to: Rem (a) be a function taking target range as an argument, and Rem (b) to cancel any multiple selection before processing in order to work around a bug Rem in Excel 2003 wherein querying the formula on any cell in a multiple/extended selection Rem returns the conditional formatting on the first cell in that selection! Rem (c) return number of cells that it modified. Dim iconditionno As Integer Dim rgeCell As Range Dim nCFCells As Integer Dim rgeOldSelection As Range Set rgeOldSelection = Selection 'new nCFCells = 0 For Each rgeCell In rng rgeCell.Select 'new If rgeCell.FormatConditions.Count <> 0 Then iconditionno = ConditionNo(rgeCell) If iconditionno <> 0 Then rgeCell.Interior.ColorIndex = rgeCell.FormatConditions(iconditionno).Interior.ColorIndex rgeCell.Font.ColorIndex = rgeCell.FormatConditions(iconditionno).Font.ColorIndex nCFCells = nCFCells + 1 End If End If Next rgeCell rgeOldSelection.Select 'new FreezeConditionalFormatting = nCFCells End Function Private Function ConditionNo(ByVal rgeCell As Range) As Integer Rem posted by http://stackoverflow.com/users/353410/belisarius Rem at http://stackoverflow.com/questions/4692918/excel-make-conditional-formatting-static Dim iconditionscount As Integer Dim objFormatCondition As FormatCondition For iconditionscount = 1 To rgeCell.FormatConditions.Count Set objFormatCondition = rgeCell.FormatConditions(iconditionscount) Select Case objFormatCondition.Type Case xlCellValue Select Case objFormatCondition.Operator Case xlBetween: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True And _ Compare(rgeCell.Value, "<=", objFormatCondition.Formula2) = True Then _ ConditionNo = iconditionscount Case xlNotBetween: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True And _ Compare(rgeCell.Value, ">=", objFormatCondition.Formula2) = True Then _ ConditionNo = iconditionscount Case xlGreater: If Compare(rgeCell.Value, ">", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlEqual: If Compare(rgeCell.Value, "=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlGreaterEqual: If Compare(rgeCell.Value, ">=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlLess: If Compare(rgeCell.Value, "<", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlLessEqual: If Compare(rgeCell.Value, "<=", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount Case xlNotEqual: If Compare(rgeCell.Value, "<>", objFormatCondition.Formula1) = True Then _ ConditionNo = iconditionscount If ConditionNo > 0 Then Exit Function End Select Case xlExpression If Application.Evaluate(objFormatCondition.Formula1) Then ConditionNo = iconditionscount Exit Function End If End Select Next iconditionscount End Function Private Function Compare(ByVal vValue1 As Variant, _ ByVal sOperator As String, _ ByVal vValue2 As Variant) As Boolean If Left(CStr(vValue1), 1) = "=" Then vValue1 = Application.Evaluate(vValue1) If Left(CStr(vValue2), 1) = "=" Then vValue2 = Application.Evaluate(vValue2) If IsNumeric(vValue1) = True Then vValue1 = CDbl(vValue1) If IsNumeric(vValue2) = True Then vValue2 = CDbl(vValue2) Select Case sOperator Case "=": Compare = (vValue1 = vValue2) Case "<": Compare = (vValue1 < vValue2) Case "<=": Compare = (vValue1 <= vValue2) Case ">": Compare = (vValue1 > vValue2) Case ">=": Compare = (vValue1 >= vValue2) Case "<>": Compare = (vValue1 <> vValue2) End Select End Function 

我在excel.tips.com上find了这个补充,使之适用于Excel 2010,并将其改编为gcl版本的Belisarius的post。 在xlExpression案例下replace这一行:

 If Application.Evaluate(objFormatCondition.Formula1) Then 

有了这个:

 f3 = objFormatCondition.Formula1 f3 = Application.ConvertFormula(Formula:=f3, FromReferenceStyle:=xlA1, ToReferenceStyle:=xlR1C1, RelativeTo:=objFormatCondition.AppliesTo.Cells(1, 1)) f3 = Application.ConvertFormula(Formula:=f3, FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlR1C1, ToAbsolute:=xlAbsolute, RelativeTo:=rgeCell) f3 = Application.ConvertFormula(Formula:=f3, FromReferenceStyle:=xlR1C1, ToReferenceStyle:=xlA1) If Application.Evaluate(f3) Then 

它使公式传播正确。