生成AI活用研究
Geminiと100本ノック 3本目:セルの消去

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

Geminiと100本ノック 3本目:セルの消去


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



VBA100本ノックの出題と解答

VBA100本ノック 3本目:セルの消去
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

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

VBA問題
画像のように1行目に見出し、A列に№が入っています。
№行数およびデータ行数は毎回変化します。
この表の見出し(1行目)と№(A列)を残して、データ部分のみ値を消去してください。
※シートはアクティブシート
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック

OK. アクティブシートの1行目とA列以外をクリアするVBAコードですね。データ範囲は毎回変わるとのことなので、最終行と最終列を自動で取得するようにします。

以下がそのVBAコードです。

VBA

Sub ClearDataExceptHeaderAndNoColumn()

  Dim ws As Worksheet
  Dim lastRow As Long
  Dim lastColumn As Long
  Dim dataRange As Range

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

  'A列を基準に最終行を取得 (A列にNo.が連続して入っている前提)
  'もし途中に空白セルがある場合は Cells(Rows.Count, "A").End(xlUp).Row を使用するなど調整してください
  lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

  '1行目を基準に最終列を取得
  lastColumn = ws.Cells(1, Columns.Count).End(xlToLeft).Column

  'データをクリアする範囲を設定 (2行目から最終行、B列から最終列)
  If lastRow >= 2 And lastColumn >= 2 Then
    Set dataRange = ws.Range(ws.Cells(2, "B"), ws.Cells(lastRow, lastColumn))

    '範囲の値をクリア
    dataRange.ClearContents
  Else
    'データ範囲がない、または見出し行しかない場合の処理 (必要に応じてメッセージ表示など)
    MsgBox "クリアするデータが見つかりませんでした。(見出し行またはA列のみです)"
  End If

  'メモリ解放
  Set ws = Nothing
  Set dataRange = Nothing

  MsgBox "指定範囲のデータをクリアしました。"

End Sub

コードの説明:
  1. ws に現在アクティブなシートを設定します。
  2. lastRow は、A列のデータが入っている最終行を取得します。End(xlUp)は、A列の最下行から上方向に見て、データが入っている最初のセルを取得する方法です。A列にNo.が連続して入っているという画像からの推測に基づいています。
  3. lastColumn は、1行目(見出し行)のデータが入っている最終列を取得します。End(xlToLeft)は、1行目の最右列から左方向に見て、データが入っている最初のセルを取得する方法です。
  4. dataRange は、クリアしたいデータの範囲(2行目のB列から、取得した最終行・最終列まで)を設定します。
  5. If lastRow >= 2 And lastColumn >= 2 Then で、クリア対象となるデータ範囲が実際に存在するかどうかを確認します。見出し行(1行目)とA列以外にデータがあれば処理を実行します。
  6. dataRange.ClearContents で、設定した範囲の値のみをクリアします。(書式はそのまま残ります)
  7. 最後に解放処理を行っています。

使い方:
  1. Excelを開き、Alt + F11キーを押してVBAエディターを開きます。
  2. 左側のプロジェクトウィンドウで、このコードを実行したいExcelファイルを選び、「挿入」>「標準モジュール」を選択します。
  3. 開いた白いウィンドウに上記のコードを貼り付けます。
  4. Excelシートに戻り、このマクロを実行したいシートをアクティブにします。
  5. Alt + F8キーを押してマクロダイアログを開き、ClearDataExceptHeaderAndNoColumn を選択して「実行」をクリックします。

これで、アクティブシートの1行目とA列を残して、データ部分がクリアされます。

回答は合格ですね。
実務的にはもう少し完結に書きたいところです。
初期消去だけでこんなに行数を使ってしまうのは大変なので。


GeminiへのVBAコードの改善提案

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

もう少し短いVBAに書き直してください。
VBA マクロ Gemini 100本ノック

承知いたしました。より短いVBAコードに書き直します。

VBA

Sub ClearDataShort()

  Dim lastRow As Long
  Dim lastColumn As Long

  'A列を基準に最終行を取得
  lastRow = Cells(Rows.Count, "A").End(xlUp).Row

  '1行目を基準に最終列を取得
  lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

  'データ範囲をクリア (2行目から最終行、B列から最終列)
  If lastRow >= 2 And lastColumn >= 2 Then
    Range(Cells(2, "B"), Cells(lastRow, lastColumn)).ClearContents
  End If

End Sub


変更点:
  • Set ws = ThisWorkbook.ActiveSheet を削除し、Cells や Range を直接使用することでアクティブシートを暗黙的に参照するようにしました。
  • dataRange 変数の宣言と設定を削除し、Range(Cells(2, "B"), Cells(lastRow, lastColumn)) を直接 ClearContents メソッドに適用しました。
  • メッセージボックスの表示を削除しました。(エラーが発生しない限り、何も表示されません)

このコードも同様に、アクティブシートの1行目とA列以外のデータ部分をクリアします。前のコードと比べて、よりシンプルになっています。

使い方は前回と同じです。

単に短いVBAの指示では基本的な書き方が変わらなかったので、
具体的にVBAを指定してみました。

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

CurrentRegion
Offset
Intersect
これらのプロパティ・メソッドを使ってVBAを書いてください。
VBA マクロ Gemini 100本ノック
VBA マクロ Gemini 100本ノック

はい、承知いたしました。CurrentRegion、Offset、Intersect を組み合わせて、アクティブシートの1行目とA列以外のデータ部分をクリアするVBAコードです。

CurrentRegion で表全体を取得し、それを Offset した範囲との Intersect (交差) を取ることで、データ部分のみを特定します。

VBA

Sub ClearDataUsingSpecialFunctions()

  Dim fullRange As Range
  Dim dataToClear As Range

  ' A1セルを基準にCurrentRegionを取得(表全体)
  ' ※もし表の左上がA1でない場合は、Range("A1")を適切なセルに変更してください。
  Set fullRange = ActiveSheet.Range("A1").CurrentRegion

  ' fullRangeを1行下、1列右にオフセットした範囲と、fullRange自身の交差部分を取得
  ' 例:fullRangeがA1:D10の場合、fullRange.Offset(1, 1)はB2:E11
  ' これら二つの範囲のIntersect(交差部分)はB2:D10となり、これがデータ部分に相当します。
  On Error Resume Next ' データ範囲がない場合にエラーにならないようにする
  Set dataToClear = Intersect(fullRange, fullRange.Offset(1, 1))
  On Error GoTo 0   ' エラーハンドリングを元に戻す

  ' 取得したデータ範囲(dataToClear)が存在する場合のみクリア
  If Not dataToClear Is Nothing Then
    ' 値をクリア(書式はそのまま残ります)
    dataToClear.ClearContents
  End If

  'メモリ解放
  Set fullRange = Nothing
  Set dataToClear = Nothing

End Sub

コードの説明:
  1. Set fullRange = ActiveSheet.Range("A1").CurrentRegion で、アクティブシートのA1セルを含む連続したデータの範囲(表全体)を fullRange 変数に格納します。
  2. fullRange.Offset(1, 1) は、fullRange の開始セルから1行下、1列右にずらした位置を始点とする同じサイズの範囲を返します。
  3. Intersect(fullRange, fullRange.Offset(1, 1)) は、元の fullRange と、その範囲を1行下・1列右にオフセットした範囲との共通部分(交差)を求めます。これにより、1行目とA列を含まない、表のデータ部分の範囲が正確に特定されます。
  4. On Error Resume Next と On Error GoTo 0 は、Intersect の結果が Nothing (例えば、CurrentRegion が1行や1列しかない場合で、オフセットした範囲と元の範囲に共通部分がない場合) にエラーが発生するのを防ぐための処理です。
  5. If Not dataToClear Is Nothing Then で、データ部分の範囲が正常に取得できた(Nothing でない)場合のみ、dataToClear.ClearContents でその範囲の値をクリアします。

このコードは、指定されたプロパティとメソッドを使用して、効率的にデータ部分を特定しクリアします。使い方は前回のコードと同様です。

素晴らしいです。
これだけVBAが書ければ言うことなしです。




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

AIがあればVBAはできる:セルに絵文字を入れる
Geminiと100本ノック 1本目:セルのコピー
Geminiと100本ノック 2本目:セルのコピー
Geminiと100本ノック 3本目:セルの消去
Geminiと100本ノック 4本目:セルの消去
Geminiと100本ノック 5本目:セルの計算
Geminiと100本ノック 6本目:セルに計算式
Geminiと100本ノック 7本目:日付データの扱い
Geminiと100本ノック 8本目:点数の合否判定
Geminiと100本ノック 9本目:フィルターコピー
Geminiと100本ノック 8本目:点数の合否判定


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

AI時代におけるRPAとVBAの位置づけ - 補完技術としての役割と未来 -|生成AI活用研究(2025-05-12)
スマートExcel|AI×Excel:AIと進化するExcelの新常識|生成AI活用研究(2025-05-11)
VBA開発の現場で生成AIはどう使う? そのメリットと潜むリスク|生成AI活用研究(2025-05-11)
CursorでVBAを直接?編集・実行できる環境構築について|生成AI活用研究(2025-05-10)
Geminiと100本ノック 17本目:重複削除(ユニーク化)|生成AI活用研究(5月10日)
Geminiと100本ノック 16本目:無駄な改行を削除|生成AI活用研究(5月6日)
AIがあればVBAはできる:セルに絵文字を入れる|生成AI活用研究(2025-05-07)
Geminiと100本ノック 15本目:シートの並べ替え|生成AI活用研究(5月6日)
Geminiと100本ノック 14本目:社外秘シート削除|生成AI活用研究(5月4日)
Geminiと100本ノック 13本目:文字列の部分フォント|生成AI活用研究(5月4日)


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

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」をお願いいたします。
本文下部へ