Quantcast
Channel: t-hom’s diary
Viewing all articles
Browse latest Browse all 493

Excel TRIM関数で消えない謎の半角スペースをVBAでなんとかする

$
0
0

先日、仕事で受け取ったExcelデータにTRIM関数で除去できない謎の半角スペースが混じっていた。

その現象を再現したのがこちら。
f:id:t-hom:20160920135926p:plain

A1セルとA2セルは全く同じに見えるが、A1セルの1文字目はトリムできない謎のスペース。A2セルの方は通常のスペースである。

このようにTRIM関数を使っても、スペースが消えてくれない。
f:id:t-hom:20160920140154p:plain

VBAで謎のスペースを調査

いったいこのスペースは何なのか。VBAで調べてみた。
まずはふつうにイミディエイトウインドウに出力してみる。

Subとりあえず出力()
    Debug.Print Range("A1").Value
    Debug.Print Range("A2").ValueEndSub

すると結果は、、んん?
f:id:t-hom:20160920140434p:plain

なぜか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

すると!
f:id:t-hom:20160920142410p:plain

でたっ!やっぱByteデータは嘘つかない。

文字コード 160」でGoogle検索してみたところ、謎のスペースの正体は、HTMLでよく利用される、NBSP(ノーブレークスペース)だった。

ノーブレークスペース - Wikipedia

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

結果はこのとおり。
f:id:t-hom:20160920144107p:plain
きれいにTrimされている。

今回のようなケースは、ブラウザからExcelに文字列を張り付けた際に発生する場合がある。
特に、表のマージンをCSSではなくnbspで調整しているケースで、表をそのまま文字選択してExcelに張り付けるような操作をすると発生する。
受け取ったExcelデータにTrimできない余分なスペースがあったら、VBAで除去しよう。


Viewing all articles
Browse latest Browse all 493

Trending Articles