Excelに外部のコードやログを貼り付けた際、見た目では半角スペースに見えるのに、実際には不可視文字が混入していて処理がうまくいかないという経験はありませんか?
特にWeb サイトやアプリのログなどには、以下のような「見えない異物」が含まれていることがあります。
- BOM(Byte Order Mark、FEFF)
- NBSP(ノーブレークスペース、160)
- ゼロ幅スペース系
- タブ文字
- 非印字ASCII
見た目だけでは気づけず、VBA側で文字列比較やパースを行った際に突然エラーになったり、意図しない分岐になったりする厄介な問題です。
そこでこの記事では、Excelに貼り付けた文字列を安全にクリーニングするVBA関数を紹介します。
よくあるトラブル:半角スペースのように見えるけど「?」が返る問題
Excelシート上では普通のスペースに見えるのに、VBAで取り出すと「?」などに変換されてしまうことがあります。
これはExcelが内部で文字コードを変換する過程で、扱えない不可視文字が「?」にフォールバックされるためです。
原因文字として特に多いのがWebコピーで発生するNBSPです。
そのため、コード解析などに使う前に、これらの文字をクリーニングする処理は非常に有効です。
汎用クリーニング関数
' ==========================================================
' GetCleanCellValue
' 概要 : 指定シートの指定セル(行・列)の値を取得し、
' パースに適した形へクリーニングして返す。
'
' 引数 :
' ws - 対象ワークシート
' rowIndex - 対象行番号(Long)
' colIndex - 対象列番号(Long)
' doCompressSpaces - True: 連続スペースを1つに圧縮(Excel TRIM)
' doTrimEnds - True: 前後スペースを削除(VB Trim)
'
' 戻り値 :
' String - クリーニング済み文字列
' ==========================================================
Public Function GetCleanCellValue(ws As Worksheet, _
ByVal rowIndex As Long, _
ByVal colIndex As Long, _
Optional ByVal doCompressSpaces As Boolean = True, _
Optional ByVal doTrimEnds As Boolean = True _
) As String
Dim cellValue As String
' --- 対象セル取得 ---
On Error Resume Next
cellValue = CStr(ws.Cells(rowIndex, colIndex).Value)
On Error GoTo 0
If LenB(cellValue) = 0 Then
GetCleanCellValue = cellValue
Exit Function
End If
' --- 文字列クリーニング処理 ---
' BOM / ゼロ幅ノーブレークスペース削除
cellValue = Replace$(cellValue, ChrW(&HFEFF), "")
' NBSP(ノーブレークスペース)→ 通常スペース
cellValue = Replace$(cellValue, ChrW(160), " ")
' タブ → スペース
cellValue = Replace$(cellValue, vbTab, " ")
' 非印字ASCII削除
cellValue = WorksheetFunction.Clean(cellValue)
' --- スペース関連処理(引数で制御) ---
' 連続スペースを1つに(Excel TRIM)
If doCompressSpaces Then
cellValue = Application.WorksheetFunction.Trim(cellValue)
End If
' 前後スペース削除(VB Trim)
If doTrimEnds Then
cellValue = Trim$(cellValue)
End If
GetCleanCellValue = cellValue
End Function
クリーニングで行っていること
◆ BOM(FEFF)とゼロ幅スペース類の除去
コピー元がUTF-8の場合、先頭にBOMが付くことがあります。
◆ NBSPを通常スペースに変換
HTML由来で特に発生しやすいです。見た目はスペースだが実体は別文字となっています。
◆ タブをスペースに変換
タブはコード上で扱うとブレやすいため標準化しています。
◆ 非印字ASCIIをCLEAN関数で除去
Excel関数CLEANは、ASCII 0~31を除去してくれます。
まとめ
Excelに外部コードを貼り付けた際の不可視文字は、意図しない動作の原因になりがちな隠れたトラブルです。
今回紹介したクリーニング関数は以下をまとめて対処できます。
- BOM、NBSP、タブ、非印字文字などの除去
- 連続スペースの統一
- パースしやすい安全な文字列への整形
文字列を扱う処理を安定させたい場合は、ぜひ導入してみてください。