セルから取得した値は既に Unicode です。
StrConv(vbUnicode)
現在のシステムコードページを使用して変換されたため、壊れている「ダブルユニコード」が得られます。
次に、Print
コマンドは、現在のシステム コードページを使用して、それを「単一の Unicode」に変換します。これをしないでください。あなたはユニコードを保存しているのではなく、あなたの現在の設定の下であなたの特定のコンピュータでのみ有効に見えるかもしれない無効なものを保存しています.
Unicode データを出力する (つまり、出力テキストを Unicode から ANSI に自動変換する既定の VB メカニズムを回避する) 場合は、いくつかのオプションがあります。
最も簡単なのはFileSystemObject
、Unicode 変換について何も発明しようとせずに使用することです。
With CreateObject("Scripting.FileSystemObject")
With .CreateTextFile("C:\" & Cells(1).Value & ".txt", , True)
.Write Cells(1).Value
.Close
End With
End With
Unicode を制御する最後のパラメーターに注意してください。
それを望まない場合は、次のように宣言CreateFileW
してWriteFile
機能させることができます。
Private Declare Function CreateFileW Lib "kernel32.dll" (ByVal lpFileName As Long, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef lpNumberOfBytesWritten As Long, ByRef lpOverlapped As Any) As Long
Private Const CREATE_ALWAYS As Long = 2
Private Const GENERIC_WRITE As Long = &H40000000
Dim hFile As Long
hFile = CreateFileW(StrPtr("C:\" & Cells(1).Value & ".txt"), GENERIC_WRITE, 0, ByVal 0&, CREATE_ALWAYS, 0, 0)
Dim val As String
val = Cells(1).Value
WriteFile hFile, &HFEFF, 2, 0, ByVal 0& 'Unicode byte order mark (not required, but to please Notepad)
WriteFile hFile, ByVal StrPtr(val), Len(val) * 2, 0, ByVal 0&
CloseHandle hFile