|
|
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Помогите с надежным способом работы с Екселем из Аксесс, в ситуации, когда участвует шаблон документа. У меня то работает "влет", то сыпятся сообщения типа "сервер СРС не доступен". В таблице "Files", в поле "Shablon"(поле объекта OLE) храню шаблоны, у каждого есть ID. В Форме, откуда вызывается все это дело, есть скрытый элемент Shabl(свободная рамка объекта). Работа с Екселем начинается так: Код: plaintext 1. 2. 3. 4. 5. 6. Где тут самое "слабое" место не нашел, но может есть у кого отлаженный код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 13:35 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
1) GetObject(, "Excel.Application") даст ошибку, если Erctkm yt pfuhe;ty d gfvznm 2) Set xlsSheet = xlsApp.Worksheets(1) даст ошибку, если в екселе не открыто ни одной книги ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 13:59 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Victoshaесли Erctkm yt pfuhe;ty d gfvznm Перевожу: если Уксель не загружен в память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 14:06 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Так как-же приведенный мною код должен выглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 15:57 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
смотря что хочешь получить - если ошибку - то код верен есть еще createobject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 16:00 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
наверное он у тебя не успевает запуститься а ты его уже ловишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 16:02 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Посмотри http://www.ctrlalt.nm.ru/AccessExcel.htm Пункт 3. Использование шаблонов. С тех пор как я использую этот метод, ни разу ничего не глючело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 16:10 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2 CtrlAlt: так ты хранишь шаблон в виде бинарного файла? Чего-то я так не делал никогда, да и в статье написано, что тогда шаблон напрямую нельзя посмотреть. А какой код при работе с шаблоном-OLE в статье нет...:((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 17:07 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Чтобы посмотреть шаблон, нужно его сохранить куда-нибудь в файл функцией SaveXLS. А потом открыть Excel'ем. Работу с отчетами я сделал в виде формы с двумя кнопками - "загрузить шаблон", "сохранить шаблон". Нажимаем сохранить шаблон, выбираем папку куда сохранять и сохраняем. Работы с шаблоном. 1. Сохраняем его в папку где должен лежать отчет 2. Делаем на него GetObject или CreateObject 3. Изменяем как надо 4. Сохраняем под нужным именем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 17:23 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
О! Надо же - работает(это я про бинарный способ)!!! Исправил ошибку в процедуре вытаскивания шаблона из бд, а именно: Код: plaintext Появляются вопросы: после вытаскивания шаблона он сразу, до обработки, сохраняется в указанной директории, а если он не нужен(допустим данные ошибочные вывелись), его ручками удалять? В случае с OLE - документ, без соответствующей команды, как бы висит в воздухе и можно его просто закрыть, не сохраняя, и не беспокоиться, что плодишь мусор, а здесь как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 17:33 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Я делаю как: 1. Сохраняю шаблон под именем temp 2. Делаю необходимые действия 3. Сохраняю SaveAs в нужное имя 4. Удаляю шаблон Если вдруг данные ошибочны, пункт 3 можно опустить. Хотя такую проверку желательно делать до выгрузки. И вообще не выгружать если что-то не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 17:56 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
И с бинарным файлом непонятки, после вытаскивания шаблона из бд в файл, пишу: Код: plaintext 1. 2. 3. 4. Как мне добраться до момента, когда собственно сама работа с Екселем начнется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 18:57 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
GetObject не очень люблю. Делаю так: SaveXLS "Template1", Path & "temp.xls" Set XlsApp = CreateObject("Excel.Application") XlsApp.Workbooks.Open Path & "temp.xls" XlsApp.Visible=true Set xlsSheet= xlsApp.Worksheets(1) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2004, 19:21 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2 CtrlAlt: Чего-то я запутался... Вот начало моей проц-ры(бинарный файл уже извлечен из бд и находится по адресу "E:\....xls"): Код: plaintext 1. 2. 3. Вопрос1: почему начала у нас разные, а работает и так, и так, и какое начало правильней? Вопрос2: почему у тебя нет самой последней моей строки и вообще зачем она(содрал ее из примера в Help-e)? У меня дальше по коду есть такие строки: Код: plaintext 1. Вопрос3: когда я работал с шаблоном в виде OLE, то все работало, что случилось? Где-то тут, может, Application добавить, только где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 10:23 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
авторВопрос1: почему начала у нас разные, а работает и так, и так, и какое начало правильней? a) Set xlsApp = GetObject("E:\....xls") b) Set XlsApp = CreateObject("Excel.Application") а) подъем КОНКРЕТНОЙ книги - должна существовать в природе б) подъем екселя как прлижения, еще до загрузки в него конкретной книги. автор xlsSheet.Range(.cells(13, 3), .cells(26, 1)).Select xlsApp.Selection.Cut замени на xlsSheet.Range(.cells(13, 3), .cells(26, 1)).Cut ответ на вопрос 3 - VBA код работает в контекстах разных контейнерных приложений, вот и ведет себя неодинаково. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 10:34 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
б) подъем екселя как прлижения, еще до загрузки в него конкретной книги. - так ведь в следующей строке: Код: plaintext Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 10:59 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
tim2 Вопрос 1 По сути это 2 идентичных начала. Аналогия: у тебя есть файл .xls. Ты его можешь открыть двойным кликом на него, тогда Винда запустит приложение, которое с ним проассоциировано (MS Excel) и в нем откроет твой файл (твой метод - GetObject). Либо ты спм можешь открыть Excel и через файл-Open открыть нужный файл (CreateObject). В принципе одно и то же, но во второй случай более гибкий. А вообще как кому нравиться. Вопрос 2 Всякие там Activate, Select, Selection - это от лукавого. Так обычно recorder макросов записывает, а на деле практически всегда можно (и нужно) от них избавляться. В твоем случае я бы делал так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Воспрос 3. Встроенное OLE работает иногда немного на так, как Excel, созданные CreateObject, поэтому я от него и отказался. Если ты используешь познее связывание, то отключи библиотеку MS Excel в референсах. А потом откомпилируй. Access тебе покажет места, где у тебя смешано раннее и позднее связываение и не даст напортачить. Дело в том, что когда ты подключаешь библиотеку, то можешь использовать всякие объекты типа Range, Cells и прочие, но они не будут относиться к твоему Excel созданному CreateObject и Access будет ругаться типа объект не найден, метода нет и пр. Поэтому либо используешь класс Excel Dim XLS as Excel Либо CreateObject и тогда таких конструкций не должно быть xlsSheet.Range(.cells(13, 3), .cells(26, 1)).Select Нужно явно указывать объект (если, конечно ты with какой-нибудь не забыл отобразить) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 11:08 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
авторДело в том, что когда ты подключаешь библиотеку, то можешь использовать всякие объекты типа Range, Cells и прочие, но они не будут относиться к твоему Excel созданному CreateObject и Access будет ругаться типа объект не найден, метода нет и пр. Поэтому либо используешь класс Excel Dim XLS as Excel Либо CreateObject и тогда таких конструкций не должно быть xlsSheet.Range(.cells(13, 3), .cells(26, 1)).Select я бы тут подправил малость терминологию. деталь1 - объекта Excel - нет, есть Excel.Application, Excel.Workbook, Excel.Worksheet и т.д. так вот вызов GetObject("....xls") - возвращает WORKBOOK, а вызов CreateObject(,"Excel.Application") - возвращает Application деталь 2 - Selection, использовать МОЖНО, но применительно к Applicationб или Windows то есть код, про который вопрос, тогда так выглядит xlsSheet.Range(.cells(13, 3), .cells(26, 1)).Select xlsApp.Application.Selection.Cut ВЕДЬ xlApp В ДАННОМ СЛУЧАЕ - ОБЪЕКТ КЛАССА Workbook совет можно и перевернуть - ПОЛЕЗНО смешивать "раннее" и "позднее" связывание. используя строго раннее пишут так dim xlApp as Excel.Application Set xlApp = NEW Excel.Application СМЕШИВАЯ ранее и поздее пишут так dim xlApp As Excel.Application set xlApp = CreateObject(,"Excel.Application") в окончательном виде, совет выглядит так, по крайней мере на этапе отладки ИСПОЛЬЗУЙ связь с библиотекой типов И ВСЕГДА ПЫТАЙСЯ ИСПОЛЬЗОВАТЬ ТИПИЗИРОВАННЫЕ ПЕРЕМЕННЫЕ. ЕСЛИ БЫ ТАК было сделано, то сразу стало бы понятно что Dim tBook As Excel.Application Set tBook = GetObject("c:\TestBook.xls") Дает ОШИБКУ ИСПОЛНЕНИЯ, потому, что объект, который возвращяет GetObject, другого типа, не того, что заявлен в объявлении переменной, а именно типа Workbook типа не со зла я, а исключительно в целях поправить неточности... -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 11:53 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Да причем здесь "не со зла"? Наоборот - спасибо, за понятное объяснение!!! :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 12:04 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
И плавненько так возвращаемся почти к началу ветки - к бинарному файлу: В процедуре сохранение шаблона в бд указывается только файл-источник и имя столбца таблицы. Соответственно при извлечении из бд файл указывается как Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 12:15 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Victosha Насчет Excel.Application согласен. Собственно это и имел в виду, может не совсем точно выразился. Насчет смешивания раннего и позднего связывания категорически не согласен. dim xlApp As Excel.Application set xlApp = CreateObject(,"Excel.Application") Не верный на мой взгляд подход. Например что будет если подцеплена библиотека 8 Excel, а по умолчанию стоит 10 и GetObject его вернет? Зачем вообще использовать в этом случае CreateObject? А про GetObject правильно. Вспомнил почему я его не применял. Он как раз возвращал книгу вместо application, что не очень удобно. А CreateObject может сделать что угодно. tim2 Можно в разных полях. Как предложено у меня (используется всего 2 шаблона). Либо сделать одно поле и несколько строк, но тогда функцию нужно чуть подызменить. Сделать там SELECT WHERE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 12:19 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2 CtrlAlt: 3. Сохраняю SaveAs в нужное имя Но при SaveAs диалоговое окно не возникает, выходит, что файл сохраняется автоматом? А как ты поступаешь, если то, что сохранилось "не такое", удаляешь руками или опять SaveAs под тем же именем, затирая этим "не такой" вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 12:31 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Объясни подробнее, что такое "не такой" вариант? У меня файлы выгружаются автоматом, без окрывания Excel (Visible=false, так быстрее, кстати) и сохраняются в указанную папку. Т.е. в Access нажал на кнопку и все распечаталось. "Не таких" файлов у меня нет. Разве что при формировании отчета реализуется алгоритм расстановки подписей к диаграммам, и когда это не возможно сделать (вероятность 0.2%) файл сохраняется с префиксом no_ . Потом можно вручную подправить ежели что. Это имеется ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 12:49 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
не совсем: гонится, без открытия, в Ексель, ну скажем, - спецификация. Потом в "указанной папке" файл открывается и обнаруживается "ляп", ну скажем, - нет реквизитов, далее - читай с начала... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 12:55 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Ну это уже тонкости вашей конкретной задачи. Собственно от метода выгрузки в Excel это не зависит. Но опять же повторюсь, нет реквизитов не надо и печатать. Проверки на корректность данных нужно делать ДО выгрузки в Excel. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 13:45 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32492819&tid=1674983]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 507ms |

| 0 / 0 |
