2

私の問題のデモンストレーション

  • 新しいExcelブックを開き、これらの記号をセル[A1]に保存します。
  • 次のVBAコードをエディターのどこかに挿入します(Alt+ F11
  • 1行ごとに実行します(F8
サブテスト()

    strCRLF = StrConv(vbCrLf、vbUnicode)
    strSpecialchars = StrConv(Cells(1、1)、vbUnicode)
    strFilename = "c:\ test.txt"

    #1として出力するためにstrFilenameを開きます
    印刷#1、strSpecialchars&strCRLF;
    #1を閉じる

サブ終了

[A1]の漢字を含むテキストファイルを取得します。これは、追加のトリックを知っている場合、VBAがUnicode文字を処理できることを証明しますStrConv(vbCrLf, vbUnicode)

今度は同じことを試してくださいstrFilename = "C:\" & strSpecialchars & ".txt"。このファイル名でファイルを作成できないというエラーが表示されます。もちろん、ファイル名以降に新しい行を追加する同じトリックを使用することはできません。

VBAを使用してファイル名に特殊文字を含むテキストファイルを作成するにはどうすればよいですか?
回避策はありますか、それとも何か間違ったことをしていますか?

ノート

4

2 に答える 2

6

セルから取得した値は既に 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
于 2013-01-12T11:24:35.913 に答える
3

あなたは FileSystemObject で正しい軌道に乗っています。Morbo が述べたように、これを遅延バインドできるため、参照は設定されません。FSO には、Unicode で設定できる CreateTextFile 関数があるため、文字は「??????」として表示されます。VBA ですが、ファイル名に正しく書き込みます。CreateTextFile 関数の 2 番目のパラメーターは、ファイル名の Unicode 文字列を指定することに注意してください。以下はあなたのためにトリックを行います:

Sub test()
    Dim strCRLF As String, strSpecialchars As String, strFilename As String
    Dim oFSO As Object, oFile As Object

    strCRLF = StrConv(vbCrLf, vbUnicode)
    strSpecialchars = StrConv(Cells(1, 1), vbUnicode)
    strFilename = "C:\" & Cells(1, 1).Value & ".txt"

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFile = oFSO.CreateTextFile(strFilename, , True)

    oFile.Write strSpecialchars & strCRLF

    oFile.Close

    Set oFile = Nothing
    Set oFSO = Nothing
End Sub
于 2013-01-12T10:53:34.363 に答える