关闭Excel兼容性检查器“重大功能损失”错误

时间:2013-02-27 20:42:08

标签: excel-vba excel-2010 vba excel

我发现,虽然可以通过代码编程禁用Excel的“兼容性检查器”(在ActiveWorkbook.CheckCompatibility = False调用之前使用SaveAs,或者通过捕获ActiveWorkbook.BeforeSave全局禁用Excel的“兼容性检查器”事件),如果检测到“显着的功能丧失”,它似乎不起作用。快速测试方法:

  • 创建新的Excel 2010工作簿。
  • 选择A1:A2并选择条件格式(无关紧要)。
  • 选择A2:A3并选择其他条件格式。 A2应该应用两种不同的条件格式。
  • 打开VBA编辑器,将以下代码添加到Workbook模块:

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        ActiveWorkbook.CheckCompatibility = False
    End Sub
    
  • 在代码中加一个断点。

  • 返回电子表格,选择文件>另存为。代码将立即跳转到断点。如果单步执行代码,则可以在“立即”窗格中验证CheckCompatibility设置。
  • 代码完成后,选择Excel 97-2003文件类型,然后单击“保存”。
  • 兼容性检查程序仍然出现。

我怀疑这是因为错误不是“次要兼容性问题”(参见http://msdn.microsoft.com/en-us/library/office/gg132972(v=office.14).aspx)但我没做什么似乎可以抑制此错误,甚至没有创建一个注册表项来禁用它。任何人都知道如何抑制检查器即使“显着”不兼容?

ETA:我没有涉及很多不必要的细节,我正在尝试自动化一个过程,在这个过程中打开了许多供应商模板,填充了数据,根据一组巨大的(并且总是略有不同)质量控制进行处理规则,并保存为.xls文件(根据供应商的要求)。因为在无人值守系统上每两个小时就会出现几十种不同的模板工作簿,所以我不能简单地在每个工作簿的基础上取消选中兼容性要求。我的意思是,我想我可以,但那将成为我的全职工作。我需要能够在运行时关闭任何工作簿的兼容性检查,这是第一次,无需人工干预。

2 个答案:

答案 0 :(得分:1)

尝试将Application.DisplayAlerts = False作为解决方法。

答案 1 :(得分:0)

创建了一个并非完全功能齐全的解决方法,但它至少可以满足我个人需要的一切;也许它会成为别人的起点。请注意,这并不能解决所有情况下的兼容性检查程序,只是在自定义格式重叠的情况下。

简而言之,它遍历所有活动单元格,对于包含条件格式的任何单元格,评估是否应该应用自定义格式(按正确顺序),然​​后手动应用它。最后,删除所有自定义格式。这使工作簿格式化,但删除了强制出现兼容性检查器的原因。 YMMV。

Sub FlattenFormats()
    Dim wb As Workbook
    Set wb = ActiveWorkbook
    Dim asheet As Worksheet
    Set asheet = wb.ActiveSheet

    Dim cellvalue_regex As New RegExp
    cellvalue_regex.Pattern = "^""(.*)""$"

    Dim c As Range
    Dim conds As Collection

    For Each c In asheet.UsedRange.SpecialCells(xlCellTypeAllFormatConditions)
        If c.FormatConditions.Count > 0 Then
            Set conds = New Collection
            Dim fc As FormatCondition
            Set fc = Nothing
            For Each fc In c.FormatConditions
                conds.Add fc
            Next fc
            c.FormatConditions.Delete

            Sort conds

            Set fc = Nothing
            For Each fc In conds
                Select Case fc.Type
                    Case XlFormatConditionType.xlCellValue
                        Dim theMatches As MatchCollection
                        Set theMatches = cellvalue_regex.Execute(fc.Formula1)
                        Dim match1 As Match
                        Set match1 = theMatches.Item(0)
                        Dim checkFor As String
                        checkFor = match1.SubMatches(0)
                        If c.Value2 = checkFor Then
                            c.Interior.Color = fc.Interior.Color
                            If fc.StopIfTrue Then
                                Exit For
                            End If
                        End If
                    Case XlFormatConditionType.xlExpression
                        If Evaluate(fc.Formula1) Then
                            c.Interior.Color = fc.Interior.Color
                            If fc.StopIfTrue Then
                                Exit For
                            End If
                        End If
                End Select
            Next fc
        End If
    Next c

    ActiveSheet.Cells.FormatConditions.Delete
End Sub

Private Sub Sort(ByRef c As Collection)
    Dim i As Integer, j As Integer
    Dim temp As FormatCondition
    Dim i_item As FormatCondition, j_item As FormatCondition

    For i = 1 To c.Count - 1
        Set i_item = c(i)

        For j = i + 1 To c.Count
            Set j_item = c(j)

            If i_item.Priority > j_item.Priority Then
                Set temp = c(j)
                c.Remove j
                c.Add temp, temp.Priority, i
            End If
        Next j
    Next i
End Sub