Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Импорт данных в Access - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Импорт данных в Access
Neyasyt Дата: Четверг, 11.05.2017, 10:30 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Всем доброго времени суток!
Перерыл кучу информации но так и не нашел ответа и вариантов решения. Помогите советом.
Суть задачи проста, есть таблица в Access и надо макросом и через обзор файлов добавлять туда данные из книг EXCEL.
Варианты с циклами не подойдут, очень много строк (от 200000 до 500000 в каждом)
Варианты с подключением к Экселю через драйвер так и не получилось запустить (не могу правильно написать чтобы работало и не могу найти где ошибка) =(
 
Ответить
СообщениеВсем доброго времени суток!
Перерыл кучу информации но так и не нашел ответа и вариантов решения. Помогите советом.
Суть задачи проста, есть таблица в Access и надо макросом и через обзор файлов добавлять туда данные из книг EXCEL.
Варианты с циклами не подойдут, очень много строк (от 200000 до 500000 в каждом)
Варианты с подключением к Экселю через драйвер так и не получилось запустить (не могу правильно написать чтобы работало и не могу найти где ошибка) =(

Автор - Neyasyt
Дата добавления - 11.05.2017 в 10:30
Gustav Дата: Четверг, 11.05.2017, 12:20 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Из Excel в Access - быстро!
Вот код, исполняемый в Access, которым я сегодня за 2 минуты "всосал" xlsx-файл размером 18 мегайт, содержащий 400 тыс.строк х 11 столбцов:
Sub fastImport()
Access.Application.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Лист1", "C:\...\...\MyFile.xlsx", True
End Sub


Перерыл кучу информации но так и не нашел ответа и вариантов решения.

Я Вас умоляю! :D


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеИз Excel в Access - быстро!
Вот код, исполняемый в Access, которым я сегодня за 2 минуты "всосал" xlsx-файл размером 18 мегайт, содержащий 400 тыс.строк х 11 столбцов:
Sub fastImport()
Access.Application.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Лист1", "C:\...\...\MyFile.xlsx", True
End Sub


Перерыл кучу информации но так и не нашел ответа и вариантов решения.

Я Вас умоляю! :D

Автор - Gustav
Дата добавления - 11.05.2017 в 12:20
Neyasyt Дата: Четверг, 11.05.2017, 13:39 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
А как его дополнить чтобы брались не все столбцы? Или если там несколько листов, как выбрать нужный?
Я смотрел эту тему, но в силу своей неграмотности (я только учусь и некоторые вещи не понимаю, гляжу в книгу, вижу фигу) не обратил внимания на эту маленькую строку....


Сообщение отредактировал Neyasyt - Четверг, 11.05.2017, 13:46
 
Ответить
СообщениеА как его дополнить чтобы брались не все столбцы? Или если там несколько листов, как выбрать нужный?
Я смотрел эту тему, но в силу своей неграмотности (я только учусь и некоторые вещи не понимаю, гляжу в книгу, вижу фигу) не обратил внимания на эту маленькую строку....

Автор - Neyasyt
Дата добавления - 11.05.2017 в 13:39
Gustav Дата: Четверг, 11.05.2017, 17:05 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
А как его дополнить чтобы брались не все столбцы?

Гуглите документацию, там есть параметр Range, в котором можно указать диапазон ячеек листа. В этом случае данные будут качаться не со всего листа, а только из указанного диапазона, например A1:G100. Насколько я знаю, диапазон должен быть непрерывным, т.е. нельзя импортить данные, скажем, только из несмежных колонок A, D, K, пропуская промежуточные.

В качестве альтернативы можно импортировать весь лист в промежуточную таблицу Access, а затем уже в Access вытянуть из этой промежуточной таблицы нужные колонки при помощи запроса и поместить в окончательную таблицу.

Или если там несколько листов, как выбрать нужный?

Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
А как его дополнить чтобы брались не все столбцы?

Гуглите документацию, там есть параметр Range, в котором можно указать диапазон ячеек листа. В этом случае данные будут качаться не со всего листа, а только из указанного диапазона, например A1:G100. Насколько я знаю, диапазон должен быть непрерывным, т.е. нельзя импортить данные, скажем, только из несмежных колонок A, D, K, пропуская промежуточные.

В качестве альтернативы можно импортировать весь лист в промежуточную таблицу Access, а затем уже в Access вытянуть из этой промежуточной таблицы нужные колонки при помощи запроса и поместить в окончательную таблицу.

Или если там несколько листов, как выбрать нужный?

Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.

Автор - Gustav
Дата добавления - 11.05.2017 в 17:05
Neyasyt Дата: Четверг, 11.05.2017, 17:23 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Ну, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.

В промежуточную таблицу я пробовал, но очень уж долго получается... много информации...

Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.


А как задать имя листа? У TransferSpreadsheet нет такого параметра...


Сообщение отредактировал Neyasyt - Четверг, 11.05.2017, 17:27
 
Ответить
СообщениеНу, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.

В промежуточную таблицу я пробовал, но очень уж долго получается... много информации...

Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.


А как задать имя листа? У TransferSpreadsheet нет такого параметра...

Автор - Neyasyt
Дата добавления - 11.05.2017 в 17:23
Gustav Дата: Четверг, 11.05.2017, 18:29 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
А как задать имя листа?

Вот как раз использовать параметр Range - записать в него имя листа и в конце имени поставить знак ! или $. Например, Range := "Лист2!" или Range := "Лист2$". Т.е. без указания конкретного диапазона. А если с диапазоном, то диапазон указывается после знака ! или $ - Range := "Лист первый!A1:G100" или Range := "Лист нужный$A1:G100". Что интересно, при наличии пробелов в имени листа не требуется каких-то специальных символов типа одинарных кавычек.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
А как задать имя листа?

Вот как раз использовать параметр Range - записать в него имя листа и в конце имени поставить знак ! или $. Например, Range := "Лист2!" или Range := "Лист2$". Т.е. без указания конкретного диапазона. А если с диапазоном, то диапазон указывается после знака ! или $ - Range := "Лист первый!A1:G100" или Range := "Лист нужный$A1:G100". Что интересно, при наличии пробелов в имени листа не требуется каких-то специальных символов типа одинарных кавычек.

Автор - Gustav
Дата добавления - 11.05.2017 в 18:29
Gustav Дата: Четверг, 11.05.2017, 18:52 | Сообщение № 7
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Ну, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.

По ходу вспомнил такой полезный момент. Если импорт происходит в уже существующую таблицу Access, то при наличии в таблице Excel строки заголовков (параметр HasFieldNames := True) колонки импортируются в соответствии с заголовками полей.

Например, в таблице Access могут быть поля: Поле1, Поле2, Поле3, Поле4, Поле5. А в таблице Excel могут быть не все поля и в другом порядке: Поле5, Поле3, Поле2. Так вот данные в соответствии с именами будут импортироваться правильно: Поле5 -> Поле5, Поле3 -> Поле3, Поле2 -> Поле2. При этом Поле1 и Поле4 останутся в Access пустыми.

Если в Excel будет присутствовать поле, которого нет в таблице Access, допустим, Поле6, то импорт ругнется ошибкой и прервется. В этом случае самое простое - войти в конструктор таблицы Access и добавить в нее новое поле, после чего повторить импорт. Ну, или действовать как-то иначе, сообразно своим задумкам.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Ну, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.

По ходу вспомнил такой полезный момент. Если импорт происходит в уже существующую таблицу Access, то при наличии в таблице Excel строки заголовков (параметр HasFieldNames := True) колонки импортируются в соответствии с заголовками полей.

Например, в таблице Access могут быть поля: Поле1, Поле2, Поле3, Поле4, Поле5. А в таблице Excel могут быть не все поля и в другом порядке: Поле5, Поле3, Поле2. Так вот данные в соответствии с именами будут импортироваться правильно: Поле5 -> Поле5, Поле3 -> Поле3, Поле2 -> Поле2. При этом Поле1 и Поле4 останутся в Access пустыми.

Если в Excel будет присутствовать поле, которого нет в таблице Access, допустим, Поле6, то импорт ругнется ошибкой и прервется. В этом случае самое простое - войти в конструктор таблицы Access и добавить в нее новое поле, после чего повторить импорт. Ну, или действовать как-то иначе, сообразно своим задумкам.

Автор - Gustav
Дата добавления - 11.05.2017 в 18:52
Neyasyt Дата: Пятница, 12.05.2017, 12:24 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Большое спасибо за помощь! Сделал с Range.

Но есть еще один вопросик =) Есть вот такой макрос для загрузки DBF:

[vba]
Код
Sub sverka_od()
Dim user As String
Dim путь
Dim путьбезимени As String
Dim имя As String
Dim имябазы As String
Dim select1 As String
имябазы = "[dBase III;]"
user = Interaction.Environ("UserName")
Dim fd As FileDialog
Set fd = Access.FileDialog(msoFileDialogFilePicker)
fd.Title = " Загрузка DBF файла"
fd.Filters.Add "dbf файлы", "*.dbf"
fd.ButtonName = "Загрузить!"
fd.AllowMultiSelect = False
fd.InitialFileName = "C:\Users\" & user & "\Desktop\"
If fd.Show = 0 Then End
путь = fd.SelectedItems.Item(1)
имя = Replace(Dir(путь), ".dbf", "")
путьбезимени = fd.InitialFileName
select1 = "select * from " & имя & " IN " & "'" & путьбезимени & "'" & имябазы & ";"
DoCmd.RunSQL " delete * from ПЛЗ"
DoCmd.RunSQL "insert into ПЛЗ " & select1

End Sub
[/vba]

Можно ли его сделать подругому? А Если нельзя, то как избавиться от ошибки: "невозможно найти устанавливаемый isam" ?
На работе половина сайтов заблокированы, только и могу что сюда зайти да на msdn.microsoft.com


Сообщение отредактировал Neyasyt - Пятница, 12.05.2017, 14:30
 
Ответить
СообщениеБольшое спасибо за помощь! Сделал с Range.

Но есть еще один вопросик =) Есть вот такой макрос для загрузки DBF:

[vba]
Код
Sub sverka_od()
Dim user As String
Dim путь
Dim путьбезимени As String
Dim имя As String
Dim имябазы As String
Dim select1 As String
имябазы = "[dBase III;]"
user = Interaction.Environ("UserName")
Dim fd As FileDialog
Set fd = Access.FileDialog(msoFileDialogFilePicker)
fd.Title = " Загрузка DBF файла"
fd.Filters.Add "dbf файлы", "*.dbf"
fd.ButtonName = "Загрузить!"
fd.AllowMultiSelect = False
fd.InitialFileName = "C:\Users\" & user & "\Desktop\"
If fd.Show = 0 Then End
путь = fd.SelectedItems.Item(1)
имя = Replace(Dir(путь), ".dbf", "")
путьбезимени = fd.InitialFileName
select1 = "select * from " & имя & " IN " & "'" & путьбезимени & "'" & имябазы & ";"
DoCmd.RunSQL " delete * from ПЛЗ"
DoCmd.RunSQL "insert into ПЛЗ " & select1

End Sub
[/vba]

Можно ли его сделать подругому? А Если нельзя, то как избавиться от ошибки: "невозможно найти устанавливаемый isam" ?
На работе половина сайтов заблокированы, только и могу что сюда зайти да на msdn.microsoft.com

Автор - Neyasyt
Дата добавления - 12.05.2017 в 12:24
Gustav Дата: Суббота, 13.05.2017, 11:56 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Neyasyt, попробуйте использовать для DBF похожую на выше рассмотренную команду другую команду - DoCmd.TransferDatabase.

http://www.sql.ru/forum/258932/import-eksport-dbf


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеNeyasyt, попробуйте использовать для DBF похожую на выше рассмотренную команду другую команду - DoCmd.TransferDatabase.

http://www.sql.ru/forum/258932/import-eksport-dbf

Автор - Gustav
Дата добавления - 13.05.2017 в 11:56
Neyasyt Дата: Понедельник, 15.05.2017, 10:01 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Спасибо! Но sql.ru заблокирован... значит изучу дома.
 
Ответить
СообщениеСпасибо! Но sql.ru заблокирован... значит изучу дома.

Автор - Neyasyt
Дата добавления - 15.05.2017 в 10:01
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!