Работа с именами файлов Unicode в VBA (с помощью Dir, FileSystemObject и т. д.)

Я переборе через файлы в папке (что означает, что я не знаю имен в папке), и есть файл с польским ł символ.

на Dir функция преобразует это в l что означает, что имя файла не может быть найдено позже. Я объявил var, которому я назначаю значение dir в виде строки.

Я также пробовал FSO и getfolder, который также имеет ту же проблему.

Я также заметил файл диалоговое окно (установить в режим выбора папки) преобразует символ выше тоже.


это ошибка, или это что-то, что можно обойти?

1 ответов


похоже, вас вводит в заблуждение тот факт, что в то время как сам VBA поддерживает символы Юникода,среда разработки VBA нет. Редактор VBA по-прежнему использует старые кодировки символов "кодовая страница" на основе параметров локали в Windows.

конечно FileSystemObject et. Эл. действительно поддерживает символы Юникода в именах файлов, как показано в следующем примере. С папкой, содержащей три простых текста файлы

имя файла: 1_English.txt
Содержание: London is a city in England.

имя файла: 2_French.txt
Содержание: Paris is a city in France.

имя файла: 3_Połish.txt
Содержание: Warsaw is a city in Poland.

следующий код VBA ...

Option Compare Database
Option Explicit

Sub scanFiles()
    Dim fso As New FileSystemObject, fldr As Folder, f As File
    Set fldr = fso.GetFolder("C:\__tmp\so33685990\files")
    For Each f In fldr.Files
        Debug.Print f.Path
    Next
    Set f = Nothing
    Set fldr = Nothing
    Set fso = Nothing
End Sub

... производит следующие выходные данные в окне Immediate ...

C:\__tmp\so33685990\files_English.txt
C:\__tmp\so33685990\files_French.txt
C:\__tmp\so33685990\files_Polish.txt

отметим, что Debug.Print инструкция преобразует ł символ l потому что среда разработки VBA не удается отобразить ł использование моего языка Windows (US English).

однако, следующий код открывает все три файла ...

Option Compare Database
Option Explicit

Sub scanFiles()
    Dim fso As New FileSystemObject, fldr As Folder, f As File, ts As TextStream
    Set fldr = fso.GetFolder("C:\__tmp\so33685990\files")
    For Each f In fldr.Files
        Set ts = fso.OpenTextFile(f.Path)
        Debug.Print ts.ReadAll
        ts.Close
        Set ts = Nothing
    Next
    Set f = Nothing
    Set fldr = Nothing
    Set fso = Nothing
End Sub

... отображение

London is a city in England.
Paris is a city in France.
Warsaw is a city in Poland.