String型の中身は自動的にS-JISに変換される件

Windows上で、SJIS 以外の文字列を扱うことが普通になっていますが、VBAで文字化けさせずに処理を行うのはちょっとコツがいります。
VBAの内部構造で、String型はUNICODEで保持されますが、APIやファイルに書き出すと自動的にS-JIS(正確にはCP932)に変換されてしまいます。
Stringの中身が外に出ていくときにはイメージ的にはStrConv(xxx, vbUnicode)が自動的にかかる感じ。
これを回避するためには書き方を変える必要があります。

APIの場合

  1. API の場合 W 付きのものを使用する。(又はマニュアルでUnicodを扱う方法が記述されていればその方法)
  2. API の引数は ByVal のLongPtr 型にする。
  3. 文字列にStrPtrをかけてアドレスを渡す。
'Excel 2010 以降 32/64bit対応
Private Declare PtrSafe Function SearchTreeForFileW Lib "dbghelp" (ByVal RootPath As LongPtr, ByVal InputPathName As LongPtr, ByVal OutputPathBuffer As LongPtr) As Long

'--------------------------------------------------------------
' ファイル検索(フィルタ高速版)
' 指定のファイルがファイルが見つかったら即リターンします。
'--------------------------------------------------------------
Public Function SearchTreeForFile(ByVal strPath As String, ByVal strFile As String) As String
    Dim strBuffer As String

    strBuffer = String$(MAX_PATH, vbNullChar)

    SearchTreeForFile = ""

    If SearchTreeForFileW(StrPtr(strPath), StrPtr(strFile), StrPtr(strBuffer)) Then
        SearchTreeForFile = Left$(strBuffer, InStr(strBuffer, vbNullChar) - 1)
    End If

End Function

ファイル出力の場合

  1. バイナリーモードでオープンする。
  2. String 型の文字列を Byte 型の可変型変数に代入
  3. Put で出力する。
Dim bytBuf() As Byte
Dim fp As Integer

fp = FreeFile
Open "a.txt" For Binary As fp

bytBuf = "ああああ"
Put #fp, , bytBuf

Close

可変長のByte型はString 型の文字が入るというのがミソではある。

ABOUTこの記事をかいた人

はてなブックマークで驚愕の1600越えを記録した伝説が今明らかに! エクセル方眼紙 四天王の1人(ほぼ最弱)窓の杜大賞2014 大賞受賞! Excelを便利にする250以上の機能を体系化したアドインはこちらです。