powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / insert в лист Excel через ADO
8 сообщений из 8, страница 1 из 1
insert в лист Excel через ADO
    #34178520
lehle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, подскажите в чем дело. Мечтаю вставить результат запроса из одного листа Excel в другой.

Dim cn As ADODB.Connection
Dim strIns As String

MyPath = ActiveWorkbook.Path + "\" + ActiveWorkbook.Name

Set cn = New ADODB.Connection
cn.Mode = adModeReadWrite
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & MyPath & ";" & _
"Extended Properties=Excel 8.0;Jet OLEDB:Engine Type=35;HDR=no;imex=2;Jet OLEDB:Compact Without Replica Repair=False;"

strIns = "insert into [Лист1$A4:AP4] ([f1],[f2],[f3]) select [f1],[f2],[f3] from [Лист2$A4:AP4]"

cn.Execute (strIns)

cn.Close
Set cn = Nothing

Код выполняется с ошибкой, мол, инструкция insert into содержит неизвестное поле f2. Если в селекте указать одно поле (f1), то отрабатывает нормально. Такое ощущение, что команда не выполняется для наборов с количеством полей более одного. В чем тут дело? Буду крайне признателен, если убедительно расскажете, что этого вообще нельзя сделать (если нельзя) и обратите мое внимание на причины.

PS
1. Обойти эту проблему могу, но будет не здорово. Хочу переносить данные именно посредством insert.
2. Работаю через ADO 2.6
3. С imex и др. параметрами строки подключения наигрался вволю - не помогает.
4. Данные на листе2 есть. Данных на листе1 нет.
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34178592
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
strIns = "insert into [Лист1$A4:AP4] select [f1],[f2],[f3] from [Лист2$A4:AP4]"

А вообще-то, таскать данные из одного листа в другой средствами ADO это извращение не поддающеся описанию.
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34178635
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senin Viktor1. Екцель не правильно определяет типы полей, и как следствие, NULL'ы там, где не совпадает формат. Выхода из этого нет , если в первых строках будут пустые значения. Так же нельзя и насильно указать тип поля. Мой способ - ниже данных я вводил псевдо данные, нужных форматов, в кол-ве 25 или 16 строк (вроде). Запрос выбирал стркои не с 1 по N, а с N по 1. Из рекодсета выбрасывал псевдоданные. Если есть возможность - то можно сделать и сверху данных (например скрытые строки). Как плюс можно сделать нужное название полей.

2. Обращаться через ADO в открытый файла екцеля нельзя - происходит утечка памяти. Эта ошибка описана в MSDN "BUG: Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects (ADO)" #319998
Код: plaintext
When you retrieve a Microsoft ActiveX Data Objects (ADO) Recordset from an Excel worksheet that is open in Excel, a memory leak occurs in the Excel process. Repeated queries may eventually cause Excel to run out of memory and raise an error, or cause Excel to stop responding. 
Выход: юзать просто файл (не открытый). Т.е. например, скопировать данные в темп-файл, закрыть его и уже юзать ADO
Recordset
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34179030
lehle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Дорогой друг, данный код всего лишь простая модель. Представь себе, что существует множество листов, условно связанных неким id. Количество условий отбора, в зависимости от которых данные должны заноситься в лист, большое. Сводные таблицы для данной задачи не годятся. Количество вложенных циклов для моей задачи получается уже под десяток. Условия отбора могут изменяться, добавляться и удаляться. Кроме того, вся эта бадяга работает крайне медленно (данных десятки тысяч строк). Как прикажешь с этим быть? Выражение select же позволяет ускорить и на несколько порядков упростить отладку. А вообще "награждать" ёксель той функциональностью, с которой мне приходиться работать, это, действительно, извращение. В общем, не от от хорошей жизни...

vkodor
1. С форматами полей, действительно, я намучился здорово в свое время и знаю об этом. Однако в данном случае не думаю, что проблема в форматах. Идея с псевдокодом, зачастую спасает, обычно я так и делаю. Но в этот раз не получается. Кстати, этим заведует imex.
2. Про то, что нельзя работать с открытой книгой - у меня метры кода, когда я работаю именно так. Причем insrt value тех же значений проходит на ура, не говоря уже о селектах. Но вот в данном случае не смог побороть. Я, признаться, нечто подобное предполагал. Приведенная ссылка, возможно, поможет получить ясный, отрицательный ответ, что не мало. Спасибо

Идея с временным файлом заманчива...
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34179088
MX -- ALEX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lehleWhite Owl
Дорогой друг, данный код всего лишь простая модель. Представь себе, что существует множество листов, условно связанных неким id. Количество условий отбора, в зависимости от которых данные должны заноситься в лист, большое. Сводные таблицы для данной задачи не годятся. Количество вложенных циклов для моей задачи получается уже под десяток. Условия отбора могут изменяться, добавляться и удаляться. Кроме того, вся эта бадяга работает крайне медленно (данных десятки тысяч строк). Как прикажешь с этим быть? Выражение select же позволяет ускорить и на несколько порядков упростить отладку. А вообще "награждать" ёксель той функциональностью, с которой мне приходиться работать, это, действительно, извращение. В общем, не от от хорошей жизни...

vkodor
1. С форматами полей, действительно, я намучился здорово в свое время и знаю об этом. Однако в данном случае не думаю, что проблема в форматах. Идея с псевдокодом, зачастую спасает, обычно я так и делаю. Но в этот раз не получается. Кстати, этим заведует imex.
2. Про то, что нельзя работать с открытой книгой - у меня метры кода, когда я работаю именно так. Причем insrt value тех же значений проходит на ура, не говоря уже о селектах. Но вот в данном случае не смог побороть. Я, признаться, нечто подобное предполагал. Приведенная ссылка, возможно, поможет получить ясный, отрицательный ответ, что не мало. Спасибо

Идея с временным файлом заманчива...

пришлите мне Ваши файлы - я попробую с ними расправится
в нашем виртуальном совмещенном с базой данных EXCELe
и получить требуемые аналитические кубы
затем верну все вместе Вам для регулярной работы
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34179434
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ап если отказатся от INSERT , т.е. делять выборку (если условия меняются и много), а втавлять через
Код: plaintext
ws.Range("A2").CopyFromRecordset rs


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34179463
lehle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot
Вчера, когда я уже напал на след источника всех бед, подумал и сделал именно так, как вы советуете. Должен сказать - это пока наилучший способ решения моих проблем. Работает быстро и пока без глюков. Надеюсь, так будет и дальше. Спасибо за ответ, HandKot. Если кто-то мучается, как я, с большим числом вложенных циклов, здесь, собственно, уже готовое решение.

MX -- ALEX
На деревню дедушке. Константину Макаровичу.
В целом, высылка с объяснением всего, что мне нужно - это идея фикс, хотя именно решение подобных задач при помощи кубов БД, на мой взгляд наиболее перспективно.
...
Рейтинг: 0 / 0
insert в лист Excel через ADO
    #34181428
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lehleWhite Owl
Дорогой друг, данный код всего лишь простая модель. Представь себе, что существует множество листов, условно связанных неким id. ..... Как прикажешь с этим быть?Прикажу ставить базу данных, что же еще?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / insert в лист Excel через ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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