Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы / 12 сообщений из 12, страница 1 из 1
25.05.2019, 17:33
    #39818232
bosse-sl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
Добрый день

Чтобы импортировать данные из файлов Excel использовал следующее:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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


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


возникает ошибка, т.е. окошко в котором Microsoft Office Access сообщает: нам не удалось найти файл ... Возможно он был перемещен, переименован или удалён?
Пробовал смотреть название файла через MsgBox эти символы отображаются вопросительными знаками, как и при просмотре в области отладки (Immediate).
...
Рейтинг: 0 / 0
26.05.2019, 21:37
    #39818480
Tarasios
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
bosse-sl,
всегда можно "зайти с тыла" и решить проблему.
Например, можно предварительно переименовывать файлы. Кста, если в аксе не сможете переименовать файл, то с этим прекрасно справится простейший bat файл, и пару строк команд дос (remove и т.д). Сам же батник можно запускать из под акса, после чего обращаться к переименованному файлу без проблем.
...
Рейтинг: 0 / 0
26.05.2019, 22:04
    #39818493
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
bosse-slНо сейчас приходят файлы в имени которых присутствует иероглифы и другие спец. символы.

проще решить проблему в самом поставщике файлов, чтобы не сейчас..., а всегда приходили файлы с именами в латинице и без спец символов
...
Рейтинг: 0 / 0
27.05.2019, 04:10
    #39818547
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
bosse-sl, можно использовать имена файлов в формате « 8.3 »
...
Рейтинг: 0 / 0
27.05.2019, 06:03
    #39818551
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
Ни Msgbox, ни Immediate не имеют полной поддержки unicode. Поэтому выводите путь на форму в тестовое поле или в таблицу, так будет корректно. Также VBA редактор также не имеет полной поддержки Unicode, поэтому не рекомендуется там писать что-либо символами отличными от ASCII, на не русском офисе это не будет работать с большой вероятностью.
...
Рейтинг: 0 / 0
27.05.2019, 09:29
    #39818599
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
TarasiosНапример, можно предварительно переименовывать файлы. Если переименовывать нежелательно, то можно создать через cmd файл связь и работать с ней.
Код: sql
1.
fsutil hardlink create


Панургbosse-sl, можно использовать имена файлов в формате « 8.3 »Если их создание включено. Некоторые администраторы отключают. И не совсем ясно, как их получать, чтобы работать адресно с файлами, а не со всеми по маске. Впрочем, это касается и первого способа.
...
Рейтинг: 0 / 0
27.05.2019, 09:51
    #39818613
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
tunknownЕсли их создание включено. Некоторые администраторы отключают.Как отключили так и включат обратно.

tunknownИ не совсем ясно, как их получать, чтобы работать адресно с файлами, а не со всеми по маске.Нипонял. Получаешь путь через GetShortPathName и работаешь как с обычным путём.
...
Рейтинг: 0 / 0
27.05.2019, 10:05
    #39818619
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
Да, для таких названий Dir не подходит, т.к. преобразует кодировку в Ansi.
А вот FSO, который вы используете мимоходом - вполне справляется.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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. А если в реалии строк гораздо больше, чем в примерах, то данные можно внести запросом на добавление.
...
Рейтинг: 0 / 0
27.05.2019, 12:57
    #39818742
bosse-sl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
Добрый день всем
Прошу прощения, не имею возможности часто отвечать, поэтому сразу и всем.
Tarasiosможно предварительно переименовывать файлы. …. с этим прекрасно справится простейший bat файлИнтересный подход, но боюсь я его не осилю. Раньше батники не писал, как понимаю там необходимо сделать цикл и перебирать все символы имени файла и удалять не читаемые.

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

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

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

MrShin Поэтому выводите путь на форму в тестовое поле или в таблицу, так будет корректно. И так пробовал, но использовал получение пути через оператор Dir - а он оказывается преобразуетс всё в ANSI, так что не получалось получить правильное имя файла.
...
Рейтинг: 0 / 0
27.05.2019, 13:25
    #39818767
bosse-sl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
Спасибо, вроде, то что мне надо буду пробовать.

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

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

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

Кривцов АнатолийКстати, какая необходимость для каждого файла открывать и закрывать Excel, если его можно открыть перед первым файлом и закрыть по завершении цикла. Об этом раньше не задумывался (в каком-то журнале, давно прочитал, анекдот: пришёл к программисту сын и спрашивает - Пап почему солнце всходит и заходит. Отец ему в ответ - Сына, пока оно работает не трогай.), пока работало, действительно надо-бы попробовать исправить, хотя пока не понимаю как.
...
Рейтинг: 0 / 0
27.05.2019, 14:10
    #39818808
Tarasios
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
Tarasiosможно предварительно переименовывать файлы. …. с этим прекрасно справится простейший bat файлИнтересный подход, но боюсь я его не осилю. Раньше батники не писал, как понимаю там необходимо сделать цикл и перебирать все символы имени файла и удалять не читаемые.

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

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

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

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

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

Как бы и всё.
...
Рейтинг: 0 / 0
27.05.2019, 15:53
    #39818854
Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы
bosse-slКривцов АнатолийА если в реалии строк гораздо больше, чем в примерах ....Не только больше, но и структура сильно отличается, там необходимо перебирать листы (их от 5 до 10) и на каждом листе разная структура данных, там необходимо найти нужные столбцы, и т.д. Как я понял из вашего кода, на всех листах 4 назаания столбцов присутствуют всегда. Предлагаю вариант:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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" вышей БД. И так для каждого файла в папке.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Vba отказывается работать с файлами в имени которых иероглифы и другие спец символы / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]