生成AI活用研究
Geminiと100本ノック 11本目:セル結合の警告

Geminiを中心に生成AIの活用と研究の記録
公開日:2025-05-01 最終更新日:2025-05-08

Geminiと100本ノック 11本目:セル結合の警告


AIのGeminiがVBA100本ノックに挑戦!


Googleが開発した生成AIモデルのGeminiにVBA100本ノックをやってもらいました。
AIがVBAをどこまで扱えるかの実証実験の11本目です。

2025年3月からGemsが無料で使えるようになりました。
そこで、独自に作成したGem(名前は「AI神髄VBA」改良を続けている)を使った回答も掲載しています。


VBA100本ノックの出題と解答

VBA100本ノック 11本目:セル結合の警告
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

Geminiの回答 Geminiへの出題
VBA マクロ Gemini 100本ノック AI神髄VBA

VBA問題
画像のようにシートにはところどころにセル結合があります。
これは放置しておく訳にはいきません。
セル結合されているセルには、メモ(旧コメント)で警告文を出しましょう。
※シートは任意、警告文はご随意に
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA


承知いたしました。セル結合されているセルにメモ(旧コメント)で警告文を出すVBAコードを作成します。

以下のVBAコードをExcelのVBAエディタに貼り付けて実行してください。アクティブなシートの結合されているセルに警告メモが追加されます。

VBA
Sub AddNoteToMergedCellsWarning()

  Dim ws As Worksheet
  Dim rng As Range
  Dim cell As Range
  Dim mergedArea As Range
  Dim warningText As String

  ' 処理対象のシートを設定
  ' 必要に応じて 'Sheet1' の部分を処理したいシートの名前に変更してください
  On Error Resume Next
  Set ws = ThisWorkbook.ActiveSheet
  If ws Is Nothing Then
    MsgBox "処理対象のシートが見つかりません。", vbCritical
    Exit Sub
  End If
  On Error GoTo 0

  ' 警告文を設定
  warningText = "【警告】このセルは結合されています。" ' 警告文はご随意に変更してください

  ' シートの使用済み範囲を取得
  On Error Resume Next
  Set rng = ws.UsedRange
  If rng Is Nothing Then
    MsgBox "シートに使用されているセル範囲がありません。", vbInformation
    Exit Sub
  End If
  On Error GoTo 0

  ' 使用済み範囲内の各セルをループ
  ' 進捗表示のためにCounterを使用
  Dim totalCells As Long
  Dim processedCells As Long
  totalCells = rng.Cells.Count
  processedCells = 0

  Application.ScreenUpdating = False ' 画面更新を一時的に停止

  For Each cell In rng.Cells
    processedCells = processedCells + 1
    'Application.StatusBar = "処理中: " & Format(processedCells / totalCells, "0%") ' ステータスバーに進捗を表示 (任意)

    ' セルが結合されているか確認
    If cell.MergeCells Then
      ' 結合された範囲を取得
      Set mergedArea = cell.MergeArea

      ' 結合された範囲の左上のセルかどうかを確認
      ' メモは結合された範囲の左上のセルにのみ追加する
      If cell.Address = mergedArea.Cells(1, 1).Address Then
        ' 既にメモが存在するか確認し、存在しない場合のみ追加または更新
        If cell.Comment Is Nothing Then
          ' メモを追加 (旧コメント)
          With cell.AddComment(warningText)
            ' メモのテキストフォーマットを設定 (任意)
            .Shape.TextFrame.AutoSize = True ' テキストに合わせてサイズ自動調整
            ' .Visible = True ' Trueにすると常に表示、Falseにするとマウスオーバーで表示
          End With
        Else
          ' 既にメモがある場合は、テキストを更新することも可能
          ' 例: cell.Comment.Text Text:=warningText ' 既存のメモを警告文で上書き
          ' 今回は既存のメモがあれば、そのままにしておきます。
        End If
      End If
    End If
  Next cell

  'Application.StatusBar = False ' ステータスバーのリセット
  Application.ScreenUpdating = True ' 画面更新を再開

  MsgBox "セル結合されているセルに警告メモの追加処理が完了しました。", vbInformation

End Sub

コードの解説:
  1. Sub AddNoteToMergedCellsWarning(): このVBAプロシージャの開始を宣言します。
  2. 変数の宣言: 処理に必要な変数を宣言します。wsはワークシート、rngは処理対象の範囲、cellはループ中の単一のセル、mergedAreaはセルの結合範囲、warningTextはメモに記載する警告文を格納します。
  3. Set ws = ThisWorkbook.ActiveSheet: 現在アクティブなシートを処理対象とします。特定のシートを対象にしたい場合は、Set ws = ThisWorkbook.Sheets("シート名")のように変更してください。
  4. warningText = "【警告】このセルは結合されています。": メモに表示される警告文を設定します。ここはお好みの文章に変更できます。
  5. Set rng = ws.UsedRange: シートの中でデータが入力されている可能性がある範囲(使用済み範囲)を取得します。これにより、無駄なセルをチェックせずに済みます。
  6. Application.ScreenUpdating = False: 処理中の画面のちらつきを抑えるために、画面更新を一時的に停止します。処理の最後にTrueに戻します。
  7. For Each cell In rng.Cells: 取得した使用済み範囲内のすべてのセルを一つずつループ処理します。
  8. If cell.MergeCells Then: 現在処理しているセルが結合されているかどうかを判定します。結合されていればTrueになります。
  9. Set mergedArea = cell.MergeArea: セルが結合されている場合、そのセルが含まれる結合範囲全体をmergedAreaに取得します。
  10. If cell.Address = mergedArea.Cells(1, 1).Address Then: 取得した結合範囲の中で、現在処理しているセルがその結合範囲の一番左上にあるセルかどうかを判定します。これは、結合範囲内のすべてのセルではなく、代表して左上のセルにのみメモを付けるためです。
  11. If cell.Comment Is Nothing Then: そのセルに既にメモが存在するかを確認します。Nothingであればメモが存在しないので、新しいメモを追加します。既存のメモを上書きしたい場合はこのIf文を変更してください。
  12. With cell.AddComment(warningText): セルに新しいメモを追加し、そのメモオブジェクトに対する設定を開始します。warningTextがメモの内容となります。
  13. .Shape.TextFrame.AutoSize = True: (任意) メモの表示サイズをテキストの量に合わせて自動調整するように設定します。
  14. .Visible = False: (任意) メモを常に表示するか(True)、マウスをセルに合わせたときに表示するか(False)を設定します。デフォルトはFalseです。
  15. End With: メモオブジェクトに対する設定を終了します。
  16. End If (左上セル判定): 左上のセル判定のIf文を閉じます。
  17. End If (結合セル判定): 結合セル判定のIf文を閉じます。
  18. Next cell: 次のセルに処理を移します。
  19. Application.ScreenUpdating = True: 一時停止していた画面更新を再開します。
  20. MsgBox "...": 処理が完了したことをユーザーに通知するメッセージボックスを表示します。

実行方法:
  1. Excelを開き、Alt + F11キーを押してVBAエディタを開きます。
  2. 「挿入」メニューから「標準モジュール」を選択します。
  3. 表示された白いウィンドウに上記のコードを貼り付けます。
  4. VBAエディタを閉じます(Alt + Q キーでも閉じられます)。
  5. Excelシートに戻り、Alt + F8キーを押してマクロダイアログを開きます。
  6. マクロ名「AddNoteToMergedCellsWarning」を選択し、「実行」ボタンをクリックします。
これで、アクティブなシート上のセル結合されている左上のセルに警告メモが追加されます。

ステータスバーの表示とか、突然丁寧な作りこみになっていて、どうしちゃったのかな、という感じではあります。
とはいえ、VBAは良く出来ています。
ただし、実務的にはUsedRangeを使用するのはちょっと危険です。
離れた下の方のセルに何か入っているとか、書式や罫線だけ設定されていても、UsedRangeは範囲に入ってしまいます。
そのような場合、待てど暮らせどこのVBAは終わらなくなってしまいます。
UsedRangeを使うなら、セル数の上限をチェックしたほうが良いですね。
一応これを伝えたところ、以下を追加してきました。

' 使用済み範囲のセル数をチェック
  If rng.Cells.Count > maxCellLimit Then
    response = MsgBox( _
      "使用済みセル範囲 (" & Format(rng.Cells.Count, "#,##0") & " セル) が設定された上限 (" & Format(maxCellLimit, "#,##0") & " セル) を超えています。" & vbCrLf & _
      "このまま処理を続行すると、非常に時間がかかる可能性があります。" & vbCrLf & _
      "続行しますか?", _
      vbYesNo + vbExclamation, _
      "処理範囲の確認")

    If response = vbNo Then
      MsgBox "処理をキャンセルしました。", vbInformation
      Exit Sub ' ユーザーが「いいえ」を選択したら終了
    End If
  End If

これはこれで良いと思います。
出題の画像から推察すれば、あくまで1つの表なのでCurrentregionを使えば良いとは思いますが、、、
まあ、このあたりは好みと時々の都合によると思います。


AI神髄VBAへの出題とAI神髄VBAの回答

AI神髄VBAとは、GeminiのGems機能を使って作ったVBAに特化したカスタムAIです。
前回の10本目で使用したGemを今回は少し改良しました。
AI神髄VBAの回答 AI神髄VBAへの出題
VBA マクロ Gemini 100本ノック AI神髄VBA

VBA問題
画像のようにシートにはところどころにセル結合があります。
これは放置しておく訳にはいきません。
セル結合されているセルには、メモ(旧コメント)で警告文を出しましょう。
※シートは任意、警告文はご随意に
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA


はい、承知いたしました。「AI神髄VBA改」として、セル結合されているセルにメモ(旧コメント)で警告文を付けるVBAコードを作成します。ご要望に沿って、可能な限り短く、高速で、適切なメソッドを使用し、日本語のコメントと整形を行います。

VBA
' 結合されたセルに警告メモを追加する
Sub AddWarningMemoToMergedCells()

  ' 変数宣言
  Dim ws As Worksheet
  Dim targetRange As Range
  Dim cell As Range
  Dim warningText As String

  ' アクティブなシートを設定
  Set ws = ActiveSheet

  ' 警告文を設定
  warningText = "このセルは結合されています。"

  ' データ範囲(カレント領域)を取得
  ' A1セルを基準とするが、データのある任意のセルでも可
  If ws.Range("A1").CurrentRegion.Cells.CountLarge > 1 Then
    Set targetRange = ws.Range("A1").CurrentRegion
  Else
    ' データがA1セルのみの場合や、空の場合の考慮
    ' (今回は入力データチェック不要の指示なので簡易的に)
    Exit Sub ' 処理終了
  End If

  ' 取得した範囲の各セルをループ処理
  For Each cell In targetRange
    ' セルが結合されており、かつ、その結合範囲の左上のセルであるか判定
    If cell.MergeCells And cell.MergeArea.Cells(1, 1).Address = cell.Address Then
      ' 既存のコメントがあれば削除
      If Not cell.Comment Is Nothing Then
        cell.Comment.Delete
      End If
      ' 新しいコメント(メモ)を追加
      With cell.AddComment(warningText)
        ' コメントの表示設定(常に表示する場合)
        ' .Visible = True
        ' コメントのサイズ自動調整(必要に応じて)
        ' .Shape.AutoSize = True
      End With
    End If
  Next cell

  ' オブジェクト解放(明示的に行う場合は記述)
  ' Set ws = Nothing
  ' Set targetRange = Nothing

End Sub

VBAコードの解説
  1. Sub AddWarningMemoToMergedCells(): このプロシージャ(Sub)がコードの開始点です。セル結合されているセルに警告メモを追加する目的で使用します。
  2. 変数宣言:
    • ws As Worksheet: 処理対象のワークシートを格納するための変数です。
    • targetRange As Range: 処理対象のセル範囲(カレント領域)を格納するための変数です。
    • cell As Range: For Each ループで現在処理しているセルを格納するための変数です。
    • warningText As String: メモとして表示する警告文を格納するための変数です。
  3. Set ws = ActiveSheet: 現在アクティブになっているシートを ws オブジェクト変数に設定します。
  4. warningText = "このセルは結合されています。": メモに表示する警告文を文字列として定義します。ここはお好みの警告文に変更可能です。
  5. If ws.Range("A1").CurrentRegion.Cells.CountLarge > 1 Then ... Else ... End If: ActiveSheet の A1 セルを含む CurrentRegion を取得し、そのセル数が1より大きい(つまりA1セル単独ではない、データ範囲が存在する)場合に処理対象範囲を設定します。データがA1セルのみの場合や空の場合は処理を終了します。UsedRange ではなく CurrentRegion を使用しています。
  6. Set targetRange = ws.Range("A1").CurrentRegion: A1 セルを含む CurrentRegion を targetRange オブジェクト変数に設定します。
  7. For Each cell In targetRange ... Next cell: targetRange 内の各セルに対してループ処理を行います。For Each を使用することで、範囲内のセルを順番に処理できます。
  8. If cell.MergeCells And cell.MergeArea.Cells(1, 1).Address = cell.Address Then: これがセル結合を判定し、メモを追加する条件です。
    • cell.MergeCells: 現在のセル (cell) が結合されているかどうかを判定します。結合されていれば True を返します。
    • cell.MergeArea: 現在のセルが含まれる結合範囲全体を表す Range オブジェクトを返します。
    • cell.MergeArea.Cells(1, 1): 結合範囲 (MergeArea) の左上隅のセルを表します。
    • cell.MergeArea.Cells(1, 1).Address = cell.Address: 現在のセル (cell) のアドレスが、そのセルが含まれる結合範囲の左上隅のセルのアドレスと等しいかを判定します。これにより、結合されたブロック内でメモを重複して追加することを防ぎ、各結合範囲の代表として左上隅のセルにのみメモを追加します。
  9. If Not cell.Comment Is Nothing Then cell.Comment.Delete: もし対象のセルに既にコメントが存在する場合は、新しいコメントを追加する前に既存のコメントを削除します。
  10. With cell.AddComment(warningText) ... End With: 条件を満たした場合、現在のセル (cell) に新しいコメント(メモ)を追加します。warningText で指定した文字列がメモの内容となります。With ステートメントを使用して、追加したコメントオブジェクトの設定を行います(今回はコメントの表示やサイズの自動調整に関する設定をコメントアウトしています)。
  11. Exit Sub: データ範囲が存在しない場合のアーリーリターンです。
このコードは、CurrentRegion を効率的にループし、結合されたセルの左上隅にのみメモを追加することで、冗長な処理を避けています。

だいぶ私の書くVBAに似てきたように感じます。
たぶん私のVBAを知っている誰かにこのVBAを見せて、私が書いたと言っても特に何も疑わないかもしれません。
そのくらいのレベルになっていると思います。




同じテーマ「生成AI活用研究」の記事

Geminiと100本ノック 8本目:点数の合否判定
Geminiと100本ノック 9本目:フィルターコピー
Geminiと100本ノック 10本目:行の削除
Geminiと100本ノック 11本目:セル結合の警告
Geminiと100本ノック 12本目:セル結合の解除
Geminiと100本ノック 13本目:文字列の部分フォント
Geminiと100本ノック 14本目:社外秘シート削除
Geminiと100本ノック 15本目:シートの並べ替え
Geminiと100本ノック 16本目:無駄な改行を削除
Geminiと100本ノック 17本目:重複削除(ユニーク化)
Geminiと100本ノック 16本目:無駄な改行を削除


新着記事NEW ・・・新着記事一覧を見る

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ