我发现,虽然可以通过代码编程禁用Excel的“兼容性检查器”(在ActiveWorkbook.CheckCompatibility = False
调用之前使用SaveAs
,或者通过捕获ActiveWorkbook.BeforeSave
全局禁用Excel的“兼容性检查器”事件),如果检测到“显着的功能丧失”,它似乎不起作用。快速测试方法:
打开VBA编辑器,将以下代码添加到Workbook模块:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveWorkbook.CheckCompatibility = False
End Sub
在代码中加一个断点。
CheckCompatibility
设置。我怀疑这是因为错误不是“次要兼容性问题”(参见http://msdn.microsoft.com/en-us/library/office/gg132972(v=office.14).aspx)但我没做什么似乎可以抑制此错误,甚至没有创建一个注册表项来禁用它。任何人都知道如何抑制检查器即使“显着”不兼容?
ETA:我没有涉及很多不必要的细节,我正在尝试自动化一个过程,在这个过程中打开了许多供应商模板,填充了数据,根据一组巨大的(并且总是略有不同)质量控制进行处理规则,并保存为.xls文件(根据供应商的要求)。因为在无人值守系统上每两个小时就会出现几十种不同的模板工作簿,所以我不能简单地在每个工作簿的基础上取消选中兼容性要求。我的意思是,我想我可以,但那将成为我的全职工作。我需要能够在运行时关闭任何工作簿的兼容性检查,这是第一次,无需人工干预。
答案 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