2

コードを介して(呼び出しActiveWorkbook.CheckCompatibility = Falseの前に、またはイベントをトラップすることによってグローバルにを使用して)E​​xcelの「互換性チェッカー」をプログラムで無効にすることは可能ですが、「機能」が検出されました。これをテストする簡単な方法:SaveAsActiveWorkbook.BeforeSave

  • 新しいExcel2010ブックを作成します。
  • A1:A2を選択し、条件付き書式を選択します(何でも構いません)。
  • A2:A3を選択し、別の条件付き書式を選択します。A2には、2つの異なる条件付きフォーマットを適用する必要があります。
  • VBAエディターを開き、次のコードをワークブックモジュールに追加します。

    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時間ごとに数十の異なるテンプレートワークブックで発生するため、ワークブックごとに互換性要件のチェックを外すことはできません。つまり、できると思いますが、それが私のフルタイムの仕事になるでしょう。人間の介入なしに、初めてブックの実行時に互換性チェックをオフにできるようにする必要があります。

4

2 に答える 2

4

回避策として、Application.DisplayAlerts=Falseを試してください。

チャオ

于 2013-10-29T06:50:28.027 に答える
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
于 2013-03-11T20:00:47.100 に答える