02.10.2006, 22:21 | #1 |
Участник
|
QueryTable
Добрый вечер, столкнулся с необходимостью импорта данных с веб'а.
Нашел тему на этом форуме о том как пользовать QueryTable через COM в экселе. Импорт из html-файлов без использования внешнего парсера возможен? Но никак не могу найти как проинициализировать QueryTable на исполнение с выбором источника данных из веб. Как это происходит в экселе при: Данные -> Импорт внешних данных -> создать веб-запрос Т.е. источник у меня не постоянный и необходимо пользователю дать его выбирать и потом обработывать данные. |
|
03.10.2006, 09:19 | #2 |
Moderator
|
Цитата:
Сообщение от zipo
Добрый вечер, столкнулся с необходимостью импорта данных с веб'а.
Нашел тему на этом форуме о том как пользовать QueryTable через COM в экселе. Импорт из html-файлов без использования внешнего парсера возможен? Цитата:
Сообщение от zipo
Но никак не могу найти как проинициализировать QueryTable на исполнение с выбором источника данных из веб. Как это происходит в экселе при:
Данные -> Импорт внешних данных -> создать веб-запрос Т.е. источник у меня не постоянный и необходимо пользователю дать его выбирать и потом обработывать данные. В противном случае, не совсем понятно, получение какого рода информации предполагается и зачем это наворачивать в Axapta. И почему бы в этом случае не ограничиться использованием веб-браузера и простым ручным копированием нужной информации, например, в соответствующие поля форм Axapta. В случае разумно ограниченного набора в общем случае Вам придется создать "шаблончики" QueryTable для каждой из страниц этого набора. Увы, это штучный товар, впрочем, так же как и сами веб-страницы. (Частные случаи различных сайтов на движках от одного производителя пока не рассматриваем ) Последний раз редактировалось Gustav; 03.10.2006 в 09:30. |
|
03.10.2006, 10:14 | #3 |
Участник
|
Задача построить линейные временные графики.
Например просто в аксапте вывести график зависимисти курса от времени, на фоне. Т.е. пользователь выбирает сайт, выбирает нужную таблицу информации. Выбирает из этой информации данные на оси которые он бы хотел видеть в зависимости от времени. Выбирает период обновления информации. И потом может наблюдать как изменялся к примеру курс валют за определенный период времени. Источник данных не ограничен, поэтому шаблончиками не обойтись. Нужно предоставить возможность выбрать абсолютно любые данные для отображения. Поэтому мне и нужно как-то запустить стандартное окно new web-query. Как его запустить мне пока найти не удается. Везде используют или шаблончики на основе *.iqy файлов или прямой урл с параметрами. |
|
03.10.2006, 10:37 | #4 |
Moderator
|
Цитата:
Application.Dialogs( xlDialogNewWebQuery ).Show Оно? |
|
03.10.2006, 11:46 | #5 |
Участник
|
Да, оно.
Только при использовании в аксапте, выбивает стек трейс. Говоря, что у метода Dialogs неправильное кол-во параметров. Его можно исопльзовать только без параметров и у объекта Dialogs нету метода Show. #define.xlDialogNewWebQuery(667) xlApp = new COM('Excel.Application'); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); Dlg = xlApp.Dialogs(#xlDialogNewWebQuery); Dlg.Show(); |
|
03.10.2006, 12:02 | #6 |
Moderator
|
Код: static void Job52(Args _args) { COM xlApp, wbks, wbk, wkss; COM Dlgs, Dlg; #define.xlDialogNewWebQuery(667) xlApp = new COM('Excel.Application'); xlApp.Visible(true); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); Dlgs = xlApp.Dialogs(); Dlg = Dlgs.Item( #xlDialogNewWebQuery ); Dlg.Show(); } |
|
|
За это сообщение автора поблагодарили: zipo (1). |
03.10.2006, 12:41 | #7 |
Moderator
|
Честно говоря, очень интересно, что Вы собираетесь делать дальше после того как способ активации нужного диалога найден. Всё, что может вернуть диалог - это true или false в зависимости от того, какую кнопку в конце концов нажал пользователь. На каком worksheet будем ловить новый объект QueryTable? Пользователь же может выбрать любой имеющийся лист или создать новый... Ну да, в принципе нетрудно перебрать коллекцию Worksheets... А на одну новую рабочую книгу планируете один веб-запрос? У Вас есть план дальнейших действий после диалога?
|
|
03.10.2006, 12:58 | #8 |
Участник
|
Спасиб!
Каким-то чудом нужно отменить второй диалог, который позволяет выбрать месторасположение данных на страницах экселя. Перебрать конечно можно, но выскакивающий эксель будет не сильно красиво смотреться. А где Вы черпаете информацию по методам и свойствам VB? |
|
03.10.2006, 13:30 | #9 |
Участник
|
Если сначало создать QueryTable, а потом на нем вызвать диалог Edit Query, что эксель позволяет, то выйдет так как нужно. Вопрос только в том как вызвать Edit Query на уже созданном QueryTable ?
|
|
03.10.2006, 13:34 | #10 |
Moderator
|
Ну, в первую очередь, в файлах справки. Поищите у себя на компьютере файлы по маске VBAXL*.CHM (найденная "звездочка" может быть 9, 10, 11 в зависимости от версии Excel)
Еще из книжек. Из относительно свежеизданных рекомендую Профессиональное программирование на VBA в Excel 2003 и Excel 2003 и VBA. Справочник программиста |
|
03.10.2006, 13:46 | #11 |
Moderator
|
Цитата:
? Application.CommandBars("External Data").Controls(1).Caption &Edit Query... Конкретно - нужно, стоя на области данных запроса, вызвать метод Application.CommandBars("External Data").Controls(1).Execute Только, чего-то пока он у меня не очень хочет запускаться... Хотя для других команд меню аналогичный подход, помнится, работал... Ну в общем, "порыхлите почву" в этом направлении. Заставьте его сначала в самом Excel подняться. |
|
03.10.2006, 15:18 | #12 |
Участник
|
Или он не видит активную ячейку или не активен сам CommandBar.
Но мне кажется что, просто CommandBar рассматривается в этом случае без привязки к ячейке Пробовал так Range("A1").Application.CommandBars(10).Controls(1).SetFocus Но видно, что нужная кнопка не активна, поэтому и ошибка выходит на Execute Как только CommandBar External Data получает фокус, кнопка активируется. |
|
04.10.2006, 11:22 | #13 |
Moderator
|
Ну в общем народ в мире тоже мучается аналогичными проблемами: http://www.pcreview.co.uk/forums/thread-2274645.php
В качестве временного отладочного решения можно попробовать открывать это окошко через последовательность нажатий клавиш (а там, глядишь, может и сам бизнес-процесс поменяете ) При это Excel должен быть обязательно виден и иметь фокус, иначе кнопки сработают, например, в редакторе X++, откуда запускается джоб. В самом Excel должна быть активна ячейка, входящая в диапазон веб-запроса. В рамках джоба - эта ячейка А1 на первом листе файла TestWebQuery.xls, в котором уже должен присутствовать ранее сохраненный веб-запрос. Код: static void Job53(Args _args) { COM xlApp, wbks, wbk, wkss, wks; COM rng; xlApp = new COM('Excel.Application'); xlApp.Visible(true); wbks = xlApp.Workbooks(); wbk = wbks.Open(@'C:\TestWebQuery.xls'); wkss = wbk.Worksheets(); wks = wkss.Item(1); wks.Select(); rng = wks.Range('A1'); rng.Select(); xlApp.SendKeys('+{F10}{UP}{UP}{UP}{UP}~'); } - Shift+F10 - вызов контекстного меню (как правый клик мышкой) - 4 раза "стрелка вверх" - позиционирование в меню на пункте "Edit Query" - Enter - активизация пункта "Edit Query" и отображение нашего желанного диалога |
|
11.10.2006, 11:14 | #14 |
Участник
|
Этот вариант через COM работает, только всеравно эксель на время проскакиевает:
Application.CommandBars(10).Controls(1).Execute PHP код:
|
|
|
За это сообщение автора поблагодарили: Gustav (7). |
11.10.2006, 13:42 | #15 |
Moderator
|
Супер! Дожили! В Аксапте работает лучше, чем в самом Excel
Сейчас тоже немножко поковырялся. Выяснил, что оператор Application.CommandBars(10).Controls(1).Execute выдает ошибку, а пара операторов (VBA) Set xlApp = New Excel.Application xlApp.CommandBars(10).Controls(1).Execute работает! (я вызывал Excel из Access и даже "Excel из другого Excel") Т.е. получается, что этот Execute программно срабатывает так, как мы этого хотим, только в новом инстансе Excel (что и происходит при вызове из Аксапты). А вообще здорово. Спасибо, что не сдаетесь и продолжаете долбить эту тему, выясняя по ходу интересные подробности. да и фиг-то с ним или так критично, что мелькает? Кстати, покажите, пожалуйста, потом Ваши дальнейшие шаги в этой задаче. Интересно-интересно. Благодарю заранее. P.S. Цитата:
Сообщение от Gustav
Ну в общем народ в мире тоже мучается аналогичными проблемами: http://www.pcreview.co.uk/forums/thread-2274645.php
http://www.pcreview.co.uk/forums/sho...54&postcount=6 Последний раз редактировалось Gustav; 11.10.2006 в 18:47. |
|