ブラウザからExcelにコピペするとnbspが含まれる
Excelにはいろんなアプリのデータをコピペで貼り付けることがよくありますが、Webブラウザからも同様に貼り付けることが可能です。その際に、Webブラウザ上の書式もそのまま引き継がれる箇所が出てきます。フォントの種類や文字の大きさや色などです。
このときに、Excelに貼り付けられたデータにはWeb固有の情報が含まれることがあります。その一つがnbspです。他にもWebの特殊文字は多数ありますが、圧倒的に利用頻度が多いのがnbspです。
nbspとは、Non-Breakin SPace(ノンブレーキングスペース)という特殊な空白文字です。見た目は半角スペースに似ており、実際にもブラウザ上で半角スペース分の間隔を空けるために利用されます。また、単語区切りで改行を入れたくない場合にも利用されます。HTMLでは「 」と書きます。通常の半角スペースの文字コード(ASCIIコード)は20ですが、nbspの文字コードは160と別文字として扱われます。
このnbspがExcelに残っている場合、見た目上は半角スペースなのに、検索や置換で半角スペースとして認識されないという問題が発生します。半角スペースを置換で除去しようと思っても出来ません。結果として「この半角スペース消えないんだけど、なにこれ?」という状況になります。
Excel上でnbspを消す方法は、セルに入力されている内容を手で消して入力しなおすしかありません。要は書き直しです。nbspはただの文字なので消してしまえば普通に消えます。
ただ、めんどくさいです。
そこで、VBAを使ってnbspを除去する方法を紹介します。
セルの文字列からnbspを除去するコード
文字列からnbspを除去するには、Replace関数でnbspを空文字に置き換えます。もし、nbspの見た目上の半角スペースを残しておきたいのであれば、Replace関数の第三引数の空文字「””」を半角スペース「” “」に変更してください。
以下のコードでは関数が2つありますが、nbspを除去するのは1つ目のdelete_nbsp関数です。Replace関数を使って、引数で渡された文字列のnbspを空文字列に置換しています。nbspのASCIIコードは160で、UnicodeのためChrW関数を使っています。
使い方は、nbspを除去したいシートをアクティブにして、2番目のdelete_nbsp_sheet関数を実行します。実行するとアクティブシートで入力されているセル範囲の全てのセルから、nbspを除去します。入力セル範囲を示すのがUsedRangeです。
文字コードが0から127であればChr関数もChrW関数も同じ結果になりますが、nbspはUnicodeのため、Unicode用のChrW関数を利用します。
Replace関数の詳細については「VBAで文字列を別の文字列に置換する(Replace)」をご参照ください。
ChrW関数の詳細については「文字コードから文字を取得(Chr、ChrB、ChrW)」をご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Function delete_nbsp(s As String) As String delete_nbsp = Replace(s, ChrW(160), "") End Function '// nbspが含まれるセルを探す Sub delete_nbsp_sheet() Dim r As Range '// セル Dim sht As Worksheet '// シート '// アクティブシートを処理対象のシートとして設定 Set sht = ActiveSheet '// シートの入力セル範囲を全てループ For Each r In sht.UsedRange '// nbspがセルに含まれる場合 If InStr(1, r.Value, ChrW(160)) > 0 Then '// nbspがあるセルの座標を出力 Debug.Print r.Address(False, False) '// nbspを除去 r.Value = delete_nbsp(r.Value) End If Next End Sub |
Excelでnbspを入力する方法
おまけです。
実はExcel上でnbspを入力する方法があります。
altキーを押しながら、テンキーで0、1、6、0、と入力すると、半角スペースが入力されたように見えます。実体はnbspが入力されています。
何か用途があるんか、と言われると別になさそうですが、入力できます。