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つのシートの違いの検出するマクロを作ってください。 値だけでなく書式や図形などの違いも検出して下さい。 変数名は日本語にしてください。 |
試行回数
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
パッと見れるよう、画像はこちらにも置いておきますね。

各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 Dim 値1 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.Value 値2 = セル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 Dim 値1 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.Value 値2 = セル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 Dim 行 As 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 Next 列 Next 行 ' 図形の比較 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 Dim 行 As 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 Next 列 Next 行 ' 図形の比較 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 Dim 行 As 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) Dim 値1 As Variant, 値2 As Variant On Error Resume Next 値1 = シート1.Cells(行番号, 列番号).Value 値2 = シート2.Cells(行番号, 列番号).Value On Error GoTo 0 If 値1 <> 値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