Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:無駄な改行を削除
#VBA100本ノック 16本目
セル内改行はAlt+Enterですね。
引数の文字列から無駄な改行(LF)を削除して返すFunctionを作成してください。
※CRLFはLFに変換する。
■無駄な改行とは
・文字列の前後の改行
・2連続の改行
サンプル:改行(\n)
\n無駄な\n\n改行を\n\n\n削除\n\n
↓
無駄な\n改行を\n削除

◇ 出題ページはこちら
ソースコード
メインモジュール
Option Explicit ' 100本ノック016:無駄な改行を削除 Function Trim改行(元テキスト As String) As String ' 改行をLFに統一 Dim 元テキスト_LF統一 As String 元テキスト_LF統一 = Replace(元テキスト, vbCrLf, vbLf) ' 元テキストを1文字ずつ判定 Dim 結果値 As String Dim n As Long Dim is前の文字が改行 As Boolean For n = 1 To Len(元テキスト_LF統一) Dim 第n文字 As String: 第n文字 = Mid(元テキスト_LF統一, n, 1) ' 改行でない文字を結果値に結合 If 第n文字 <> vbLf Then 結果値 = 結果値 & 第n文字 is前の文字が改行 = False ' 改行ならば前の文字が改行でなければ結果値に結合 Else If is前の文字が改行 = False Then 結果値 = 結果値 & 第n文字 End If is前の文字が改行 = True End If Next ' 前後の改行を削除 If Left(結果値, 1) = vbLf Then 結果値 = Leftからn文字削除(結果値, 1) End If If Right(結果値, 1) = vbLf Then 結果値 = Rightからn文字削除(結果値, 1) End If Trim改行 = 結果値 End Function
汎用関数モジュール
Option Explicit ' 文字列の前後を削除 Function Leftからn文字削除(ByVal 元テキスト As String, n As Long) As String Leftからn文字削除 = Mid(元テキスト, n + 1) End Function Function Rightからn文字削除(ByVal 元テキスト As String, n As Long) As String If Len(元テキスト) - n > 0 Then Rightからn文字削除 = Left(元テキスト, Len(元テキスト) - n) End If End Function
解説
Trim関数の改行版を作る問題でした。
Function名を「Trim改行」としているのは、
Ctrl+SpaceでTrimと選択肢が並んで便利なためです。
コードの中身は愚直に1文字ずつループする処理を書いています。
一旦連続改行を1つの改行にしたあと、
前後の改行(あっても1つだけになっている)を1文字削除しました。
改行が連続しているかの判定は、ひとつ前の文字を見る必要があります。
これをフラグ変数で判定できるようにしておくと便利なので、
解答コードを参考にしてみてください。