ExcelファイルをCSVで保存したら「?」が突然現れたり、空白を削除しようとしても消えない事はありませんか?
実は空白(スペース)に見えていたものは普通の空白ではない特殊な文字になっている可能性があります。
Excel上では普通の空白にしか見えないのが非常に厄介です。
この記事では文字化けの原因にもなるノンブレークスペースについて解説しています。
- TrimやReplaceで消せない空白があってハゲそうな人
- WEBサイト等の外部から取り込んだデータをよく使う人
- Excelと他のシステムの間で文字をコピペする機会が多い人
- CSV出力でExcelで表示している時はなかった「?」が出てきて困っている人
空白(スペース)に見えるが実は違う
一見するとスペースなのに実はスペースじゃないのは非常にややこしいですよね。
普通の空白だと思ってTrim、Replaceを使用して削除しようとしても消えない場合は、ノンブレークスペース(non-breaking space)といって通常の空白とは違う特殊な空白文字だと思って良いでしょう。
面倒な事にTrimやReplaceなどを普通に使って空白を削除しようとしてもこの空白は消えません。
ノンブレークスペースを消す方法は?
関数を使って削除する
ノンブレークスペースを削除するには複数の関数を組み合わせて使用する必要があります。
ノンブレークスペースは通常の空白と見分けが付かない為、初めて見た時は頭を抱えてしまいますが対処方法を覚えてしまえば簡単に解決することができます。
今回利用する関数はこちらです。関数名をクリックすると解説ページを開く事ができます。
関数名 | 説明 |
---|---|
CLEAN | 指定した文字列から印刷が出来ない特殊文字を削除することができます。 |
TRIM | 指定した文字列の前後の空白を削除する事ができます。 |
SUBSTITUTE | 指定した文字列を置き換える事ができます。 |
CHAR | 指定した文字コードに対応した文字列を返す事ができます。 |
ここでは上記4つの関数を利用してすぐに使える関数の組み合わせパターンを3つご紹介します。
ノンブレークスペースのみを削除する
皆さんが今見ている画面上の文字列には実はそれぞれ番号が振られており、これを文字コードといいます。例えば「A」という文字列には「65」という番号が振られています。
まずはこの各文字に振られている番号(文字コード)を利用してノンブレークスペースを削除する方法について解説します。
=SUBSTITUTE(“文字列”,CHAR(160),””)
=SUBSTITUTE(A1,CHAR(160),””)
サンプルのように赤字部分にノンブレークスペースを削除したい文字列かセルを指定するだけでOKです。
SUBSTITUTE関数は指定した文字列を置換することが出来る関数です。
この関数にノンブレークスペースを置換して貰えば良いということですね。
しかしながらどこにあるかも分からず見た目でも判断出来ないノンブレークスペースを直接指定するのは難しい為、先程紹介した文字コードを利用します。
CHAR関数は文字コードを指定し番号に対応した文字列を返してくれますので、
ノンブレークスペースの文字コードを指定すれば確実にノンブレークスペースを返してくれます。
ノンブレークスペースの文字コードは「160」なのでご紹介したサンプルのように組み合わせる事でノンブレークスペースを削除する事ができます。
文字列前後の空白とノンブレークスペースを削除する
ノンブレークスペースだけではなく、前後に付いている空白も合わせて削除したい場合はこちら。
WEBから取得したデータだと変なところに空白があったりして困る事ありますよね。
このサンプルではTRIM関数とSUBSTITUTE関数を使用しています。
=TRIM(SUBSTITUTE(“文字列”,CHAR(160),””))
=TRIM(SUBSTITUTE(A1,CHAR(160),””))
もしかしたら他の特殊文字が原因かも?
CLEAN関数を使うと印刷出来ない特殊文字を削除する事ができる為、案外これだけで解決することも。
このサンプルではCLEAN関数とTRIM関数を合わせて使用しています。
=CLEAN(TRIM(“文字列”))
=CLEAN(TRIM(A1))
空白をすべて削除する
消えない文字なんて無いくらいが良いんだよと思う方はこちら
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CLEAN(“文字列”),CHAR(160),””),” ”,””),” “,””)
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CLEAN(A1),CHAR(160),””),” ”,””),” “,””)
CLEAN関数を使って印刷出来ない特殊文字を削除した後、SUBSTITUTE関数で全角スペース、半角スペース、ノンブレークスペースを削除しています。
VBAを使って削除する
VBAではReplace関数の引数にChrW(160)を入れる事でノンブレークスペースを消す事が出来ます。
1 |
Replace("空白を消したい文字列", ChrW(160), "") |
ChrWは文字コードから文字を表示するコードです。
ChrWはUnicodeをサポートしている環境でのみ動作する為、Macユーザーの方は使えません。
サンプルのプロシージャも用意してみました。
モジュールにコピペすればそのまま使用することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub delete_nbsp_sample() Dim target As Variant Dim rng As Range Set rng = Application.InputBox(Prompt:="nbspを削除する範囲を選択して下さい。", _ Title:="範囲選択", _ Type:=8) For Each target In rng target = Replace(target, ChrW(160), "") Next MsgBox "処理が完了しました。" End Sub |
まとめ
通常の空白とは処理が違う為やや面倒ではありますが、専用の対策を行う事でしっかり消す事が出来ます。
外部からデータを取り込まない人が初めて目の当たりにした時は、頭を抱えるような問題です。
文字コードが違うなんて言われても知らん!!と私も思いました笑
VBAでノンブレークスペース以外の空白を削除する方法はこちらの記事でまとめていますので、是非参考にしてください。
コメント