生成AI活用研究
Geminiと100本ノック 16本目:無駄な改行を削除

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

Geminiと100本ノック 16本目:無駄な改行を削除


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


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

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


VBA100本ノックの出題と解答

VBA100本ノック 16本目:無駄な改行を削除
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

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

VBA問題
セル内改行はAlt+Enterですね。
引数の文字列から無駄な改行(LF)を削除して返すFunctionを作成してください。
※CRLFはLFに変換する。
■無駄な改行とは
・文字列の前後の改行
・2連続の改行
サンプル:改行(\n)
\n無駄な\n\n改行を\n\n\n削除\n\n

無駄な\n改行を\n削除
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA

はい、VBAで引数の文字列から無駄な改行(LF)を削除するFunctionを作成します。

VBA
Function RemoveExcessLineBreaks(ByVal inputText As String) As String

  Dim tempText As String
  tempText = inputText

  ' 1. CRLFをLFに変換
  tempText = Replace(tempText, vbCrLf, vbLf)

  ' 2. 2連続以上のLFを1つのLFに置換(繰り返す)
  Do While InStr(tempText, vbLf & vbLf) > 0
    tempText = Replace(tempText, vbLf & vbLf, vbLf)
  Loop

  ' 3. 前後の改行を削除
  ' 先頭の改行を削除
  Do While Left(tempText, 1) = vbLf
    tempText = Right(tempText, Len(tempText) - 1)
    If Len(tempText) = 0 Then Exit Do ' 文字列が空になったら終了
  Loop

  ' 末尾の改行を削除
  Do While Right(tempText, 1) = vbLf
    tempText = Left(tempText, Len(tempText) - 1)
    If Len(tempText) = 0 Then Exit Do ' 文字列が空になったら終了
  Loop

  RemoveExcessLineBreaks = tempText

End Function

使い方:

このコードをVBAモジュールに貼り付けて使用します。

例えば、以下のように使用できます。

VBA
Sub SampleUsage()
  Dim originalText As String
  Dim cleanedText As String

  ' サンプルの文字列 (vbLf は改行コードを表します)
  originalText = vbLf & "無駄な" & vbLf & vbLf & "改行を" & vbLf & vbLf & vbLf & "削除" & vbLf & vbLf

  ' Functionを呼び出して無駄な改行を削除
  cleanedText = RemoveExcessLineBreaks(originalText)

  ' 結果を表示 (イミディエイトウィンドウに表示されます)
  Debug.Print "---元の文字列---"
  Debug.Print originalText
  Debug.Print "---処理後の文字列---"
  Debug.Print cleanedText

  ' セルに適用する例
  ' Range("A1").Value = originalText ' 元の文字列をA1に入れる場合
  ' Range("B1").Value = RemoveExcessLineBreaks(Range("A1").Value) ' A1の文字列から無駄な改行を削除してB1に入れる場合

End Sub

解説:
  1. Function RemoveExcessLineBreaks(ByVal inputText As String) As String: RemoveExcessLineBreaks という名前の関数を定義します。inputText という文字列型の引数を受け取り、文字列型の値を返します。ByVal を使用することで、元の文字列を変更しないようにします。
  2. tempText = Replace(tempText, vbCrLf, vbLf): 入力文字列中の vbCrLf (CRLF改行) を vbLf (LF改行) に置換します。
  3. Do While InStr(tempText, vbLf & vbLf) > 0 ... Loop: 文字列内に vbLf & vbLf (2連続のLF) が含まれている間、ループを繰り返します。
  4. tempText = Replace(tempText, vbLf & vbLf, vbLf): 2連続のLFを1つのLFに置換します。これにより、3つ以上の連続するLFも最終的に1つになります。
  5. Do While Left(tempText, 1) = vbLf ... Loop: 文字列の先頭が vbLf である間、その先頭の vbLf を削除します。文字列が空になった場合の処理も加えています。
  6. Do While Right(tempText, 1) = vbLf ... Loop: 文字列の末尾が vbLf である間、その末尾の vbLf を削除します。文字列が空になった場合の処理も加えています。
  7. RemoveExcessLineBreaks = tempText: 処理後の文字列を関数の戻り値として設定します。
このFunctionを使うことで、指定されたルールに基づいて文字列から不要な改行を効率的に削除できます。

Function作成と伝えてその通りFunctionを作成し、さらに使い方まで書いているのですか、これ以上何も言うことないですね。


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

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

VBA問題
セル内改行はAlt+Enterですね。
引数の文字列から無駄な改行(LF)を削除して返すFunctionを作成してください。
※CRLFはLFに変換する。
■無駄な改行とは
・文字列の前後の改行
・2連続の改行
サンプル:改行(\n)
\n無駄な\n\n改行を\n\n\n削除\n\n

無駄な\n改行を\n削除
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA

はい、承知いたしました。「経験豊富かつ優秀なVBAプログラマー」として、ご要望に沿ったFunctionを作成し、解説を付け加えます。Replace関数を中心に利用することで、高速かつ簡潔なコードを実現します。

VBA
Option Explicit

'***************************************************************************************************
' Function名:RemoveExtraLineBreaks
' 概要:引数の文字列から不要な改行コード(LF)を削除して返します。
'    CRLFはLFに変換し、文字列前後の改行および2連続以上の改行を削除します。
' 引数:
'  targetString (String): 処理対象の文字列
' 戻り値:
'  String: 不要な改行を削除した文字列
'***************************************************************************************************
Function RemoveExtraLineBreaks(ByVal targetString As String) As String

  Dim result As String
  result = targetString

  ' CRLF (Chr(13) & Chr(10)) を LF (Chr(10)) に変換
  ' Replace関数は高速で、全てのCRLFを一度に置換できます。
  result = Replace(result, vbCrLf, vbLf)

  ' 連続するLF (Chr(10) & Chr(10)) を1つのLFに変換
  ' 連続するLFがなくなるまで繰り返します。
  ' Replace関数を使用することで、Forループよりも効率的に処理できます。
  Do While InStr(result, vbLf & vbLf) > 0
    result = Replace(result, vbLf & vbLf, vbLf)
  Loop

  ' 文字列の先頭のLFを削除
  ' 先頭がLFである間、左端の1文字(LF)を削除します。
  ' Do WhileループとMid関数で実現します。
  Do While Left(result, 1) = vbLf And Len(result) > 0
    result = Mid(result, 2)
  Loop

  ' 文字列の末尾のLFを削除
  ' 末尾がLFである間、右端の1文字(LF)を削除します。
  ' Do WhileループとLeft関数で実現します。
  Do While Right(result, 1) = vbLf And Len(result) > 0
    result = Left(result, Len(result) - 1)
  Loop

  ' 処理結果をFunctionの戻り値として設定
  RemoveExtraLineBreaks = result

End Function

' 使用例 (VBEのイミディエイトウィンドウなどでテストする場合)
' ? RemoveExtraLineBreaks(vbLf & "無駄な" & vbLf & vbLf & "改行を" & vbLf & vbLf & vbLf & "削除" & vbLf & vbLf)

VBAコードの解説
  • Option Explicit: 変数の宣言を強制し、typoによるエラーを防ぎます。
  • Function定義: RemoveExtraLineBreaks という名前でFunctionを定義しています。引数 targetString に処理対象の文字列を受け取り、String型の値を返します。ByVal を使用することで、元の引数の値がFunction内で変更されないようにしています。
  • result = targetString: 処理用変数 result に入力文字列をコピーします。
  • result = Replace(result, vbCrLf, vbLf):
    • まず、Excelのセル内でAlt+Enterで入力される可能性のあるCRLF (キャリッジリターン+ラインフィード) を単なるLF (ラインフィード) に置換します。
    • Replace 関数は文字列操作において非常に高速です。
    • vbCrLf はCRLF、vbLf はLFを表すVBAの定数です。
  • Do While InStr(result, vbLf & vbLf) > 0 ... Loop:
    • 連続する2つのLF (vbLf & vbLf) が文字列内に含まれているかを InStr 関数で判定します。
    • 含まれている間、つまり InStr の結果が0より大きい間、ループを繰り返します。
    • ループ内で result = Replace(result, vbLf & vbLf, vbLf) を実行し、連続するLFを1つのLFに置換します。これにより、3つ以上の連続したLFも、このループを繰り返すことで最終的に1つのLFになります。
    • Replace 関数を使うことで、Forループで1文字ずつチェックする方法より効率的です。
  • Do While Left(result, 1) = vbLf And Len(result) > 0 ... Loop:
    • 文字列の先頭がLF (vbLf) であるか、かつ文字列の長さが0より大きいか (Len(result) > 0) を判定します。文字列が空になった場合の無限ループを防ぐための Len(result) > 0 の条件を追加しています。
    • 条件を満たす間、ループを繰り返します。
    • ループ内で result = Mid(result, 2) を実行し、文字列の2文字目から最後までを取得することで、先頭の1文字(LF)を削除します。
  • Do While Right(result, 1) = vbLf And Len(result) > 0 ... Loop:
    • 文字列の末尾がLF (vbLf) であるか、かつ文字列の長さが0より大きいか (Len(result) > 0) を判定します。
    • 条件を満たす間、ループを繰り返します。
    • ループ内で result = Left(result, Len(result) - 1) を実行し、文字列の左から文字長-1文字分を取得することで、末尾の1文字(LF)を削除します。
  • RemoveExtraLineBreaks = result: 最終的な処理結果である result をFunctionの戻り値として設定します。
このFunctionは、Replace関数による高速な置換と、Do Whileループによる効率的な前後改行削除を組み合わせており、指定された要件を満たしています。

こういう定番のような処理については確実にVBAを書いてきますね。
ただ、ちょっとむだの多い処理になってしまっていますね。
指摘すれば書き直すと思いますが、、、

VBA100本ノック 16本目:無駄な改行を削除
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ
こちらで数々のVBAコードを掲載しているので参考にしてください。




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

Geminiと100本ノック 13本目:文字列の部分フォント
Geminiと100本ノック 14本目:社外秘シート削除
Geminiと100本ノック 15本目:シートの並べ替え
Geminiと100本ノック 16本目:無駄な改行を削除
Geminiと100本ノック 17本目:重複削除(ユニーク化)
Geminiと100本ノック 18本目:名前定義の削除
Geminiと100本ノック 19本目:図形のコピー
Geminiと100本ノック 20本目:ブックのバックアップ
Geminiと100本ノック 21本目:バックアップファイルの削除
Geminiと100本ノック 22本目:FizzBuzz発展問題
Geminiと100本ノック 23本目:シート構成の一致確認


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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