Всем доброго времени суток! Перерыл кучу информации но так и не нашел ответа и вариантов решения. Помогите советом. Суть задачи проста, есть таблица в Access и надо макросом и через обзор файлов добавлять туда данные из книг EXCEL. Варианты с циклами не подойдут, очень много строк (от 200000 до 500000 в каждом) Варианты с подключением к Экселю через драйвер так и не получилось запустить (не могу правильно написать чтобы работало и не могу найти где ошибка) =(
Всем доброго времени суток! Перерыл кучу информации но так и не нашел ответа и вариантов решения. Помогите советом. Суть задачи проста, есть таблица в Access и надо макросом и через обзор файлов добавлять туда данные из книг EXCEL. Варианты с циклами не подойдут, очень много строк (от 200000 до 500000 в каждом) Варианты с подключением к Экселю через драйвер так и не получилось запустить (не могу правильно написать чтобы работало и не могу найти где ошибка) =(Neyasyt
Вот код, исполняемый в Access, которым я сегодня за 2 минуты "всосал" xlsx-файл размером 18 мегайт, содержащий 400 тыс.строк х 11 столбцов: Sub fastImport() Access.Application.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Лист1", "C:\...\...\MyFile.xlsx", True End Sub
Вот код, исполняемый в Access, которым я сегодня за 2 минуты "всосал" xlsx-файл размером 18 мегайт, содержащий 400 тыс.строк х 11 столбцов: Sub fastImport() Access.Application.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Лист1", "C:\...\...\MyFile.xlsx", True End Sub
А как его дополнить чтобы брались не все столбцы? Или если там несколько листов, как выбрать нужный? Я смотрел эту тему, но в силу своей неграмотности (я только учусь и некоторые вещи не понимаю, гляжу в книгу, вижу фигу) не обратил внимания на эту маленькую строку....
А как его дополнить чтобы брались не все столбцы? Или если там несколько листов, как выбрать нужный? Я смотрел эту тему, но в силу своей неграмотности (я только учусь и некоторые вещи не понимаю, гляжу в книгу, вижу фигу) не обратил внимания на эту маленькую строку....Neyasyt
Сообщение отредактировал Neyasyt - Четверг, 11.05.2017, 13:46
Гуглите документацию, там есть параметр Range, в котором можно указать диапазон ячеек листа. В этом случае данные будут качаться не со всего листа, а только из указанного диапазона, например A1:G100. Насколько я знаю, диапазон должен быть непрерывным, т.е. нельзя импортить данные, скажем, только из несмежных колонок A, D, K, пропуская промежуточные.
В качестве альтернативы можно импортировать весь лист в промежуточную таблицу Access, а затем уже в Access вытянуть из этой промежуточной таблицы нужные колонки при помощи запроса и поместить в окончательную таблицу.
Или если там несколько листов, как выбрать нужный?
Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.
Гуглите документацию, там есть параметр Range, в котором можно указать диапазон ячеек листа. В этом случае данные будут качаться не со всего листа, а только из указанного диапазона, например A1:G100. Насколько я знаю, диапазон должен быть непрерывным, т.е. нельзя импортить данные, скажем, только из несмежных колонок A, D, K, пропуская промежуточные.
В качестве альтернативы можно импортировать весь лист в промежуточную таблицу Access, а затем уже в Access вытянуть из этой промежуточной таблицы нужные колонки при помощи запроса и поместить в окончательную таблицу.
Или если там несколько листов, как выбрать нужный?
Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.Gustav
Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.
А как задать имя листа? У TransferSpreadsheet нет такого параметра...
Ну, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.
В промежуточную таблицу я пробовал, но очень уж долго получается... много информации...
Надо знать имя нужного листа, ну, или его позицию среди других, например, первый. Далее по позиции узнать имя и вставить его в эту команду. Для этого надо будет написать несколько строк кода (в Access - для объектов Excel). Можно перебрать в цикле все листы (если нужно) и для каждого выполнить DoCmd.TransferSpreadsheet.
А как задать имя листа? У TransferSpreadsheet нет такого параметра...Neyasyt
Сообщение отредактировал Neyasyt - Четверг, 11.05.2017, 17:27
Вот как раз использовать параметр Range - записать в него имя листа и в конце имени поставить знак ! или $. Например, Range := "Лист2!" или Range := "Лист2$". Т.е. без указания конкретного диапазона. А если с диапазоном, то диапазон указывается после знака ! или $ - Range := "Лист первый!A1:G100" или Range := "Лист нужный$A1:G100". Что интересно, при наличии пробелов в имени листа не требуется каких-то специальных символов типа одинарных кавычек.
Вот как раз использовать параметр Range - записать в него имя листа и в конце имени поставить знак ! или $. Например, Range := "Лист2!" или Range := "Лист2$". Т.е. без указания конкретного диапазона. А если с диапазоном, то диапазон указывается после знака ! или $ - Range := "Лист первый!A1:G100" или Range := "Лист нужный$A1:G100". Что интересно, при наличии пробелов в имени листа не требуется каких-то специальных символов типа одинарных кавычек.Gustav
Ну, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.
По ходу вспомнил такой полезный момент. Если импорт происходит в уже существующую таблицу 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 и добавить в нее новое поле, после чего повторить импорт. Ну, или действовать как-то иначе, сообразно своим задумкам.
Ну, то что можно использовать диапазон я нашел, только вот нужно разные столбцы тянуть.
По ходу вспомнил такой полезный момент. Если импорт происходит в уже существующую таблицу 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
Но есть еще один вопросик =) Есть вот такой макрос для загрузки 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
Большое спасибо за помощь! Сделал с 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.comNeyasyt
Сообщение отредактировал Neyasyt - Пятница, 12.05.2017, 14:30