Страницы: 1
RSS
Иероглифы в названии имени файла
 
Добрый день.
Столкнулся с проблемой, самостоятельно решить не удалось, прошу помощи.

Макрос считывает имена файлов в указанной папке.
На ПК, на котором макрос писался - всё ок, на другом во время обработки файлов, в именах которых присутствует буква "й" (к примеру "бейсболки.xlsx") появляется ошибка:  "Run-time error '1004': не удалось найти файл ...\беи?сболки..xlsx".

Код
Sub Open_all_files_in_dir()
    Dim xStrPath$, xFile$, xFileDialog As FileDialog
    Set wb_main = ActiveWorkbook
    Set sh_base = wb_main.ActiveSheet
    Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)

    With xFileDialog
        .AllowMultiSelect = False
        .Title = "Select a folder with files"
        If .Show = -1 Then xStrPath = .SelectedItems(1)
    End with

    If xStrPath = "" Then Exit Sub
    xFile = Dir(xStrPath & Application.PathSeparator & "*.xl*")
   
    Do While xFile <> ""
        Workbooks.Open xFile ' "Run-time error '1004': не удалось найти файл xFile"
        Set act_wb = ActiveWorkbook
        '...
        act_wb.close
        xFile = Dir
    Loop
  
    wb_main.Save
End Sub

Пробовал хардово заменять в имени файла "и~?" на "й"  :) , не помогло
Код
    Do While xFile <> ""
        xFile = Replace(xFile, "и?", "й")        
        '...
        xFile = Dir
    Loop        

Как я понимаю, проблема в кодировке, в интернете нашёл только примеры исправления кодировки содержимого и в основном текстовых файлов.
 
VBA проблемы с кодировкой (planetaexcel.ru)
тут описана функция, меняющая кодировку.
 
Смотрел, в теме описана кодировка содержимого файла, у меня же проблема в имени файла, при считывание имён файлов в папке. Сам файл перекодировать не нужно.
 
С помощью функции измените кодировку полного имени файл:
Код
xFile = ChangeTextCharset(xFile , "Windows-1251", "UTF-8")

...

Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _
                           Optional ByVal SourceCharset$) As String
    ' функция перекодировки (смены кодировки) текстовоq строки
    ' В качестве параметров функция получает текстовую строку txt$,
    ' и название кодировки DestCharset$ (в которую будет переведён текст)
    ' Функция возвращает текст в новой кодировке
    On Error Resume Next: Err.Clear
    With CreateObject("ADODB.Stream")
        .Type = 2: .Mode = 3
        If Len(SourceCharset$) Then .Charset = SourceCharset$    ' указываем исходную кодировку
        .Open
        .WriteText txt$
        .Position = 0
        .Charset = DestCharset$    ' назначаем новую кодировку
        ChangeTextCharset = .ReadText
        .Close
    End With
End Function
 
Эта проблема описана здесь, пункт 3.4. Кратко: не используйте функцию dir.

На проблемном компьютере установлена Windows c кодовой страницей по умолчанию, отличной от Windows-1251.
Изменено: sokol92 - 16.05.2022 14:41:23
Владимир
 
sokol92, приветствую!
  У меня есть файлы с турецкими символами в наименовании и Dir не используется. Получаю через FSO и полученный путь не равен исходному, т.к. символы заменяются. Решил пока программой от начальника на Delpfi - файлы копируются в одну папку с короткими именами-ключами (латиница и цифры), а связь осуществляется через таблицу "старый путь-новый путь".
  Помимо нечитаемых штатными способами символов, там ещё длина пути часто более 255 символов, так что программа и этот момент обходит. Может, Виталий сделает похожую версию для своей библы или у меня появится время и я что-то на VBA насочиняю, но для длинных путей пока только Shell с последующей декодировкой, что мне не нравится…
Изменено: Jack Famous - 16.05.2022 15:17:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте, Алексей!
Выложите, пожалуйста, пример файла с турецкими символами (можно пустого), при чтении имени которого через FSO искажается название. Я не встречал подобного.
Владимир
 
sokol92, пытался смоделировать в файле-примере, но всё открывает. Буду искать ошибку далее по коду — FSO сохраняет и открывает запомненный путь отлично  :D  Спасибо  :idea:

UPD:
sokol92, ошибка возникала при попытке получить размер и дату последнего изменения файла штатными средствами.
Заменил их FSO-аналогами  FileLen(path)FSO_File.Size + FileDateTime(path)FSO_File.DateLastModified и всё отлично  :idea:
Изменено: Jack Famous - 16.05.2022 17:52:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
del
Изменено: Jack Famous - 16.05.2022 17:52:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх