Страницы: 1
RSS
Проблемы с открытием файла с французским именем средствами VBA
 
Используется Excel 2007, локализованый русский.
Собственно проблема в открытии файлов с использованием функции Dir. Я накидал простенький пример, любой из методов открывает все .xlsx файлы в заданной папке.
Но как только в имени файла появляются французские акценты, VBA дает ошибку. Прилагаю и файл который не открывается.
в окне Immediate видно, что переменная содержит имя файла с измененной буквой é, поэтому и не находит файл чтобы открыть.
Странность в том, что открытие файла через ThisWorkbook.FollowHyperlink какое-то время срабатывало, и только вот сегодня отказалось напрочь. Умолчания в системе обычные, Excel только одной версии.
Если отбросить Dir, и читать имя файла из ячейки - то первый метод срабатывает корректно, второй так же не работает.
Подскажите, можно ли заставить текстовые переменные принимать значения в соответствие с не английским и не локальным языком? Или тут есть еще что-то что я вообще упустил?
Спасибо!
 
Файл с макросм сейчас скачать не могу, но думаю что поможет CHRW()
 
Уважаемые коллеги!
Представляется, что текстовые переменные не виноваты и заставлять их что-либо делать не нужно.

Проведем такой эксперимент. Создадим новую книгу, запишем в нее макрос:
Код
Sub TestDir()
    Dim f1, f2

    f1 = Thisworkbook.Path & "\" & Thisworkbook.Name  '  путь к данной рабочей книге
    f2 = Dir(f1)
    
    If f2 = Thisworkbook.Name Then
      MsgBox "OK"
      
    ElseIf f2 = "" Then
      MsgBox "Not found"
      
    Else
      MsgBox "SOS"
    End If
End Sub
Сохраним книгу с именем, содержащим хотя бы одну букву русского алфавита, например, Я_люблю_Excel.

Выполняем макрос TestDir. Разумеется, он выдаст "OK", а как же иначе?

А теперь проделаем тот же эксперимент в системе MS Windows c кодовой страницей по умолчанию, отличной от 1251, например 1252 (западноевропейской) (если такой конфигурации нет, то придется поверить на слово). Мы увидим "SOS".

Как это можно интерпретировать? Функция dir нашла файл (иначе бы мы увидели сообщение "Not found") но вернула нам его имя неправильно. Вывод: эта функция VBA не поддерживает Unicode (как, к сожалению, и некоторые ее сестры: Msgbox, InputBox и др.)

Итак, функцию Dir можно использовать для проверки наличия файла в папке и для определения числа файлов в папке (в случаях, когда нам достаточно знать, является ли возращаемое значение пустой строкой). Функцию Dir нельзя использовать для определения списка имен файлов в папке, если только в папке есть хотя бы один файл, имя которого нельзя корректно отобразить в кодовой странице по умолчанию. Для сканирования папки в этом случае можно использовать свойства и методы объекта "Scripting.FileSystemObject" - у него нет проблем с Unicode.

С именами файлов, содержащими французские буквы, функция dir, наоборот, корректно работает в Windows-1252 и не корректно в Windows-1251, что и наблюдал автор данной темы.
Изменено: sokol92 - 05.10.2017 09:54:35
Владимир
 
Попробуйте обойтись без функции dir, - может, такой вариант сработает
http://excelvba.ru/code/FilenamesCollection
 
Вот никогда не нравилась Dir(), интуитивно... :)
 
Спасибо всем, да, кодировка представляется проблемой.
Цитата
Hugo написал:
Вот никогда не нравилась Dir(), интуитивно...
вот и нашелся-таки ее косячок  ;)
Цитата
Игорь написал:
Попробуйте обойтись без функции dir, - может, такой вариант сработает
http://excelvba.ru/code/FilenamesCollection
спасибо, пока вопрос решен костылем, переносом списка файлов на лист, так как задача не повторяющаяся то и бог с ним. В будушем попробую.
Цитата
Hugo написал:
но думаю что поможет CHRW()
это если нужно сохранить файл со странным именем, тогда да. А как она может помочь при чтении?
 
Т.к. я не видел кода - я предположил что есть проблема как написать имя известного файла в коде.
 
Уважаемый Hugo, это тоже является проблемой. Если Вы в Windows-1252 выполните такой макрос (подключив для ввода клавиатурную поддержку русского языка):


Код
Sub Test
  Activecell.value="Я люблю Excel!"
End Sub



то увидите в начале ячейки "кракозябры". Проблема с использованием текстовых литералов налицо!

Поэтому автор темы выбрал правильное решение поместить имена файлов в ячейки листа.
Изменено: sokol92 - 05.10.2017 13:41:55
Владимир
 
Второй раз вляпался в проблемы с Dir - в этот раз имена были английские, но файлы сделаны на бельгийской машине, то есть опять франузский язык в системе. Если сделать копию файла в папке (просто Ctrl-c,  Ctrl-v), появляющуюся копию Dir уже не воспринимает.
Дальше еще круче, открываешь файл, меняешь данные вручную, сохраняешь, закрываешь.
Открываешь через sFiles - открывается старая версия, неизмененная. Ну ладно, думаешь, забыл сохранить изменения. Открываешь обычным образом - все изменения на месте. Бред какой-то.
Вобщем настала пора попробовать:
Цитата
Игорь написал:может, такой вариант сработает
Работает на ура, спасибо
Страницы: 1
Читают тему
Наверх