|
|
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
Господа, подскажите в чем дело. Мечтаю вставить результат запроса из одного листа 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 нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2006, 18:00:46 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
Код: plaintext А вообще-то, таскать данные из одного листа в другой средствами ADO это извращение не поддающеся описанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2006, 18:20:22 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
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 Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2006, 18:34:28 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
White Owl Дорогой друг, данный код всего лишь простая модель. Представь себе, что существует множество листов, условно связанных неким id. Количество условий отбора, в зависимости от которых данные должны заноситься в лист, большое. Сводные таблицы для данной задачи не годятся. Количество вложенных циклов для моей задачи получается уже под десяток. Условия отбора могут изменяться, добавляться и удаляться. Кроме того, вся эта бадяга работает крайне медленно (данных десятки тысяч строк). Как прикажешь с этим быть? Выражение select же позволяет ускорить и на несколько порядков упростить отладку. А вообще "награждать" ёксель той функциональностью, с которой мне приходиться работать, это, действительно, извращение. В общем, не от от хорошей жизни... vkodor 1. С форматами полей, действительно, я намучился здорово в свое время и знаю об этом. Однако в данном случае не думаю, что проблема в форматах. Идея с псевдокодом, зачастую спасает, обычно я так и делаю. Но в этот раз не получается. Кстати, этим заведует imex. 2. Про то, что нельзя работать с открытой книгой - у меня метры кода, когда я работаю именно так. Причем insrt value тех же значений проходит на ура, не говоря уже о селектах. Но вот в данном случае не смог побороть. Я, признаться, нечто подобное предполагал. Приведенная ссылка, возможно, поможет получить ясный, отрицательный ответ, что не мало. Спасибо Идея с временным файлом заманчива... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2006, 00:18:41 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
lehleWhite Owl Дорогой друг, данный код всего лишь простая модель. Представь себе, что существует множество листов, условно связанных неким id. Количество условий отбора, в зависимости от которых данные должны заноситься в лист, большое. Сводные таблицы для данной задачи не годятся. Количество вложенных циклов для моей задачи получается уже под десяток. Условия отбора могут изменяться, добавляться и удаляться. Кроме того, вся эта бадяга работает крайне медленно (данных десятки тысяч строк). Как прикажешь с этим быть? Выражение select же позволяет ускорить и на несколько порядков упростить отладку. А вообще "награждать" ёксель той функциональностью, с которой мне приходиться работать, это, действительно, извращение. В общем, не от от хорошей жизни... vkodor 1. С форматами полей, действительно, я намучился здорово в свое время и знаю об этом. Однако в данном случае не думаю, что проблема в форматах. Идея с псевдокодом, зачастую спасает, обычно я так и делаю. Но в этот раз не получается. Кстати, этим заведует imex. 2. Про то, что нельзя работать с открытой книгой - у меня метры кода, когда я работаю именно так. Причем insrt value тех же значений проходит на ура, не говоря уже о селектах. Но вот в данном случае не смог побороть. Я, признаться, нечто подобное предполагал. Приведенная ссылка, возможно, поможет получить ясный, отрицательный ответ, что не мало. Спасибо Идея с временным файлом заманчива... пришлите мне Ваши файлы - я попробую с ними расправится в нашем виртуальном совмещенном с базой данных EXCELe и получить требуемые аналитические кубы затем верну все вместе Вам для регулярной работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2006, 02:14:35 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
ап если отказатся от INSERT , т.е. делять выборку (если условия меняются и много), а втавлять через Код: plaintext I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2006, 09:50:58 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
HandKot Вчера, когда я уже напал на след источника всех бед, подумал и сделал именно так, как вы советуете. Должен сказать - это пока наилучший способ решения моих проблем. Работает быстро и пока без глюков. Надеюсь, так будет и дальше. Спасибо за ответ, HandKot. Если кто-то мучается, как я, с большим числом вложенных циклов, здесь, собственно, уже готовое решение. MX -- ALEX На деревню дедушке. Константину Макаровичу. В целом, высылка с объяснением всего, что мне нужно - это идея фикс, хотя именно решение подобных задач при помощи кубов БД, на мой взгляд наиболее перспективно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2006, 10:02:22 |
|
||
|
insert в лист Excel через ADO
|
|||
|---|---|---|---|
|
#18+
lehleWhite Owl Дорогой друг, данный код всего лишь простая модель. Представь себе, что существует множество листов, условно связанных неким id. ..... Как прикажешь с этим быть?Прикажу ставить базу данных, что же еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2006, 18:35:16 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=303&tid=2183802]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 362ms |

| 0 / 0 |
