和風スパゲティのレシピ

日本語でコーディングするExcelVBA

4種のAIによるExcelVBAコーディング性能比較

ChatGPTやCopilotをはじめとした生成AIは、
もちろんExcelVBAのマクロ作成やコーディングもこなします。

各AIも日々進化しており、驚くレベルのコードも生成してくれるようになりました。


さてこの生成AI、今ではかなりの種類がリリースされており、
無料で使えるものでも10種類以上に上ると思います。

今回はこれら生成AIの中でメジャーなものをピックアップし、
どのAIがExcelVBA開発に向いているかを比較検証してみました。

今回使用する生成AIは以下の4つです!
※ すべて無料版を使用しています。

  • ChatGPT
  • Copilot
  • Gemini
  • Claude

自分の右腕にどのAIを採用するかの参考にしていただければと思います。


なお、本比較はExcel&VBAの総合コミュニティ「Excel-Fun.xls*」主催のイベント
「第1回 AIサービス別VBAコード生成比較大会」
にて登壇させていただいたものになります。


私を含めて9名の審査員が上記4つのAIを評価し、
全員の採点を元に総合優勝AIを決定しました!

Youtubeの配信アーカイブを公開しておりますので、
是非ご視聴いただき9名の評価を見比べてみてください!

比較内容(コーディングルール)

比較テーマ

今回は「VBA&AI初学者に優しい生成AIはどれ?」をテーマに比較しました。

プロンプトは練らず、マクロ仕様もそこまで正確には伝えない想定で、
初学者のお供として一番優秀なAIがどれかを検証しています。

比較するAI

以下の4つのAIを比較します。
すべて無料版を利用し、パーソナライズを切った新しいチャットを使用します。

  • ChatGPT
  • Copilot
  • Gemini
  • Claude

なお、この評価は2025/10/6に行ったものです。

AIの進歩は日進月歩で、数ヶ月後には全く違う結果になっているかもしれません。
その点にご了承いただきご参考いただければと思います。

作成するマクロ

二つのシートの差分を取るマクロを作ってもらいます。

値だけなく、書式や図形などにも差分を作った2シートでテストします。

差分をチェックする2シート

プロンプト

初回のプロンプトは以下に統一します。

2つのシートの違いの検出するマクロを作ってください。
値だけでなく書式や図形などの違いも検出して下さい。
変数名は日本語にしてください。

試行回数

1つのチャット内で機能追加や仕様の変更は行いません。

実行してみてエラーが起きた場合には追加のチャットを送信し、
エラー発生コードとエラーメッセージのみを記載して修正を依頼します。


エラーがなくなり次第完成とし、最後に
「今回のコードを解説してください」
と依頼して解説力も検証します。


上記一連の流れを「1チャットの試行」とし、
これを各AI3回ずつ実行して安定性も検証します。

採点項目

以下の6項目を採点しました。

実行精度 結果が正しいか。エラーがでないか。不具合がないか。
デバッグ力 発生したエラーに適切にアドバイスできたか
可読性 ロジックや識別子が読みやすいか
ユーザビリティ ユーザー目線の機能やUIが配慮されているか
安定性 同じプロンプトでどの程度同じコードを生成するか
解説力 コードの解説が分かりやすいか

10点満点で評価し、5を及第点、7を合格点くらいの目安で採点しています。


それでは各AIの結果をご覧ください!

全AI採点結果

ChatGPT Copilot Gemini Claude
実行精度 7 4 3 8
デバッグ力 5 4 4 6
可読性 7 3 6 3
ユーザビリティ 7 3 4 2
安定性 6 2 6 2
解説力 4 4 7 4
総合評価 6.0 3.3 5.0 4.2

優勝 \ 🎊 ChatGPT 🎉 /

総評

初学者が使うのにもっとも優れたAIはChatGPTという結果になりました。


コーディング力が最も優れているという評判のClaudeですが、
意外にも性能を持て余してしまっていましたね。

しっかり勉強したプロンプトを投げれば素晴らしい相棒になる片鱗は見えましたが、
曖昧なプロンプトを送るとその性能が仇になっている印象です。

プロシージャ分割や複雑なエラー処理を書いてしまうため、
初学者にはかなり難読なコードが生成されてしまいました。


反面、ChatGPTは素直なコードを生成してくれており、
性能やユーザービリティも合格点と、バランスのいいAIでした。

難読化しないレベルでほどよくエラー処理も入っていますし、
初学者が使うには文句なく親しみやすいAIだと思います。


面白かったGeminiで、他のAIよりだいぶおしゃべりでした。

図形の差分判定について、
「それは難しいから簡単にはできない。理由は~」
と、ギブアップしたうえでその言い訳説明をしてきたり、

エラー処理について、他のAIは修正コードを書いてくれたのに、
「こんな原因が予想されるので書き替えてみてください」
と、言葉でエラーを説明してきたり、かなり特徴的でした。


他のAIが「部下のプログラマ」的な動きをするのに対し、
Geminiは「アドバイザー」の立ち位置だった印象ですね。

これはかなり好みが分かれる要素かもしれません。


Copilotについては。。。笑
ChatGPTの劣化版という感じで、あまりうまくいきませんでしたね。

ExcelVBAはあなたの会社の製品ですが。。。それでいいのかCopilot笑


と、こんな総評でした。

今回は「初学者が使うにはどれ?」対決だったためChatGPTに軍配があがりましたが、

  • 初学者が使うにはいちばんやさしいChatGPT
  • プロンプトを学んで使いこなせば最強のClaude
  • おしゃべりが好きなGemini

と、結構特徴が出ていて面白かったですね。

皆さんもこの結果を参考に、自分のお供にどのAIを従えるか研究してみてください。

おまけ:ChatGPTのパーソナライズ機能について

私は普段ChatGPTを使うことが多く、特にこのブログを書くときのお供にしています。
※ ブログをAIに書かせることはしていません。添削やテストコードの生成です。

その結果、私を「和風スパゲティのレシピ執筆者」とは認識してくれているようで、
結構私の文章テイストを理解してコーディングもしてくれたりします。


このパーソナライズはどのくらい効果があるのだろう?と気になったので、
今回の採点とは別に、学習込のChatGPTに同じマクロを作ってもらいました。




その結果は。。。




ほとんど違いはありませんでした笑



せめて変数名とか普段のブログに寄せてくれるかと思ったのですが、
それすらなく、ほとんど上記の採点時と同じコードに。

君は普段和風スパゲティのレシピを読んで何を学んでいるのか(#^ω^)


まあ一応と言えば一応、
「変数名は日本語にしてください」
このプロンプトがなくても変数は日本語で出してくれました。


一番大事なそこだけは守ってくれたので許してあげることにします。


と、冗談はさておき、パーソナライズはなかなか反映されないようですが、

  • 「コーディング規約」をブログに書いて
  • URLを渡して「この通りコーディングせよ!」

は試してみたいところですよね。

近々やってみようと思いますので乞うご期待(`・ω・´)!

評価の詳細と各AIのソースコード

評価の詳細、各AIの生成コード、差分結果シートを、
以下のExcelファイルにまとめましたのでご参考ください。
4種のAIによるExcelVBAコーディング性能比較.xlsm


パッと見れるよう、画像はこちらにも置いておきますね。
4種のAIによるExcelVBAコーディング性能比較


各AIの3回中最良のソースコードもこちらに置いておきます。

ChatGPT

Option Explicit

Sub シート比較マクロ1()

    Dim シート1 As Worksheet
    Dim シート2 As Worksheet
    Dim 結果シート As Worksheet
    Dim 最終行 As Long, 最終列 As Long
    Dim 行番号 As Long, 列番号 As Long
    Dim 結果行 As Long
    Dim セル1 As Range, セル2 As Range
    Dim 図形1 As Shape, 図形2 As Shape
    Dim 一致フラグ As Boolean
    Dim 図形存在フラグ As Boolean
    
    '=== 比較するシートを指定 ===
    Set シート1 = ThisWorkbook.Sheets("Sheet1")
    Set シート2 = ThisWorkbook.Sheets("Sheet2")
    
    '=== 結果出力用シートを作成 ===
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("比較結果").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    
    Set 結果シート = Worksheets.Add
    結果シート.Name = "比較結果"
    
    '=== 見出し行 ===
    結果シート.Range("A1:E1").Value = Array("種類", "セル(または図形)", "Sheet1の内容", "Sheet2の内容", "違いの内容")
    結果行 = 2
    
    '=== セル比較 ===
    最終行 = Application.Max(シート1.UsedRange.Rows.Count, シート2.UsedRange.Rows.Count)
    最終列 = Application.Max(シート1.UsedRange.Columns.Count, シート2.UsedRange.Columns.Count)
    
    For 行番号 = 1 To 最終行
        For 列番号 = 1 To 最終列
            
            Set セル1 = シート1.Cells(行番号, 列番号)
            Set セル2 = シート2.Cells(行番号, 列番号)
            
            ' 値の比較
            If セル1.Value <> セル2.Value Then
                結果シート.Cells(結果行, 1).Value = "値"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 3).Value = セル1.Value
                結果シート.Cells(結果行, 4).Value = セル2.Value
                結果シート.Cells(結果行, 5).Value = "値が異なります"
                結果行 = 結果行 + 1
            End If
            
            ' 書式の比較
            If セル1.Font.Name <> セル2.Font.Name Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "フォント名が異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Font.Size <> セル2.Font.Size Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "フォントサイズが異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Interior.Color <> セル2.Interior.Color Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "セルの塗りつぶし色が異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Font.Color <> セル2.Font.Color Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "文字色が異なります"
                結果行 = 結果行 + 1
            End If
            
        Next 列番号
    Next 行番号

    '=== 図形の比較 ===
    Dim 図形辞書1 As Object, 図形辞書2 As Object
    Set 図形辞書1 = CreateObject("Scripting.Dictionary")
    Set 図形辞書2 = CreateObject("Scripting.Dictionary")
    
    For Each 図形1 In シート1.Shapes
        図形辞書1(図形1.Name) = 図形1
    Next
    
    For Each 図形2 In シート2.Shapes
        図形辞書2(図形2.Name) = 図形2
    Next
    
    ' Sheet1にあってSheet2にない図形
    For Each 図形1 In シート1.Shapes
        If Not 図形辞書2.exists(図形1.Name) Then
            結果シート.Cells(結果行, 1).Value = "図形"
            結果シート.Cells(結果行, 2).Value = 図形1.Name
            結果シート.Cells(結果行, 5).Value = "Sheet1にのみ存在"
            結果行 = 結果行 + 1
        End If
    Next
    
    ' Sheet2にあってSheet1にない図形
    For Each 図形2 In シート2.Shapes
        If Not 図形辞書1.exists(図形2.Name) Then
            結果シート.Cells(結果行, 1).Value = "図形"
            結果シート.Cells(結果行, 2).Value = 図形2.Name
            結果シート.Cells(結果行, 5).Value = "Sheet2にのみ存在"
            結果行 = 結果行 + 1
        Else
            ' 共通する図形の位置・サイズ・種類の比較
            Set 図形1 = 図形辞書1(図形2.Name)
            If 図形1.Left <> 図形2.Left Or 図形1.Top <> 図形2.Top _
                Or 図形1.Width <> 図形2.Width Or 図形1.Height <> 図形2.Height Then
                
                結果シート.Cells(結果行, 1).Value = "図形"
                結果シート.Cells(結果行, 2).Value = 図形2.Name
                結果シート.Cells(結果行, 5).Value = "位置またはサイズが異なります"
                結果行 = 結果行 + 1
            End If
        End If
    Next
    
    MsgBox "比較が完了しました。結果は「比較結果」シートに出力されました。", vbInformation

End Sub

Sub シート比較マクロ2()

    Dim シート1 As Worksheet
    Dim シート2 As Worksheet
    Dim 結果シート As Worksheet
    Dim 最終行 As Long, 最終列 As Long
    Dim 行番号 As Long, 列番号 As Long
    Dim 結果行 As Long
    Dim セル1 As Range, セル2 As Range
    Dim1 As Variant,2 As Variant
    Dim 図形1 As Shape, 図形2 As Shape
    Dim 図形辞書1 As Object, 図形辞書2 As Object
    
    '=== 比較するシートを指定 ===
    Set シート1 = ThisWorkbook.Sheets("Sheet1")
    Set シート2 = ThisWorkbook.Sheets("Sheet2")
    
    '=== 結果出力用シートを作成 ===
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("比較結果").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    
    Set 結果シート = Worksheets.Add
    結果シート.Name = "比較結果"
    
    '=== 見出し行 ===
    結果シート.Range("A1:E1").Value = Array("種類", "セル(または図形)", "Sheet1の内容", "Sheet2の内容", "違いの内容")
    結果行 = 2
    
    '=== セル比較 ===
    最終行 = Application.Max(シート1.UsedRange.Rows.Count, シート2.UsedRange.Rows.Count)
    最終列 = Application.Max(シート1.UsedRange.Columns.Count, シート2.UsedRange.Columns.Count)
    
    For 行番号 = 1 To 最終行
        For 列番号 = 1 To 最終列
            
            Set セル1 = シート1.Cells(行番号, 列番号)
            Set セル2 = シート2.Cells(行番号, 列番号)1 = セル1.Value2 = セル2.Value
            
            '=== 値の比較(型安全版) ===
            If IsError(1) Or IsError(2) Then
                If Not (IsError(1) And IsError(2)) Then
                    結果シート.Cells(結果行, 1).Value = "値"
                    結果シート.Cells(結果行, 2).Value = セル1.Address
                    結果シート.Cells(結果行, 3).Value = IIf(IsError(1), "エラー",1)
                    結果シート.Cells(結果行, 4).Value = IIf(IsError(2), "エラー",2)
                    結果シート.Cells(結果行, 5).Value = "一方にエラー値があります"
                    結果行 = 結果行 + 1
                End If
            Else
                If CStr(1) <> CStr(2) Then
                    結果シート.Cells(結果行, 1).Value = "値"
                    結果シート.Cells(結果行, 2).Value = セル1.Address
                    結果シート.Cells(結果行, 3).Value =1
                    結果シート.Cells(結果行, 4).Value =2
                    結果シート.Cells(結果行, 5).Value = "値が異なります"
                    結果行 = 結果行 + 1
                End If
            End If
            
            '=== 書式の比較 ===
            If セル1.Font.Name <> セル2.Font.Name Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "フォント名が異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Font.Size <> セル2.Font.Size Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "フォントサイズが異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Interior.Color <> セル2.Interior.Color Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "セルの塗りつぶし色が異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Font.Color <> セル2.Font.Color Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "文字色が異なります"
                結果行 = 結果行 + 1
            End If
            
        Next 列番号
    Next 行番号

    '=== 図形の比較 ===
    Set 図形辞書1 = CreateObject("Scripting.Dictionary")
    Set 図形辞書2 = CreateObject("Scripting.Dictionary")
    
    For Each 図形1 In シート1.Shapes
        図形辞書1(図形1.Name) = 図形1
    Next
    
    For Each 図形2 In シート2.Shapes
        図形辞書2(図形2.Name) = 図形2
    Next
    
    ' Sheet1にあってSheet2にない図形
    For Each 図形1 In シート1.Shapes
        If Not 図形辞書2.exists(図形1.Name) Then
            結果シート.Cells(結果行, 1).Value = "図形"
            結果シート.Cells(結果行, 2).Value = 図形1.Name
            結果シート.Cells(結果行, 5).Value = "Sheet1にのみ存在"
            結果行 = 結果行 + 1
        End If
    Next
    
    ' Sheet2にあってSheet1にない図形
    For Each 図形2 In シート2.Shapes
        If Not 図形辞書1.exists(図形2.Name) Then
            結果シート.Cells(結果行, 1).Value = "図形"
            結果シート.Cells(結果行, 2).Value = 図形2.Name
            結果シート.Cells(結果行, 5).Value = "Sheet2にのみ存在"
            結果行 = 結果行 + 1
        Else
            ' 共通図形の位置・サイズ比較
            Set 図形1 = 図形辞書1(図形2.Name)
            If 図形1.Left <> 図形2.Left Or 図形1.Top <> 図形2.Top _
                Or 図形1.Width <> 図形2.Width Or 図形1.Height <> 図形2.Height Then
                
                結果シート.Cells(結果行, 1).Value = "図形"
                結果シート.Cells(結果行, 2).Value = 図形2.Name
                結果シート.Cells(結果行, 5).Value = "位置またはサイズが異なります"
                結果行 = 結果行 + 1
            End If
        End If
    Next
    
    MsgBox "比較が完了しました。結果は「比較結果」シートに出力されました。", vbInformation

End Sub

Option Explicit

Sub シート比較マクロ3()

    Dim シート1 As Worksheet
    Dim シート2 As Worksheet
    Dim 結果シート As Worksheet
    Dim 最終行 As Long, 最終列 As Long
    Dim 行番号 As Long, 列番号 As Long
    Dim 結果行 As Long
    Dim セル1 As Range, セル2 As Range
    Dim1 As Variant,2 As Variant
    Dim 図形1 As Shape, 図形2 As Shape
    Dim 図形辞書1 As Object, 図形辞書2 As Object
    Dim 図形情報 As Variant
    
    '=== 比較するシートを指定 ===
    Set シート1 = ThisWorkbook.Sheets("Sheet1")
    Set シート2 = ThisWorkbook.Sheets("Sheet2")
    
    '=== 結果出力用シートを作成 ===
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("比較結果").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    
    Set 結果シート = Worksheets.Add
    結果シート.Name = "比較結果"
    
    '=== 見出し行 ===
    結果シート.Range("A1:E1").Value = Array("種類", "セル(または図形)", "Sheet1の内容", "Sheet2の内容", "違いの内容")
    結果行 = 2
    
    '=== セル比較 ===
    最終行 = Application.Max(シート1.UsedRange.Rows.Count, シート2.UsedRange.Rows.Count)
    最終列 = Application.Max(シート1.UsedRange.Columns.Count, シート2.UsedRange.Columns.Count)
    
    For 行番号 = 1 To 最終行
        For 列番号 = 1 To 最終列
            
            Set セル1 = シート1.Cells(行番号, 列番号)
            Set セル2 = シート2.Cells(行番号, 列番号)1 = セル1.Value2 = セル2.Value
            
            '=== 値の比較(型安全版) ===
            If IsError(1) Or IsError(2) Then
                If Not (IsError(1) And IsError(2)) Then
                    結果シート.Cells(結果行, 1).Value = "値"
                    結果シート.Cells(結果行, 2).Value = セル1.Address
                    結果シート.Cells(結果行, 3).Value = IIf(IsError(1), "エラー",1)
                    結果シート.Cells(結果行, 4).Value = IIf(IsError(2), "エラー",2)
                    結果シート.Cells(結果行, 5).Value = "一方にエラー値があります"
                    結果行 = 結果行 + 1
                End If
            Else
                If CStr(1) <> CStr(2) Then
                    結果シート.Cells(結果行, 1).Value = "値"
                    結果シート.Cells(結果行, 2).Value = セル1.Address
                    結果シート.Cells(結果行, 3).Value =1
                    結果シート.Cells(結果行, 4).Value =2
                    結果シート.Cells(結果行, 5).Value = "値が異なります"
                    結果行 = 結果行 + 1
                End If
            End If
            
            '=== 書式の比較 ===
            If セル1.Font.Name <> セル2.Font.Name Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "フォント名が異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Font.Size <> セル2.Font.Size Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "フォントサイズが異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Interior.Color <> セル2.Interior.Color Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "セルの塗りつぶし色が異なります"
                結果行 = 結果行 + 1
            End If
            
            If セル1.Font.Color <> セル2.Font.Color Then
                結果シート.Cells(結果行, 1).Value = "書式"
                結果シート.Cells(結果行, 2).Value = セル1.Address
                結果シート.Cells(結果行, 5).Value = "文字色が異なります"
                結果行 = 結果行 + 1
            End If
            
        Next 列番号
    Next 行番号

    '=== 図形の比較 ===
    Set 図形辞書1 = CreateObject("Scripting.Dictionary")
    Set 図形辞書2 = CreateObject("Scripting.Dictionary")
    
    ' --- 図形情報を保存(オブジェクトではなく値) ---
    For Each 図形1 In シート1.Shapes
        図形情報 = Array(図形1.Left, 図形1.Top, 図形1.Width, 図形1.Height, 図形1.Type)
        図形辞書1(図形1.Name) = 図形情報
    Next
    
    For Each 図形2 In シート2.Shapes
        図形情報 = Array(図形2.Left, 図形2.Top, 図形2.Width, 図形2.Height, 図形2.Type)
        図形辞書2(図形2.Name) = 図形情報
    Next
    
    ' Sheet1にあってSheet2にない図形
    For Each 図形1 In シート1.Shapes
        If Not 図形辞書2.exists(図形1.Name) Then
            結果シート.Cells(結果行, 1).Value = "図形"
            結果シート.Cells(結果行, 2).Value = 図形1.Name
            結果シート.Cells(結果行, 5).Value = "Sheet1にのみ存在"
            結果行 = 結果行 + 1
        End If
    Next
    
    ' Sheet2にあってSheet1にない図形
    For Each 図形2 In シート2.Shapes
        If Not 図形辞書1.exists(図形2.Name) Then
            結果シート.Cells(結果行, 1).Value = "図形"
            結果シート.Cells(結果行, 2).Value = 図形2.Name
            結果シート.Cells(結果行, 5).Value = "Sheet2にのみ存在"
            結果行 = 結果行 + 1
        Else
            ' 共通図形の比較
            Dim info1 As Variant, info2 As Variant
            info1 = 図形辞書1(図形2.Name)
            info2 = 図形辞書2(図形2.Name)
            
            If info1(0) <> info2(0) Or info1(1) <> info2(1) Or _
               info1(2) <> info2(2) Or info1(3) <> info2(3) Then
               
                結果シート.Cells(結果行, 1).Value = "図形"
                結果シート.Cells(結果行, 2).Value = 図形2.Name
                結果シート.Cells(結果行, 5).Value = "位置またはサイズが異なります"
                結果行 = 結果行 + 1
            End If
        End If
    Next
    
    MsgBox "比較が完了しました。結果は「比較結果」シートに出力されました。", vbInformation

End Sub

Copilot

Option Explicit

Sub シートの違いを検出する()

    Dim 比較元シート As Worksheet
    Dim 比較先シート As Worksheet
    Dim 結果シート As Worksheet
    Dim 行番号 As Long
    DimAs Long,As Long
    Dim 最大行 As Long, 最大列 As Long
    Dim セル元 As Range, セル先 As Range

    ' シートの指定(必要に応じて変更)
    Set 比較元シート = Worksheets("Sheet1")
    Set 比較先シート = Worksheets("Sheet2")
    Set 結果シート = Worksheets.Add
    結果シート.Name = "比較結果"

    ' ヘッダー
    結果シート.Cells(1, 1).Value = "セル位置"
    結果シート.Cells(1, 2).Value = "違いの種類"
    結果シート.Cells(1, 3).Value = "比較元"
    結果シート.Cells(1, 4).Value = "比較先"
    行番号 = 2

    ' 最大範囲の取得
    最大行 = Application.WorksheetFunction.Max(比較元シート.UsedRange.Rows.Count, 比較先シート.UsedRange.Rows.Count)
    最大列 = Application.WorksheetFunction.Max(比較元シート.UsedRange.Columns.Count, 比較先シート.UsedRange.Columns.Count)

    ' 値と書式の比較
    For= 1 To 最大行
        For= 1 To 最大列
            Set セル元 = 比較元シート.Cells(,)
            Set セル先 = 比較先シート.Cells(,)

            ' 値の比較
            If セル元.Value <> セル先.Value Then
                結果シート.Cells(行番号, 1).Value = セル元.Address
                結果シート.Cells(行番号, 2).Value = "値の違い"
                結果シート.Cells(行番号, 3).Value = セル元.Value
                結果シート.Cells(行番号, 4).Value = セル先.Value
                行番号 = 行番号 + 1
            End If

            ' 書式の比較(フォント名、サイズ、色)
            If セル元.Font.Name <> セル先.Font.Name Or _
               セル元.Font.Size <> セル先.Font.Size Or _
               セル元.Font.Color <> セル先.Font.Color Or _
               セル元.Interior.Color <> セル先.Interior.Color Then
                結果シート.Cells(行番号, 1).Value = セル元.Address
                結果シート.Cells(行番号, 2).Value = "書式の違い"
                結果シート.Cells(行番号, 3).Value = "フォント:" & セル元.Font.Name & ", 色:" & セル元.Interior.Color
                結果シート.Cells(行番号, 4).Value = "フォント:" & セル先.Font.Name & ", 色:" & セル先.Interior.Color
                行番号 = 行番号 + 1
            End If
        NextNext ' 図形の比較
    Dim 図形元 As Shape, 図形先 As Shape
    Dim 図形一致 As Boolean

    For Each 図形元 In 比較元シート.Shapes
        図形一致 = False
        For Each 図形先 In 比較先シート.Shapes
            If 図形元.Name = 図形先.Name Then
                図形一致 = True
                If 図形元.Top <> 図形先.Top Or 図形元.Left <> 図形先.Left Or _
                   図形元.Width <> 図形先.Width Or 図形元.Height <> 図形先.Height Then
                    結果シート.Cells(行番号, 1).Value = 図形元.Name
                    結果シート.Cells(行番号, 2).Value = "図形の位置・サイズの違い"
                    結果シート.Cells(行番号, 3).Value = "位置:" & 図形元.Left & "," & 図形元.Top & " サイズ:" & 図形元.Width & "x" & 図形元.Height
                    結果シート.Cells(行番号, 4).Value = "位置:" & 図形先.Left & "," & 図形先.Top & " サイズ:" & 図形先.Width & "x" & 図形先.Height
                    行番号 = 行番号 + 1
                End If
                Exit For
            End If
        Next 図形先
        If Not 図形一致 Then
            結果シート.Cells(行番号, 1).Value = 図形元.Name
            結果シート.Cells(行番号, 2).Value = "図形が比較先に存在しない"
            行番号 = 行番号 + 1
        End If
    Next 図形元

    MsgBox "比較が完了しました。結果は「比較結果」シートに出力されました。", vbInformation

End Sub

Sub シートの違いを検出する2()

    Dim 比較元シート As Worksheet
    Dim 比較先シート As Worksheet
    Dim 結果シート As Worksheet
    Dim 行番号 As Long
    DimAs Long,As Long
    Dim 最大行 As Long, 最大列 As Long
    Dim セル元 As Range, セル先 As Range

    ' シートの指定(必要に応じて変更)
    Set 比較元シート = Worksheets("Sheet1")
    Set 比較先シート = Worksheets("Sheet2")
    Set 結果シート = Worksheets.Add
    結果シート.Name = "比較結果"

    ' ヘッダー
    結果シート.Cells(1, 1).Value = "セル位置"
    結果シート.Cells(1, 2).Value = "違いの種類"
    結果シート.Cells(1, 3).Value = "比較元"
    結果シート.Cells(1, 4).Value = "比較先"
    行番号 = 2

    ' 最大範囲の取得
    最大行 = Application.WorksheetFunction.Max(比較元シート.UsedRange.Rows.Count, 比較先シート.UsedRange.Rows.Count)
    最大列 = Application.WorksheetFunction.Max(比較元シート.UsedRange.Columns.Count, 比較先シート.UsedRange.Columns.Count)

    ' 値と書式の比較
    For= 1 To 最大行
        For= 1 To 最大列
            Set セル元 = 比較元シート.Cells(,)
            Set セル先 = 比較先シート.Cells(,)

            ' 値の比較(型安全)
            If Not IsError(セル元.Value) And Not IsError(セル先.Value) Then
                If CStr(セル元.Value) <> CStr(セル先.Value) Then
                    結果シート.Cells(行番号, 1).Value = セル元.Address
                    結果シート.Cells(行番号, 2).Value = "値の違い"
                    結果シート.Cells(行番号, 3).Value = セル元.Value
                    結果シート.Cells(行番号, 4).Value = セル先.Value
                    行番号 = 行番号 + 1
                End If
            Else
                ' どちらかがエラー値の場合
                If IsError(セル元.Value) <> IsError(セル先.Value) Then
                    結果シート.Cells(行番号, 1).Value = セル元.Address
                    結果シート.Cells(行番号, 2).Value = "値の違い(エラー)"
                    結果シート.Cells(行番号, 3).Value = IIf(IsError(セル元.Value), "エラー値", セル元.Value)
                    結果シート.Cells(行番号, 4).Value = IIf(IsError(セル先.Value), "エラー値", セル先.Value)
                    行番号 = 行番号 + 1
                End If
            End If

            ' 書式の比較(フォント名、サイズ、色)
            If セル元.Font.Name <> セル先.Font.Name Or _
               セル元.Font.Size <> セル先.Font.Size Or _
               セル元.Font.Color <> セル先.Font.Color Or _
               セル元.Interior.Color <> セル先.Interior.Color Then
                結果シート.Cells(行番号, 1).Value = セル元.Address
                結果シート.Cells(行番号, 2).Value = "書式の違い"
                結果シート.Cells(行番号, 3).Value = "フォント:" & セル元.Font.Name & ", 色:" & セル元.Interior.Color
                結果シート.Cells(行番号, 4).Value = "フォント:" & セル先.Font.Name & ", 色:" & セル先.Interior.Color
                行番号 = 行番号 + 1
            End If
        NextNext ' 図形の比較
    Dim 図形元 As Shape, 図形先 As Shape
    Dim 図形一致 As Boolean

    For Each 図形元 In 比較元シート.Shapes
        図形一致 = False
        For Each 図形先 In 比較先シート.Shapes
            If 図形元.Name = 図形先.Name Then
                図形一致 = True
                If 図形元.Top <> 図形先.Top Or 図形元.Left <> 図形先.Left Or _
                   図形元.Width <> 図形先.Width Or 図形元.Height <> 図形先.Height Then
                    結果シート.Cells(行番号, 1).Value = 図形元.Name
                    結果シート.Cells(行番号, 2).Value = "図形の位置・サイズの違い"
                    結果シート.Cells(行番号, 3).Value = "位置:" & 図形元.Left & "," & 図形元.Top & " サイズ:" & 図形元.Width & "x" & 図形元.Height
                    結果シート.Cells(行番号, 4).Value = "位置:" & 図形先.Left & "," & 図形先.Top & " サイズ:" & 図形先.Width & "x" & 図形先.Height
                    行番号 = 行番号 + 1
                End If
                Exit For
            End If
        Next 図形先
        If Not 図形一致 Then
            結果シート.Cells(行番号, 1).Value = 図形元.Name
            結果シート.Cells(行番号, 2).Value = "図形が比較先に存在しない"
            行番号 = 行番号 + 1
        End If
    Next 図形元

    MsgBox "比較が完了しました。結果は「比較結果」シートに出力されました。", vbInformation

End Sub

Gemini

Option Explicit

Sub シート比較マクロ()
    ' 変数宣言(日本語)
    Dim ワークブック As Workbook
    Dim シート1 As Worksheet
    Dim シート2 As Worksheet
    Dim 結果シート As Worksheet
    Dim 最終行 As Long
    Dim 最終列 As Long
    Dim 行インデックス As Long
    Dim 列インデックス As Long
    Dim 比較セル範囲 As Range
    Dim セル1 As Range
    Dim セル2 As Range
    Dim 違い検出フラグ As Boolean
    Dim 結果行 As Long
    
    ' 初期設定
    Set ワークブック = ThisWorkbook
    Set シート1 = ワークブック.Sheets("Sheet1") ' ?? 最初のシート名に変更
    Set シート2 = ワークブック.Sheets("Sheet2") ' ?? 2番目のシート名に変更
    違い検出フラグ = False
    
    ' 既存の比較結果シートがあれば削除
    On Error Resume Next
    Application.DisplayAlerts = False
    ワークブック.Sheets("比較結果").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    
    ' 比較結果シートの作成と初期化
    Set 結果シート = ワークブック.Sheets.Add(After:=ワークブック.Sheets(ワークブック.Sheets.Count))
    結果シート.Name = "比較結果"
    結果シート.Cells(1, 1).Value = "項目"
    結果シート.Cells(1, 2).Value = "詳細"
    結果シート.Cells(1, 3).Value = "場所"
    結果行 = 2 ' 結果書き込みの開始行

'================================================================================
' ## 1. 値と書式の比較
'================================================================================

    ' 比較対象の範囲を決定(ここでは両シートのA1から使用されている最終セルまでを対象)
    最終行 = Application.Max(シート1.UsedRange.Rows.Count + シート1.UsedRange.Row - 1, _
                            シート2.UsedRange.Rows.Count + シート2.UsedRange.Row - 1)
    最終列 = Application.Max(シート1.UsedRange.Columns.Count + シート1.UsedRange.Column - 1, _
                            シート2.UsedRange.Columns.Count + シート2.UsedRange.Column - 1)
                            
    Set 比較セル範囲 = ワークブック.Sheets(1).Range(ワークブック.Sheets(1).Cells(1, 1), ワークブック.Sheets(1).Cells(最終行, 最終列))

    For 行インデックス = 1 To 最終行
        For 列インデックス = 1 To 最終列
            Set セル1 = シート1.Cells(行インデックス, 列インデックス)
            Set セル2 = シート2.Cells(行インデックス, 列インデックス)
            
            Dim セルアドレス As String
            セルアドレス = セル1.Address(False, False)
            
            ' 値の比較
            If Application.IsError(セル1.Value) Or Application.IsError(セル2.Value) Then
                ' どちらかのセルがエラー値の場合の処理
                ' 例: エラー値の違いとして記録
                If Application.IsError(セル1.Value) <> Application.IsError(セル2.Value) Then
                    結果シート.Cells(結果行, 1).Value = "エラー値の有無が違う"
                    結果シート.Cells(結果行, 3).Value = "セル: " & セルアドレス
                    結果行 = 結果行 + 1
                    違い検出フラグ = True
                End If
            Else
                ' 両方ともエラー値でない場合、通常の比較を実行
                If セル1.Value <> セル2.Value Then
                    結果シート.Cells(結果行, 1).Value = "値の違い"
                    ' ... (後続の処理)
                End If
            End If
            
            ' 書式の比較(Font.ColorとInterior.Colorのみ)
            ' フォント色の比較
            If セル1.Font.Color <> セル2.Font.Color Then
                結果シート.Cells(結果行, 1).Value = "フォント色の違い"
                結果シート.Cells(結果行, 3).Value = "セル: " & セルアドレス
                結果行 = 結果行 + 1
                違い検出フラグ = True
            End If
            
            ' 背景色(塗りつぶし)の比較
            If セル1.Interior.Color <> セル2.Interior.Color Then
                結果シート.Cells(結果行, 1).Value = "背景色の違い"
                結果シート.Cells(結果行, 3).Value = "セル: " & セルアドレス
                結果行 = 結果行 + 1
                違い検出フラグ = True
            End If
            
        Next 列インデックス
    Next 行インデックス

'================================================================================
' ## 2. 図形(Shapes)の比較(数の比較のみ)
'================================================================================

    Dim 図形数1 As Long
    Dim 図形数2 As Long
    
    図形数1 = シート1.Shapes.Count
    図形数2 = シート2.Shapes.Count
    
    If 図形数1 <> 図形数2 Then
        結果シート.Cells(結果行, 1).Value = "図形の数の違い"
        結果シート.Cells(結果行, 2).Value = "シート1: " & 図形数1 & "個 / シート2: " & 図形数2 & "個"
        結果シート.Cells(結果行, 3).Value = "シート全体"
        結果行 = 結果行 + 1
        違い検出フラグ = True
    End If
    
    ' 図形数の比較に加えて、図形の詳細(名前や位置など)を比較したい場合は、
    ' ここにShapesコレクションをループする処理を追加する必要があります。
    ' 例: 図形名、位置、サイズ、テキストなどの比較。

'================================================================================
' ## 3. 結果の通知
'================================================================================

    If 違い検出フラグ = True Then
        MsgBox "2つのシート間に違いが検出されました。「比較結果」シートを確認してください。", vbExclamation
        結果シート.Columns.AutoFit
        結果シート.Activate
    Else
        MsgBox "2つのシート間に違いは見つかりませんでした。", vbInformation
        Application.DisplayAlerts = True
    End If

End Sub

Claude

Option Explicit

Sub シート比較実行()
    Dim シート1 As Worksheet
    Dim シート2 As Worksheet
    Dim 結果シート As Worksheet
    Dim 比較結果 As String
    DimAs Long
    
    ' シート選択
    On Error Resume Next
    Set シート1 = Application.InputBox("比較元のシートを選択してください", Type:=8)
    If シート1 Is Nothing Then Exit Sub
    
    Set シート2 = Application.InputBox("比較先のシートを選択してください", Type:=8)
    If シート2 Is Nothing Then Exit Sub
    On Error GoTo 0
    
    ' 結果シート作成
    On Error Resume Next
    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets("比較結果").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    
    Set 結果シート = ThisWorkbook.Worksheets.Add
    結果シート.Name = "比較結果"
    
    ' ヘッダー作成
    With 結果シート
        .Cells(1, 1).Value = "差異種類"
        .Cells(1, 2).Value = "位置/名前"
        .Cells(1, 3).Value = "シート1の値"
        .Cells(1, 4).Value = "シート2の値"
        .Cells(1, 5).Value = "詳細"
        .Range("A1:E1").Font.Bold = True
        .Range("A1:E1").Interior.Color = RGB(200, 200, 200)
    End With= 2
    
    ' 各種比較実行
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    比較結果 = "比較を開始します..." & vbCrLf
    
    ' 1. セル値の比較= セル値比較(シート1, シート2, 結果シート,)
    
    ' 2. セル書式の比較= セル書式比較(シート1, シート2, 結果シート,)
    
    ' 3. 図形の比較= 図形比較(シート1, シート2, 結果シート,)
    
    ' 4. グラフの比較= グラフ比較(シート1, シート2, 結果シート,)
    
    ' 5. 条件付き書式の比較= 条件付き書式比較(シート1, シート2, 結果シート,)
    
    ' 6. セル結合の比較= セル結合比較(シート1, シート2, 結果シート,)
    
    ' 列幅自動調整
    結果シート.Columns("A:E").AutoFit
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    If= 2 Then
        結果シート.Cells(2, 1).Value = "差異なし"
        結果シート.Cells(2, 2).Value = "2つのシートは完全に一致しています"
    End If
    
    MsgBox "比較が完了しました。" & vbCrLf & "差異数: " & (- 2) & "件", vbInformation
End Sub

' セル値の比較
Function セル値比較(シート1 As Worksheet, シート2 As Worksheet, 結果シート As Worksheet, 開始行 As Long) As Long
    Dim 最終行1 As Long, 最終列1 As Long
    Dim 最終行2 As Long, 最終列2 As Long
    Dim 行番号 As Long, 列番号 As Long
    Dim 現在行 As Long
    
    現在行 = 開始行
    
    ' 使用範囲の取得
    最終行1 = シート1.Cells(シート1.Rows.Count, 1).End(xlUp).Row
    最終列1 = シート1.Cells(1, シート1.Columns.Count).End(xlToLeft).Column
    最終行2 = シート2.Cells(シート2.Rows.Count, 1).End(xlUp).Row
    最終列2 = シート2.Cells(1, シート2.Columns.Count).End(xlToLeft).Column
    
    ' 範囲サイズの違いを記録
    If 最終行1 <> 最終行2 Or 最終列1 <> 最終列2 Then
        結果シート.Cells(現在行, 1).Value = "範囲サイズ"
        結果シート.Cells(現在行, 2).Value = "使用範囲"
        結果シート.Cells(現在行, 3).Value = "行:" & 最終行1 & " 列:" & 最終列1
        結果シート.Cells(現在行, 4).Value = "行:" & 最終行2 & " 列:" & 最終列2
        現在行 = 現在行 + 1
    End If
    
    ' セル値の比較
    For 行番号 = 1 To Application.Max(最終行1, 最終行2)
        For 列番号 = 1 To Application.Max(最終列1, 最終列2)
            Dim1 As Variant,2 As Variant
            
            On Error Resume Next1 = シート1.Cells(行番号, 列番号).Value2 = シート2.Cells(行番号, 列番号).Value
            On Error GoTo 0
            
            If1 <>2 Then
                結果シート.Cells(現在行, 1).Value = "セル値"
                結果シート.Cells(現在行, 2).Value = シート1.Cells(行番号, 列番号).Address
                結果シート.Cells(現在行, 3).Value =1
                結果シート.Cells(現在行, 4).Value =2
                現在行 = 現在行 + 1
            End If
        Next 列番号
    Next 行番号
    
    セル値比較 = 現在行
End Function

' セル書式の比較
Function セル書式比較(シート1 As Worksheet, シート2 As Worksheet, 結果シート As Worksheet, 開始行 As Long) As Long
    Dim 最終行 As Long, 最終列 As Long
    Dim 行番号 As Long, 列番号 As Long
    Dim 現在行 As Long
    Dim セル1 As Range, セル2 As Range
    
    現在行 = 開始行
    
    最終行 = Application.Max(シート1.Cells(シート1.Rows.Count, 1).End(xlUp).Row, _
                             シート2.Cells(シート2.Rows.Count, 1).End(xlUp).Row)
    最終列 = Application.Max(シート1.Cells(1, シート1.Columns.Count).End(xlToLeft).Column, _
                             シート2.Cells(1, シート2.Columns.Count).End(xlToLeft).Column)
    
    ' 主要なセルのみチェック(処理速度のため)
    For 行番号 = 1 To Application.Min(最終行, 100)
        For 列番号 = 1 To Application.Min(最終列, 50)
            Set セル1 = シート1.Cells(行番号, 列番号)
            Set セル2 = シート2.Cells(行番号, 列番号)
            
            ' フォント比較
            If セル1.Font.Name <> セル2.Font.Name Or _
               セル1.Font.Size <> セル2.Font.Size Or _
               セル1.Font.Bold <> セル2.Font.Bold Or _
               セル1.Font.Italic <> セル2.Font.Italic Or _
               セル1.Font.Color <> セル2.Font.Color Then
                結果シート.Cells(現在行, 1).Value = "フォント書式"
                結果シート.Cells(現在行, 2).Value = セル1.Address
                結果シート.Cells(現在行, 3).Value = セル1.Font.Name & " " & セル1.Font.Size & "pt"
                結果シート.Cells(現在行, 4).Value = セル2.Font.Name & " " & セル2.Font.Size & "pt"
                現在行 = 現在行 + 1
            End If
            
            ' 背景色比較
            If セル1.Interior.Color <> セル2.Interior.Color Then
                結果シート.Cells(現在行, 1).Value = "背景色"
                結果シート.Cells(現在行, 2).Value = セル1.Address
                結果シート.Cells(現在行, 3).Value = "色コード: " & セル1.Interior.Color
                結果シート.Cells(現在行, 4).Value = "色コード: " & セル2.Interior.Color
                現在行 = 現在行 + 1
            End If
            
            ' 罫線比較
            If セル1.Borders(xlEdgeTop).LineStyle <> セル2.Borders(xlEdgeTop).LineStyle Or _
               セル1.Borders(xlEdgeBottom).LineStyle <> セル2.Borders(xlEdgeBottom).LineStyle Or _
               セル1.Borders(xlEdgeLeft).LineStyle <> セル2.Borders(xlEdgeLeft).LineStyle Or _
               セル1.Borders(xlEdgeRight).LineStyle <> セル2.Borders(xlEdgeRight).LineStyle Then
                結果シート.Cells(現在行, 1).Value = "罫線"
                結果シート.Cells(現在行, 2).Value = セル1.Address
                結果シート.Cells(現在行, 5).Value = "罫線スタイルが異なります"
                現在行 = 現在行 + 1
            End If
        Next 列番号
    Next 行番号
    
    セル書式比較 = 現在行
End Function

' 図形の比較
Function 図形比較(シート1 As Worksheet, シート2 As Worksheet, 結果シート As Worksheet, 開始行 As Long) As Long
    Dim 現在行 As Long
    Dim 図形1 As Shape, 図形2 As Shape
    Dim 図形数1 As Long, 図形数2 As Long
    
    現在行 = 開始行
    
    図形数1 = シート1.Shapes.Count
    図形数2 = シート2.Shapes.Count
    
    If 図形数1 <> 図形数2 Then
        結果シート.Cells(現在行, 1).Value = "図形数"
        結果シート.Cells(現在行, 2).Value = "シート全体"
        結果シート.Cells(現在行, 3).Value = 図形数1 & "個"
        結果シート.Cells(現在行, 4).Value = 図形数2 & "個"
        現在行 = 現在行 + 1
    End If
    
    ' 図形の詳細比較
    Dim i As Long
    For i = 1 To Application.Min(図形数1, 図形数2)
        Set 図形1 = シート1.Shapes(i)
        Set 図形2 = シート2.Shapes(i)
        
        If 図形1.Name <> 図形2.Name Or _
           図形1.Type <> 図形2.Type Or _
           図形1.Width <> 図形2.Width Or _
           図形1.Height <> 図形2.Height Then
            結果シート.Cells(現在行, 1).Value = "図形属性"
            結果シート.Cells(現在行, 2).Value = 図形1.Name
            結果シート.Cells(現在行, 3).Value = "種類:" & 図形1.Type & " W:" & 図形1.Width
            結果シート.Cells(現在行, 4).Value = "種類:" & 図形2.Type & " W:" & 図形2.Width
            現在行 = 現在行 + 1
        End If
    Next i
    
    図形比較 = 現在行
End Function

' グラフの比較
Function グラフ比較(シート1 As Worksheet, シート2 As Worksheet, 結果シート As Worksheet, 開始行 As Long) As Long
    Dim 現在行 As Long
    Dim グラフ数1 As Long, グラフ数2 As Long
    
    現在行 = 開始行
    
    グラフ数1 = シート1.ChartObjects.Count
    グラフ数2 = シート2.ChartObjects.Count
    
    If グラフ数1 <> グラフ数2 Then
        結果シート.Cells(現在行, 1).Value = "グラフ数"
        結果シート.Cells(現在行, 2).Value = "シート全体"
        結果シート.Cells(現在行, 3).Value = グラフ数1 & "個"
        結果シート.Cells(現在行, 4).Value = グラフ数2 & "個"
        現在行 = 現在行 + 1
    End If
    
    グラフ比較 = 現在行
End Function

' 条件付き書式の比較
Function 条件付き書式比較(シート1 As Worksheet, シート2 As Worksheet, 結果シート As Worksheet, 開始行 As Long) As Long
    Dim 現在行 As Long
    Dim 書式数1 As Long, 書式数2 As Long
    
    現在行 = 開始行
    
    On Error Resume Next
    書式数1 = シート1.Cells.FormatConditions.Count
    書式数2 = シート2.Cells.FormatConditions.Count
    On Error GoTo 0
    
    If 書式数1 <> 書式数2 Then
        結果シート.Cells(現在行, 1).Value = "条件付き書式"
        結果シート.Cells(現在行, 2).Value = "シート全体"
        結果シート.Cells(現在行, 3).Value = 書式数1 & "個"
        結果シート.Cells(現在行, 4).Value = 書式数2 & "個"
        現在行 = 現在行 + 1
    End If
    
    条件付き書式比較 = 現在行
End Function

' セル結合の比較
Function セル結合比較(シート1 As Worksheet, シート2 As Worksheet, 結果シート As Worksheet, 開始行 As Long) As Long
    Dim 現在行 As Long
    Dim 最終行 As Long, 最終列 As Long
    Dim 行番号 As Long, 列番号 As Long
    
    現在行 = 開始行
    
    最終行 = Application.Max(シート1.Cells(シート1.Rows.Count, 1).End(xlUp).Row, _
                             シート2.Cells(シート2.Rows.Count, 1).End(xlUp).Row)
    最終列 = Application.Max(シート1.Cells(1, シート1.Columns.Count).End(xlToLeft).Column, _
                             シート2.Cells(1, シート2.Columns.Count).End(xlToLeft).Column)
    
    For 行番号 = 1 To Application.Min(最終行, 100)
        For 列番号 = 1 To Application.Min(最終列, 50)
            Dim 結合1 As Boolean, 結合2 As Boolean
            
            結合1 = シート1.Cells(行番号, 列番号).MergeCells
            結合2 = シート2.Cells(行番号, 列番号).MergeCells
            
            If 結合1 <> 結合2 Then
                結果シート.Cells(現在行, 1).Value = "セル結合"
                結果シート.Cells(現在行, 2).Value = シート1.Cells(行番号, 列番号).Address
                結果シート.Cells(現在行, 3).Value = IIf(結合1, "結合あり", "結合なし")
                結果シート.Cells(現在行, 4).Value = IIf(結合2, "結合あり", "結合なし")
                現在行 = 現在行 + 1
            End If
        Next 列番号
    Next 行番号
    
    セル結合比較 = 現在行
End Function