先日、仕事で受け取ったExcelデータにTRIM関数で除去できない謎の半角スペースが混じっていた。
その現象を再現したのがこちら。
A1セルとA2セルは全く同じに見えるが、A1セルの1文字目はトリムできない謎のスペース。A2セルの方は通常のスペースである。
このようにTRIM関数を使っても、スペースが消えてくれない。
VBAで謎のスペースを調査
いったいこのスペースは何なのか。VBAで調べてみた。
まずはふつうにイミディエイトウインドウに出力してみる。
Subとりあえず出力() Debug.Print Range("A1").Value Debug.Print Range("A2").ValueEndSub
すると結果は、、んん?
なぜかA1セルのスペースはクエッションマークとして表示されるようだ。
ひと文字だけで試してみる。
Sub謎のスペースだけ出力()謎のスペース =Left(Range("A1").Value,1) Debug.Print謎のスペース EndSub
結果は「?」がひと文字表示された。
これってただのハテナなのか?
比較してみる。
Sub謎のスペースはハテナなのか()謎のスペース =Left(Range("A1").Value,1) Debug.Print謎のスペース ="?"EndSub
結果はFalse。
ただのハテナではないようだ。
では文字コードを見てみよう。
Sub謎のスペースの文字コードは()謎のスペース =Left(Range("A1").Value,1) Debug.PrintAsc(謎のスペース)EndSub
「63」とのこと。
ASCIIコード表で調べてみると、、
ASCII文字コード : IT用語辞典
やっぱりハテナ。。
ちなみに文字コード同士の比較だと一致する。
Sub文字コード同士を比較()謎のスペース =Left(Range("A1").Value,1) Debug.PrintAsc(謎のスペース)=Asc("?")EndSub
これはお手上げかーと思ったそのとき、最後の一手がひらめいた。
そうだ、文字列とByte型配列は相互置換できるんだった。
Byte型配列を使って謎のスペースの正体にせまる。
ということで、謎のスペースをByte型配列に代入し、その数値を見てみることにした。
Subバイト型配列を使って正体を暴く()Dim謎のスペース()AsByte謎のスペース =Left(Range("A1").Value,1) Debug.Print"---謎のスペースのコード---" Debug.Print謎のスペース(0) Debug.Print謎のスペース(1)Dimハテナ()AsByteハテナ ="?" Debug.Print"---ハテナのコード---" Debug.Printハテナ(0) Debug.Printハテナ(1)EndSub
すると!
でたっ!やっぱByteデータは嘘つかない。
「文字コード 160」でGoogle検索してみたところ、謎のスペースの正体は、HTMLでよく利用される、NBSP(ノーブレークスペース)だった。
NBSPを除去する関数を作成
さて、謎のスペースの正体が分かったところで、今度はそれを除去する関数がほしい。
Chr(160)で簡単にできるかなと思っていたけれど、失敗。
ここでもByte配列を使用することにした。
できたのがこちら。
Function NBSP2SP(strAsString)AsStringDim nbsp(0To1)AsByte nbsp(0)=160 nbsp(1)=0 NBSP2SP =Replace(str, nbsp," ")EndFunction
実際に使ってみた。
Subサンプル() Debug.Print"--普通にTrim出力--" Debug.PrintTrim(Range("A1").Value) Debug.Print"--NBSPを除去してTrim出力--" Debug.PrintTrim(NBSP2SP(Range("A1").Value))EndSub
結果はこのとおり。
きれいにTrimされている。
今回のようなケースは、ブラウザからExcelに文字列を張り付けた際に発生する場合がある。
特に、表のマージンをCSSではなくnbspで調整しているケースで、表をそのまま文字選択してExcelに張り付けるような操作をすると発生する。
受け取ったExcelデータにTrimできない余分なスペースがあったら、VBAで除去しよう。