Файл VBA = Dir() извлечение тарабарского имени файла

Блок обработки кода, перебирающего файлы в каталоге:

Dim file As Variant
file = Dir(directory)
While (file <> "")
  If (InStr(file, ".xlsx") > 0) And (InStr(file, "Percentage") = 0) And (InStr(file, aggregateFilename) = 0) Then
        Call fight_dynamics_by_percentage_buckets(aggregateFilename, directory, file, folderToRunMacro, num_buckets)
  End If
 file = Dir
Wend

Ранее в моем коде пользователь выбирает каталог, в котором хранится набор файлов. В моем тестовом каталоге у меня есть следующие файлы:

Analyzed.11.14.383.Chamber1.xlsx
Analyzed.11.14.383.Chamber2.xlsx
Analyzed.11.14.383.Chamber3.xlsx

Когда я запускаю макрос, программа извлекает имена файлов как:

Analyzed.11.14.383#494E5A0.xlsx
Analyzed.11.14.383#494E5A1.xlsx
Analyzed.11.14.383#494E5A2.xlsx

Я использовал этот точный код раньше в предыдущих каталогах, и у меня не было проблем с извлечением правильных имен файлов.

Что тут происходит?


person user2996892    schedule 06.07.2015    source источник
comment
Какая операционная система? Какая версия Экселя?   -  person John Coleman    schedule 06.07.2015
comment
Какое (кроме Excel) программное обеспечение автоматически генерировало рабочие книги и какой код стоит за генерацией имен файлов? Мне кажется, что у вас там какой-то юникод.   -  person    schedule 06.07.2015
comment
@Jeeped Я тоже задавался этим вопросом - но похоже, что искаженная часть представляет собой шестнадцатеричное представление числа, и было бы странно, если бы строка Unicode, которая декодируется в Chamber1 в одной кодировке, декодируется в шестнадцатеричную строку в другой.   -  person John Coleman    schedule 07.07.2015
comment
На самом деле проблема возникает не в Chamber, а в точке (т. е. полной остановке) непосредственно перед Chamber. Это также могут быть пробелы нулевой длины или какой-либо другой редкий символ, ошибочно используемый в качестве разделителя атомов. FWIW, A0 (#160;) — неразрывный пробел.   -  person    schedule 07.07.2015


Ответы (1)


Я не вижу никаких проблем с вашим кодом, и он отлично работает для меня. Это может быть проблема с конкретной системой Excel. Вы можете использовать другой вариант, чтобы получить тот же результат, и вот коды для справки. Хорошего дня

Set filesys = CreateObject("Scripting.FileSystemObject")
For Each sfile In filesys.GetFolder(directory).Files
    file = filesys.GetFileName(sfile)
    If (InStr(file, ".xlsx") > 0) And (InStr(file, "Percentage") = 0) And (InStr(file, aggregateFilename) = 0) Then
        Call fight_dynamics_by_percentage_buckets(aggregateFilename, directory, file, folderToRunMacro, num_buckets)
    End If
Next
person Nand Kishor Swami    schedule 06.07.2015