Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
bosse-sl
Member

Откуда:
Сообщений: 73
Добрый день

Чтобы импортировать данные из файлов Excel использовал следующее:
+
Private Sub Кнопка0_Click()
Dim a As Long
a = 0
a = CreateObject("scripting.filesystemobject").getfolder(CurrentProject.Path & "\файлы").files.Count 'считаем количество файлов в папке
If a > 0 Then 'если папка не пустая
'то
st = Dir$(CurrentProject.Path & "\файлы\*.xls", 15) 'запоминаем имя первого файла
Do While Len(st) > 0
Call LoadExcel(CurrentProject.Path & "\файлы\" & st) 'запускаем функцию загрузки инфы из файла
st = Dir$ 'запоминаем имя следующего файла
Loop
' Call Kill(CurrentProject.Path & "\файлы" & "*.*") 'удаляем все файлы из папки
Else
'иначе выводим сообщение о том что папка пустая
MsgBox "Сначала необходимо загрузить файлы в папку Файлы"
End If
 
End Sub
Private Function LoadExcel(ExcelPath As String)
'функция загрузки инфы из ексель файла
 
Dim ExlApp As Object
Dim WrkBk As Object
Set ExlApp = CreateObject("Excel.sheet")
Set WrkBk = ExlApp.Parent
WrkBk.workbooks.Open ExcelPath 'открываем файл ексель
WrkBk.Visible = False 'делаем невидимым
ExcelRow = WrkBk.Cells.SpecialCells(11).Row 'определяем количество строк
ExcelColumn = WrkBk.Cells.SpecialCells(11).Column 'определяем количество столбцов
 
Dim a(1 To 8) As Integer
 
For i = 1 To ExcelColumn 
'определяем нужные столбцы - сравнение идет по названию столбцов
Select Case WrkBk.Cells(1, i)
..................
End Select
Next i
 
'загружаем информацию в таблицу
................
 
WrkBk.Quit 'закрываем ексель
Set WrkBk = Nothing 'сброс объектных переменных
Set ExlApp = Nothing
 
End Function

Но сейчас приходят файлы в имени которых присутствует иероглифы и другие спец. символы.
Во время запуска функции импорта в строке
WrkBk.workbooks.Open ExcelPath

возникает ошибка, т.е. окошко в котором Microsoft Office Access сообщает: нам не удалось найти файл ... Возможно он был перемещен, переименован или удалён?
Пробовал смотреть название файла через MsgBox эти символы отображаются вопросительными знаками, как и при просмотре в области отладки (Immediate).

К сообщению приложен файл (Sample.zip - 29Kb) cкачать
25 май 19, 17:33    [21893894]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
Tarasios
Member

Откуда: Украина
Сообщений: 443
bosse-sl,
всегда можно "зайти с тыла" и решить проблему.
Например, можно предварительно переименовывать файлы. Кста, если в аксе не сможете переименовать файл, то с этим прекрасно справится простейший bat файл, и пару строк команд дос (remove и т.д). Сам же батник можно запускать из под акса, после чего обращаться к переименованному файлу без проблем.
26 май 19, 21:37    [21894266]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
vmag
Member

Откуда: MP
Сообщений: 3268
bosse-sl
Но сейчас приходят файлы в имени которых присутствует иероглифы и другие спец. символы.


проще решить проблему в самом поставщике файлов, чтобы не сейчас..., а всегда приходили файлы с именами в латинице и без спец символов
26 май 19, 22:04    [21894280]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4366
bosse-sl, можно использовать имена файлов в формате «8.3»
27 май 19, 04:10    [21894345]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ни Msgbox, ни Immediate не имеют полной поддержки unicode. Поэтому выводите путь на форму в тестовое поле или в таблицу, так будет корректно. Также VBA редактор также не имеет полной поддержки Unicode, поэтому не рекомендуется там писать что-либо символами отличными от ASCII, на не русском офисе это не будет работать с большой вероятностью.
27 май 19, 06:03    [21894354]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
tunknown
Member

Откуда:
Сообщений: 692
Tarasios
Например, можно предварительно переименовывать файлы.
Если переименовывать нежелательно, то можно создать через cmd файл связь и работать с ней.
fsutil hardlink create

Панург
bosse-sl, можно использовать имена файлов в формате «8.3»
Если их создание включено. Некоторые администраторы отключают. И не совсем ясно, как их получать, чтобы работать адресно с файлами, а не со всеми по маске. Впрочем, это касается и первого способа.
27 май 19, 09:29    [21894423]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4366
tunknown
Если их создание включено. Некоторые администраторы отключают.
Как отключили так и включат обратно.

tunknown
И не совсем ясно, как их получать, чтобы работать адресно с файлами, а не со всеми по маске.
Нипонял. Получаешь путь через GetShortPathName и работаешь как с обычным путём.
27 май 19, 09:51    [21894448]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 330
Да, для таких названий Dir не подходит, т.к. преобразует кодировку в Ansi.
А вот FSO, который вы используете мимоходом - вполне справляется.
Dim FSO As Object, fd As Object, fl As Object

    Set FSO = CreateObject("scripting.filesystemobject")
    Set fd = FSO.getfolder(CurrentProject.Path & "\файлы")
 
 For Each fl In fd.Files
    st = fl.Name
  If st Like "*.xls*" Then
     Call LoadExcel(fl.Path) 'запускаем функцию загрузки инфы из файла
  End If
 Next

Кстати, какая необходимость для каждого файла открывать и закрывать Excel, если его можно открыть перед первым файлом и закрыть по завершении цикла.
Скажу больше - не вижу необходимости вообще открывать Excel. На листе такой структуры можно открыть Recordset, проверить имена полей, прочитать данные и добавить записи в другой Recordset. А если в реалии строк гораздо больше, чем в примерах, то данные можно внести запросом на добавление.
27 май 19, 10:05    [21894458]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
bosse-sl
Member

Откуда:
Сообщений: 73
Добрый день всем
Прошу прощения, не имею возможности часто отвечать, поэтому сразу и всем.
Tarasios
можно предварительно переименовывать файлы. …. с этим прекрасно справится простейший bat файл
Интересный подход, но боюсь я его не осилю. Раньше батники не писал, как понимаю там необходимо сделать цикл и перебирать все символы имени файла и удалять не читаемые.

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

Панург
bosse-sl, можно использовать имена файлов в формате «8.3»
Спасибо за подсказку, но я не понимаю как применить (я пользователь, плохой "программист" - надо поставить правильно запятую - "казнить нельзя помиловать"). Как написал
tunknown
...Некоторые администраторы отключают...
С администраторами - на большинство вопросов получаешь ответ - "политика безопасности предприятия" - порой ощущение, что не всё могут понять/сделать, а фразой прикрываются.

MrShin
Ни Msgbox, ни Immediate не имеют полной поддержки unicode.
....
Также VBA редактор также не имеет полной поддержки Unicode, поэтому не рекомендуется там писать что-либо символами отличными от ASCII, на не русском офисе это не будет работать с большой вероятностью.
Спасибо, сначала не понимал, что происходит, потом разобрался, да и пару форумов почитал.

MrShin
Поэтому выводите путь на форму в тестовое поле или в таблицу, так будет корректно.
И так пробовал, но использовал получение пути через оператор Dir - а он оказывается преобразуетс всё в ANSI, так что не получалось получить правильное имя файла.
27 май 19, 12:57    [21894700]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
bosse-sl
Member

Откуда:
Сообщений: 73
Спасибо, вроде, то что мне надо буду пробовать.

Кривцов Анатолий
Да, для таких названий Dir не подходит, т.к. преобразует кодировку в Ansi.
К сожалению не знал

Кривцов Анатолий
А вот FSO, который вы используете мимоходом - вполне справляется.
Раньше использовал данный код который мне предложил хороший человек, были странные файлы Excel в которых была структура в XML-формате, вроде так. И как бывает, дорабатывал, улучшал, но работало, пока вот сейчас не столкнулся.

Кривцов Анатолий
А если в реалии строк гораздо больше, чем в примерах ....
Не только больше, но и структура сильно отличается, там необходимо перебирать листы (их от 5 до 10) и на каждом листе разная структура данных, там необходимо найти нужные столбцы, и т.д.

Кривцов Анатолий
Кстати, какая необходимость для каждого файла открывать и закрывать Excel, если его можно открыть перед первым файлом и закрыть по завершении цикла.
Об этом раньше не задумывался (в каком-то журнале, давно прочитал, анекдот: пришёл к программисту сын и спрашивает - Пап почему солнце всходит и заходит. Отец ему в ответ - Сына, пока оно работает не трогай.), пока работало, действительно надо-бы попробовать исправить, хотя пока не понимаю как.
27 май 19, 13:25    [21894747]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
Tarasios
Member

Откуда: Украина
Сообщений: 443
Tarasios
можно предварительно переименовывать файлы. …. с этим прекрасно справится простейший bat файл
Интересный подход, но боюсь я его не осилю. Раньше батники не писал, как понимаю там необходимо сделать цикл и перебирать все символы имени файла и удалять не читаемые.

С батником могу помочь, там всё очень просто.
Логика в том, что вы, судя по вашему описанию, не обрабатываете сразу несколько файлов, а по одному. То есть - файл пришёл, упал в определённую папочку. Есть хитрая команда Rename (Ren) (я ошибся с ремув). Она позволяет любое (!!!) название файла переименовать в любое новое название файла.

Rename (ren)
Изменяет имя файла или набора файлов.
Синтаксис

rename [диск:][путь] имя_файла_1 имя_файла_2

ren [диск:][путь] имя_файла_1 имя_файла_2

в вашем случае это будет выглядеть так.
Создаёте каталог, куда падает исходный файл в формате xls и где вы его будете переименовывать. Например, C:\Транзит
Создаёте текстовый файл, переобзываете его, например, в ИмяФайла.bat
В нём пишете строку
ren C:\Транзит *.xls НовИмя.xls

Как бы и всё.
27 май 19, 14:10    [21894829]     Ответить | Цитировать Сообщить модератору
 Re: Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 330
bosse-sl
Кривцов Анатолий
А если в реалии строк гораздо больше, чем в примерах ....
Не только больше, но и структура сильно отличается, там необходимо перебирать листы (их от 5 до 10) и на каждом листе разная структура данных, там необходимо найти нужные столбцы, и т.д.
Как я понял из вашего кода, на всех листах 4 назаания столбцов присутствуют всегда. Предлагаю вариант:

Sub ImportFromExcel(sPath As String)
Dim DBExl As Database, tdf As DAO.TableDef
Dim sSQL As String
    Set DBExl = OpenDatabase(sPath, False, False, "Excel 12.0;HDR=Yes")
    For Each tdf In DBExl.TableDefs
     If tdf.Fields(0).Name = "ИД#" And tdf.Fields(1).Name = "Квота" Then
        sSQL = "INSERT INTO [Лист1] ([ИД#],[Длина],[Тип],[Брутто]) IN '" & CurrentDb.Name & "' " _
            & "SELECT [ИД#],[Длина],[Тип],[Брутто] FROM [" & tdf.Name & "]"
        DBExl.Execute sSQL
     End If
    Next
End Sub

Запускать в предложенном выше коде:
Call ImportFromExcel(fl.Path) вместо вашей Call LoadExcel(fl.Path)
Эта процедура открывает файл как БД - перебирает все таблицы/листы - проверяет имена первых двух столбцов (как у вас) и выполняет запрос на добавление в таблицу "Лист1" вышей БД. И так для каждого файла в папке.
27 май 19, 15:53    [21894949]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить