生成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本ノック 21本目:バックアップファイルの削除


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