日本語入力ソフトとVBAの覚え書き

・各種日本語入力ソフトの辞書解説 ・ちょっと楽になるExcel VBA集

追記あり (Excel VBA) 選択範囲の全角スペースおよび半角スペースを一括で削除する

注意点 (2017.7.18追記)

2017年4月の追記以降、しばらく運用してみたんですが、原因は不明なんですけど、やっぱりどうしても選択範囲だけじゃなくてワークシート全体のスペースが一括で削除されてしまうことが多いので、もうちょっと考えた方がいいのかなと思いました。
そういうことがあるという前提でこの記事を読んで下さい。申し訳ありませんが宜しくお願い致します。

全・半角スペースを削除する

削除は置換

文字を削除するときにはReplaceメソッドを使います。削除というか、""に置換する訳です。そして、選択範囲の全角スペースおよび半角スペースを削除する場合は、Selectionに対してReplaceを適用します。

Sub DelSpaces()
    ' ** 選択範囲の全・半角スペースを削除 **
    Selection.Replace " ", "" ' <--- スペースは全角で入力
    Selection.Replace " ", ""
End Sub

または、キャラクターコードで記述して

Sub DelSpaces()
    ' ** 選択範囲の全・半角スペースを削除 **
    Selection.Replace Chr(-32448), ""
    Selection.Replace Chr(32), ""
End Sub

VBAではアンドゥ(UnDo)が使えない

注意点として、VBAで操作した場合はアンドゥが使えませんので、あらかじめ保存しておくとかMsgboxで注意を促すような処理を入れるのがよいでしょう。

    Msgbox "はじめに上書き保存します。", vbOKOnly + vbExclamation
    ActiveWorkbook.Save

[ 2017.4.26追記 ]

選択範囲外のスペースも削除されてしまうことがある!

しばらく上記のコードで運用していたところ、"選択範囲を指定しているにもかかわらず、選択範囲以外の全てのセルでスペースが削除されてしまう"場合が何回も発生しました。

そこで、コードを改良することにしました。

選択範囲は取得されてるのか?

最初に思ったのは、このSelectionは本当に取得されているのか?

Sub CheckSelection()
    Dim R1, R2, C1, C2, cnt
    cnt = Selection.Count
    R1 = Selection(1).Row
    C1 = Selection(1).Column
    R2 = Selection(cnt).Row
    C2 = Selection(cnt).Column

    MsgBox R1 & "," & C1 & "-" & R2 & "," & C2
End Sub

結果は、取得されているようです。
f:id:dz_dzone:20170426094955j:plain
ならばと、改良コードその1

Sub DelSpaceV2()
    ' ** 選択範囲の全・半角スペースを削除 **
    Dim R1, R2, C1, C2, cnt
    cnt = Selection.Count
    R1 = Selection(1).Row
    C1 = Selection(1).Column
    R2 = Selection(cnt).Row
    C2 = Selection(cnt).Column
    
    For r = R1 To R2
        For c = C1 To C2
            Cells(r, c).Replace Chr(-32448), ""
            Cells(r, c).Replace Chr(32), ""
        Next c
    Next r
End Sub

ただ、上記コードだと単一の矩形範囲しか選択できませんよね。ということで、改良コードその2

Sub DelSpaceV3()
    ' ** 選択範囲の全・半角スペースを削除 **
    Dim CL As Range
    For Each CL In Selection
        CL.Replace Chr(-32448), ""
        CL.Replace Chr(32), ""
    Next CL
End Sub

とりあえずこれでまたしばらく運用してみることにします。