和風スパゲティのレシピ

日本語でコーディングするExcelVBA

16本目:無駄な改行を削除

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文字削除しました。


改行が連続しているかの判定は、ひとつ前の文字を見る必要があります。

これをフラグ変数で判定できるようにしておくと便利なので、
解答コードを参考にしてみてください。