Отключение средства проверки совместимости Excel для ошибок значительной потери функциональности

Я обнаружил, что, хотя можно программно отключить «Проверку совместимости» Excel с помощью кода (используя ActiveWorkbook.CheckCompatibility = False либо перед вызовом SaveAs, либо глобально, перехватывая событие ActiveWorkbook.BeforeSave), похоже, что это не работает, если есть « Обнаружена значительная потеря функциональности». Быстрый способ проверить это:

  • Создайте новую книгу 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 на панели Immediate.
  • После завершения кода выберите тип файла Excel 97-2003 и нажмите «Сохранить».
  • Проверка совместимости по-прежнему открывается.

Я подозреваю, что это связано с тем, что ошибка не является «незначительной проблемой совместимости» (см. http://msdn.microsoft.com/en-us/library/office/gg132972(v=office.14).aspx), но я ничего не делаю, чтобы подавить это ошибка, даже не создавая запись в реестре, чтобы отключить ее. Кто-нибудь знает, как подавить чекер даже при "значительной" несовместимости?

ETA: Не вдаваясь в ненужные подробности, я пытаюсь автоматизировать процесс, в котором несколько шаблонов поставщиков открываются, заполняются данными, обрабатываются в соответствии с огромным (и всегда немного отличающимся) набором правил контроля качества и сохранен обратно в виде файла .xls (в соответствии с требованиями поставщика). Поскольку это происходит с десятками различных рабочих книг шаблонов каждые два часа в автоматической системе, я не могу просто отменить требование совместимости для каждой рабочей книги. Я имею в виду, я полагаю, что мог бы, но это стало бы моей основной работой. Мне нужна возможность отключить проверку совместимости во время выполнения для любой книги в первый раз без вмешательства человека.


person mounty    schedule 27.02.2013    source источник
comment
Не проверял, но попробуйте Workbook.DoNotPromptForConvert в дополнение к Workbook.CheckCompatibility — см. здесь   -  person barrowc    schedule 28.02.2013
comment
Вы можете попробовать использовать msdn.microsoft.com /en-us/library/office/ для автоматизации взаимодействия с пользователем   -  person JustinJDavies    schedule 28.02.2013
comment
Флаг CheckCompatibility тоже не работал. Похоже, что событие BeforeSave запускается до появления диалогового окна пользовательского интерфейса, но проверка совместимости выполняется после закрытия окна.   -  person mounty    schedule 28.02.2013


Ответы (2)


Попробуйте Application.DisplayAlerts = False в качестве обходного пути.

Чао

person LeasMaps    schedule 29.10.2013

Создал обходной путь, который не является полностью полнофункциональным, но, по крайней мере, включает все, что мне лично нужно; может быть, это послужит отправной точкой для кого-то еще. Обратите внимание, что это не касается средства проверки совместимости во всех случаях, только в случае перекрытия пользовательских форматов.

В двух словах, это проходит через все активные ячейки и для любой ячейки, содержащей условный формат, оценивает, следует ли применять пользовательское форматирование (в правильном порядке), а затем применяет его вручную. Наконец, все пользовательские форматы удаляются. Это оставляет книгу отформатированной, но устраняет причину принудительного появления средства проверки совместимости. 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
person mounty    schedule 11.03.2013