2013-01-10 67 views
2

演示我的問題我怎樣才能在自己創建的文件名包含特殊字符的文本文件

  • 打開一個新的Excel工作簿中並保存這些符號設計師協會到細胞[A1]
  • 插入以下VBA代碼某處在編輯器(Alt鍵 + F11
  • 執行它每行線(F8
Sub test() 

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

    Open strFilename For Output As #1 
    Print #1, strSpecialchars & strCRLF; 
    Close #1 

End Sub

您將得到一個包含[A1]中文字符的文本文件。這證明VBA能夠處理unicode字符,如果您知道添加技巧StrConv(vbCrLf, vbUnicode)

現在請嘗試相同的strFilename = "C:\" & strSpecialchars & ".txt"。你會得到一個錯誤,你不能用這個文件名創建一個文件。當然,你不能用同樣的技巧添加一個新的行,因爲它的文件名。

如何使用VBA在文件名中創建包含特殊字符的文本文件?
有沒有解決辦法,還是我做錯了什麼?

注意

+0

你不必非得來設置基準,(雖然我不知道這是爲什麼我們做這樣的問題)。你可以使用沒有引用的後期綁定: - Dim FSO作爲Object {newline}設置FSO = CreateObject(「Scripting.FileSystemObject」) - 但你失去了所有的Intellisense和預定義的常量。你確定這種方法有幫助嗎?我仍然收到錯誤的文件名錯誤。 – Morbo

回答

5

從單元格中檢索的值已經是Unicode。

StrConv(vbUnicode)給你「雙unicode」,因爲它通過使用當前sustem代碼頁進行轉換而被破壞。
然後,Print命令再次使用當前系統代碼頁將其轉換回「單一unicode」。不要這樣做。你不保存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的最後一個參數。

如果你不希望出現這種情況,你可以聲明CreateFileWWriteFile功能:

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 
+0

+1 - 這兩種方法都起作用,我只想提一下,有[第三個有效方法](http://stackoverflow.com/questions/9632830/read-chinese-characters-from-excel-worksheet-always-returns)使用'CreateObject(「ADODB.Stream」)',它已經爲我工作。 – nixda

3

您正處於FileSystemObject的正確軌道上。正如Morbo提到的,你可以延遲這一點,所以沒有設置參考。 FSO有一個CreateTextFile函數,可以用unicode設置,這樣字符就會顯示爲'??????'在VBA中,但會正確寫入文件名。注意CreateTextFile函數的第二個參數爲文件名指定一個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 
+0

+1 - 你說得對,那個方法會奏效。 (你是否錯過了'oFSO.CreateTextFile(strFilename,True)'中的[第二個參數](http://msdn.microsoft.com/zh-cn/library/aa265018(v=vs.60).aspx) 。或至少第二個逗號? – nixda

+0

是的,你是對的,它應該有第二個逗號。一個有趣的qn所以+1 – CuberChase

相關問題