powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Макрос для быстрого импорта из Excel
25 сообщений из 40, страница 1 из 2
Макрос для быстрого импорта из Excel
    #39299388
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток!
Есть два десятка excel-файлов. Регулярно требуется часть листов с этих файлов импортировать в Access-файлы с теми же именами файлов.
Как я решал эту задачу. Импортировал каждый лист каждого файла и сохранял опции импорта в меню "Сохраненные операции импорта". В дальнейшем, запуская импорт по сохраненным параметрам, обновлял нужные таблицы.
Все это хорошо... Но обновление баз даже с применением сохранения настроек занимает довольно продолжительное время. Подскажите, пожалуйста, можно ли это автоматизировать? Есть опыт написания макросов в Excel.
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39299430
barbacucaЕсть опыт написания макросов в Excel. Т.е. с VBA вы знакомы.
Напишите процедуру, в которой многократно вызывайте метод DoCmd.TransferSpreadsheet, подставляя путь к файлу, имя листа и имя таблицы.
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39299946
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
спасибо, все получилось...
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39299952
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
А не подскажете, как сделать так, чтобы данные не добавлялись в таблицу, а заменяли существующие (с сохранением типа данных у полей)
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39299955
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
спасибо. справился сам.
CurrentProject.Connection.Execute ("DELETE * FROM Tabl;")
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300155
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
Что то у меня все слишком сложно получается... Может поможете с написанием кода для решения следующей задачи:
1. В текущем Access файле M.accdb нужно удалить все таблицы.
2. Из файла M.xlsm нужно загрузить данные. Имена таблиц должны соответствовать именам листов в Excel-файле. Имена полей - именам заголовков (первая строка). Проигнорировать лист с именем "ПереченьМОП".
Обновление полей не подходит, поскольку количество столбцов и их имена не всегда совпадают.
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300320
barbacuca1. В текущем Access файле M.accdb нужно удалить все таблицы.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub DeleteAllTables()
Dim db As Database, i As Integer, sName As String

    Set db = CurrentDb
    For i = db.TableDefs.Count - 1 To 0 Step -1
        sName = db.TableDefs(i).Name
'Debug.Print sName
     If sName Like "MSys*" Then
        'system tables
     Else
        db.TableDefs.Delete sName
     End If
    Next
End Sub


barbacuca2. Из файла M.xlsm нужно загрузить данные. Имена таблиц должны соответствовать именам листов в 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.
Sub ImportFromExcel()
Dim db As Database, i As Integer, sName As String, sFilePath

    sFilePath = CurrentProject.Path & "\" & "M.xlsm"
    'Удаляем таблицы
    Call DeleteAllTables
    
    'Открываем файл Excel как БД
    Set db = OpenDatabase(sFilePath, False, True, "Excel 12.0 Xml;")
    For i = 0 To db.TableDefs.Count - 1
    'Возвращает имена листов (с "$" в конце) и имена интервалов.
        sName = db.TableDefs(i).Name
     If sName Like "*$" Then
        'Обрабатываем только листы
'Debug.Print sName
        sName = Left$(sName, Len(sName) - 1)
        If sName <> "ПереченьМОП" Then
        'Импортируем текущий лист
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, sName, sFilePath, True, sName & "$"
        End If
     End If
    Next
End Sub
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300761
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
спасибо огромное! Очень выручили!
VBA заругалась на 'Dim db As Database'. Compile error: Expected user-defined type, not project
Закомментировал и все заработало...

ps Хотелось бы выразить материальное поощрение. Сообщите в лс номер банковской карты
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300764
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barbacucaЗакомментировал и все заработало...
Вот это не очень хорошо. Значит у вас в модуле в самом начале не стоит
Код: vbnet
1.
Option Explicit


и можно использовать необъявленные переменные, что рано или поздно приведет к ошибкам, которые будет сложно найти. Добавьте эту опцию в каждый модуль, а в VBA редакторе поставьте галочку
Tools->Options->Editor->Require Variable Declarations, чтобы в создаваемых модулях эта опция ставилась автоматически.

То, что у вас не опознался тип Database значит, скорее всего, что не подключена библиотека Microsoft Office Database Engine Object Library (Tools->References)
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300771
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,
вроде подключено (см. скриншот). Но объявлять переменную не хочет (((
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300773
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,
пытаюсь удалить поле:
Код: plaintext
db.TableDefs(i).Fields(j).Delete
Видимо неправильно )) Подскажите, что не так?
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39300995
barbacucaХотелось бы выразить материальное поощрение.
"спасибо огромное!" меня устраивает, на то и форум. Хотите поощрить - выпейте за мое здоровье.

barbacucadb.TableDefs(i).Fields(j).Delete Это неправильно. У поля нет метода Delete, он есть в коллекции Fields.

Надо так:
Код: vbnet
1.
2.
3.
With db.TableDefs(i").Fields
    .Delete .Item(j).Name
End With

А что это вы такое делаете? Да еще в цикле по таблицам и их полям?

barbacucaVBA заругалась на Dim db As Database Странно! В ObjectBrowser-е есть библиотека DAO? Если набираете Dim db As DAO. - после точки вываливается список? Там есть Database?
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39301045
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),

>> А что это вы такое делаете? Да еще в цикле по таблицам и их полям?
В дополнение к тому макросу, что Вы написали, мне необходимо было удалить столбцы с именами "Служебное1", "Служебное2", и т.д.
после импорта
>> Если набираете Dim db As DAO. - после точки вываливается список? Там есть Database?
Список "вываливается" и DataBase там есть.

А подскажите, пожалуйста, как программно заставить все импортированные таблицы "открыться" для пользователя? Пробовал db.TableDefs(i).Open, db.TableDefs(i).Visible
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39301154
barbacucaА подскажите, пожалуйста, как программно заставить все импортированные таблицы "открыться" для пользователя? Пробовал db.TableDefs(i).Open, db.TableDefs(i).Visible Используйте DoCmd.OpenTable
barbacucaмне необходимо было удалить столбцы с именами "Служебное1", "Служебное2", и т.д. после импорта Сколько полей вы удаляете и сколько остается?
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39301159
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
Удаляются от 0 до 10 полей. А всего их от 40 до 70
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39301197
barbacucaУдаляются от 0 до 10 полей. А всего их от 40 до 70 Тогда ваш подход правильный. Если, конечно, вы перебираете поля в порядке убывания индекса (j).
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39301276
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
а подскажите, пожалуйста? есть ли в Access Личная книга макросов, по аналогии с Personal.xls в Excel?
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39301283
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос снят... Нашел...
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39304617
Владимир86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )barbacuca1. В текущем Access файле M.accdb нужно удалить все таблицы.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub DeleteAllTables()
Dim db As Database, i As Integer, sName As String

    Set db = CurrentDb
    For i = db.TableDefs.Count - 1 To 0 Step -1
        sName = db.TableDefs(i).Name
'Debug.Print sName
     If sName Like "MSys*" Then
        'system tables
     Else
        db.TableDefs.Delete sName
     End If
    Next
End Sub


barbacuca2. Из файла M.xlsm нужно загрузить данные. Имена таблиц должны соответствовать именам листов в 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.
Sub ImportFromExcel()
Dim db As Database, i As Integer, sName As String, sFilePath

    sFilePath = CurrentProject.Path & "\" & "M.xlsm"
    'Удаляем таблицы
    Call DeleteAllTables
    
    'Открываем файл Excel как БД
    Set db = OpenDatabase(sFilePath, False, True, "Excel 12.0 Xml;")
    For i = 0 To db.TableDefs.Count - 1
    'Возвращает имена листов (с "$" в конце) и имена интервалов.
        sName = db.TableDefs(i).Name
     If sName Like "*$" Then
        'Обрабатываем только листы
'Debug.Print sName
        sName = Left$(sName, Len(sName) - 1)
        If sName <> "ПереченьМОП" Then
        'Импортируем текущий лист
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, sName, sFilePath, True, sName & "$"
        End If
     End If
    Next
End Sub




У меня возникла проблема при моделировании. строчка
Код: vbnet
1.
 Set db = OpenDatabase(sFilePath, False, True, "Excel 12.0 Xml;") 

выдает ошибку: 3027 База данных или объект доступны только для чтения. Подскажите, как лечить?
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39305639
Владимир86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HELP!
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39305750
Владимир86У меня возникла проблема при моделировании. строчка
Код: vbnet
1.
 Set db = OpenDatabase(sFilePath, False, True, "Excel 12.0 Xml;") 

выдает ошибку: 3027 База данных или объект доступны только для чтения. Подскажите, как лечить? Именно на этой строке? У меня не выдает.
В этот момент файл закрыт? Если файл открывать вручную, ничего не сообщает? Редактировать можно? Это на любом файле, не только из этой группы?
Попробуйте True в 3-м аргументе (Только чтение) заменить на False.
Похоже, что-то с настройками безопасности файла или системы.
Может пришлете файл для опытов? Можно без данных.
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39305798
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
возникла новая проблема... Некоторые поля в Excel имеют длину более 255 символов. Подскажите, пожалуйста как мне создать их в Access? Пробовал в запросе ТЕКСТ(999), МЕМО(999). Понимаю, что в корне не прав, но не знаю в какую сторону копать...
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39305939
При чтении из Excel команда TransferSpreadsheet или запрос используют драйвер, который определяет тип полей на выходе на основании данных в нескольких первых строках на
листе (16 что-ли). Что бы драйвер понял, что поле должно быть МЕМО, а не ТЕКСТ - в этих ячейках должно быть хоть одно значение с длиной более 255 символов.
Если у вас есть доступ к реестру и эта задача выполняется только на одном компе, то можно изменить значение параметра на ветке JET\EXCEL
Иначе самое простое - переставить строку с длинным текстом вверх.
Если это затруднительно - можно добавить строку (1-ю под заголовками) с длинным текстом в нужных ячейках (например 300 символов "я"). После импорта удалить эту запись в таблице.

ЗЫ. "Пробовал в запросе ТЕКСТ(999), МЕМО(999)" - о каком запросе речь?
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39305984
barbacuca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
Спасибо. Помогло...
ps
про ТЕКСТ(999), МЕМО(999) - это бред. Я это понял позже. Нет смысла расширять размер поля, если он пришел уже урезанным.
...
Рейтинг: 0 / 0
Макрос для быстрого импорта из Excel
    #39306102
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ),

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub Кнопка0_Click()
Dim db As Database, i As Integer, sName As String, sFilePath
    sFilePath = CurrentProject.Path & "\" & "M.xls"
    'Открываем файл Excel как БД
    Set db = OpenDatabase(sFilePath, False, True, "Excel 8.0;HDR=NO;IMEX=1")
    For i = 0 To db.TableDefs.Count - 1
    'Возвращает имена листов (с "$" в конце) и имена интервалов.
        sName = db.TableDefs(i).Name
     If sName Like "*$" Then
        'Обрабатываем только листы
        sName = Left$(sName, Len(sName) - 1)
        If sName <> "ПереченьМОП" Then
        'Импортируем текущий лист
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "Таблица_" & sName, sFilePath, True, sName & "$"
        End If
     End If
    Next
End Sub




У меня этот код таблицы создаёт, а данные не перекидывает.
только одну пустую строку в таблице, при повторном запуске кода - ещё строку в таблице создаёт.
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Макрос для быстрого импорта из Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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