|
|
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
все весьма интересно. (я тут как то наткнулся на проблемы с открытием OLE объекта на Выборочных машинах, т.ч. возможно на будущее и воспользуюсь предложенной методой) что хочется: в некоторых случаях не хочется завязываться ("надолго") на определенный сохранненный временный файл. (С тем, чтобы можно было работать из нескольких сеансов одной машины). И вообще, иногда нужно дать пользователю несохраненный документ XLS по завершении создания. (чтобы он сам посмотрел, что ему надо, а что нет, и сохранил, как ему потребуется). накидал (не шибко разбираясь в библиотеке ёкселя) примерно следущий вариант выгрузки (как писать прямо в окно, я не сообразил, т.ч. передаемся через короткоживущую времянку. скорее направление мысли, чем законченная реализация): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 14:00 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
авторНасчет смешивания раннего и позднего связывания категорически не согласен. dim xlApp As Excel.Application set xlApp = CreateObject(,"Excel.Application") Не верный на мой взгляд подход. Например что будет если подцеплена библиотека 8 Excel, а по умолчанию стоит 10 и GetObject его вернет? Зачем вообще использовать в этом случае CreateObject? 0. Необходимо понимать, что и GetObject и CreateObject - функции ПОЗДНЕГО связывания. 1. Позднее связывание, в первую очередь, для "скринтования", например, если отлаженный код надо в VBS перевести. 2. Главное преимущество ЧИСТОГО ПОЗДЕНГО связывания - локализация проблем. Рассмотрим варианты, возникающие при раннем связывании а) Использована связь с библиотекой типов (dim xl as Excel.Application), на целевой машине НИКАКОГО Экселя нет - результат - ВЕСЬ ПРОЕКТ окажется нерабочим, а сумеешь ли ты об этом дагадаться (что вот именно Excel-я не хватает) и как быстро - еще вопрос. При чистом позднем связывании отвалится только та часть кода, которая с экселем пытается работать, А ВСЕ ОСТАЛЬНОЕ БУДЕТ РАБОТАТЬ. Проблему можно решать методом отделения мух от котлет. б) Ексель есть, но другой версии. Ссылка на эксель, в норме, должна переустановиться, и как правило, это нормально происходит ( ЗА НЕКОТОРЫМИ СПЕЦИФИЧЕСКИМИ ИСКЛЮЧЕНИЯМИ, одно из них - политика безопасности конкретного пользователя ). Однако New Excel.Application при этом МОЖЕТ не сработать - NEW вообще не шибко стабильно ведет себя, применительно к межпроцессному подъему объектов. CreateObject же честно вернет экземпляр. в) Установлено "сразу много красивых и разных Екселей". тут сначала см выше, а потом читаем ниже "Excel.Application" - независимый от версии указатель. Подниматься при этом будет тот, который в соответствующем месте реестра прописан, как поднимаемый по умолчанию. При этом подъем сопровождается цепочкой поиска уточнения реализации. Если в твоем коде задействованы возможности специфической версии ИЛИ недоволен временем старта екселя, то уточняешь описатель до "Excel.Application.8" (9/10) (может совру, но кажется, при наличии старшей версии, младший вызов должен работать) Уточненнный вызов и подъем объекта ПРОИСХОДИТ В РАЗЫ БЫСТРЕЕ, за счет резкого уменьшения объема сканирования реестра. Так вот, если изначально ссылка была на старшую версию, на целевой машине - младшая, пороект "компилирован", то NEW провалится почти наверняка. тут перекомпилировать придется. (то есть с mde будут траблы не то, чтобы на 100%, но я бы советовал не удивляться, если будут) Get\CreateObject - работает. Итак, если задействована раннее связывание переменных, то CreateObject используется для СТАБИЛИЗАЦИИ межпроцессной инициализации объектов авоматизации, а задействованная библиотека типов позволяет УСКОРИТЬ Обращение к методам ПОДНЯТОГО объекта. В этом смысл смешивания. При чистом поздем связывании код а) пригоден к непосредственному переносу в VBS\HTML б) не нарушается работоспособность проекта в целом Естественно, за все надо платить - при поздем связывании расплата - скорость вызова объектных методов (и свойств) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 14:05 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
вот подумалось - есть еще одна, на мой взгляд, веская причина, чтобы по крайней мере на этапе отладки поставить ссылку на ексель и писать именно так dim xlApp As Excel.Application При этом начинает работать IntelliSence и количество вопросов "про ексель" СУЩЕСТВЕННО снижается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 14:50 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2фыыф: а зачем создавать новый и задвигать туда...? Убрал строки после Loop и до конца процедуры, оставил только Set OpenXLS = WB. Результат абсолютно такой-же. Кстати, я так понимаю, что обработка листа должна быть после этого самого "Set OpenXLS = WB"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 14:52 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Victosha Тут уже было обсуждение про позднее-раннее связывание. И пришли к выводу, что преимущества по скорости раннего связывания сводятся на нет различными накладными расходами. Поэтому в реальности особого выигрыша нет. Мало того я провел следующий тест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Который показал что при чистом позднем связывании скорость 18 сек, при смешанном - 33. Результат меня и самого удивил, если честно. Так что мой выбор - чисто позднее связывание, без всяких отваливающихся ссылок. А методы и свойства я и так помню. Еще по поводу скорости формирования Excel. В предложенной мной статье в начале идет описание способа, который позволяет ускорить вывод в десятки раз и вообще не заморачиваться по поводу связывания, IntelliSence и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 15:23 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2 tim2 автора зачем создавать новый и задвигать туда...? чистоплюство (убираю листик "tmp", которого нет в шаблоне)... авторобработка листа должна быть после этого самого "Set OpenXLS = WB"? ага. обработка (вставка данных и т.п.) примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 15:51 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Еще больше "порезал" процедуру, осталось только: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 16:16 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
автор А про GetObject правильно. Вспомнил почему я его не применял. Он как раз возвращал книгу вместо application, что не очень удобно. А CreateObject может сделать что угодно. Лично я после статьи из Гетца как раз наоборот, стал везде использовать GetObject, потому как именно GetObject может выступать в любой роли, в отличи от CreateObject: GetObject( , "Excel.Application") - если Excel УЖЕ запущен, то подсоединится к нему, если же нет, то вернет ошибку исполнения GetObject( "", "Excel.Application") - ведет себя абсолютно также как и CreateObject , создает новый экземпляр Excel GetObject( "C:\Book.xls") - Если Excel не загружен в памяти: загружает приложение и в него загружает файл. Если Excel загружен то использует этот экземпляр и в него загружает файл. И наконец если и Excel загружен и файл тоже уже загружен, тогда возращает просто указатель - очень, очень удобный вариантик иногда, чтобы самому не писать лишних проверок и т.д. и .т.п. GetObject("C:\Book.xls" , "Excel.Application") - Ведет себя как верхний вариант, токо можно принудительно укать приложение в котором надо открыть этот файл. Например у Вас два Excel и вы хотите открыть этот файл в старой версии Excel, тогда пишем - GetObject("C:\Book.xls" , "Excel.Application.8") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 16:27 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Может у меня руки кривые, но вариант GetObject("C:\Book.xls" , "Excel.Application") Не работает и никогда у меня и не работал. Говорит File Name or Class name not found during Automation operation. Работает только в таком варианте: GetObject("C:\Book.xls" , "Excel.Sheet"). Может ему помочь как-то надо? К тому же если печать отчетов фоновая, часто нужно чтобы открытые Excel не тревожились. А то если user что-то ваял сам по себе в Excel, а потом запустил печать отчетов, ему придется глядеть на мелтешение и ждать пока процесс завершится, т.к. отчеты печатаются в его экземпляре Excel. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 16:50 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Рабочий день кончается, а я так и не узнал, почему порезанная мной процедура продолжает работать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 17:57 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
1 авторРабочий день кончается, а я так и не узнал, почему порезанная мной процедура продолжает работать.... а какая она была "непорезанная" ? 2 насчет порезать вот это, например, авторxlsApp.SheetsInNewWorkbook = 1 Вам к чему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 18:35 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
А непорезанная она была в сообщении от "фыыф"(либо в начале этой страницы, либо в конце первой). --------------------------------------- а что делает "xlsApp.SheetsInNewWorkbook = 1"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 18:53 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
ппплин. я же написал, что решал следущее авториногда нужно дать пользователю несохраненный документ XLS ну и еще соображения там какие-то были, которые меня в данном случае интересовали я фуею, че ж ты смотрел еще? ежели тебе пох., "прямо в файле" ковырякаться, или в "несохраненном" новом документе. Если файл годиться - нечего изворачиваться. Открывай его, присваивай переменной и работай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 18:56 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
автора что делает "xlsApp.SheetsInNewWorkbook = 1"? О как! а встать на этой строчке xlsApp.SheetsIn|NewWorkbook там где палочка стоит и F1 нажать не пробовали? Делает она вот, что - приказывает Екселю новую книгу создавать,( когда кто-то в следующий раз на кнопку "создать" нажмет), в объеме одной страницы. (стандартно их там (в новой книге) три) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 18:57 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
а встать на этой строчке о как: ну встал я, ну нажал F1....... находясь в Аксессе , и что я получил вместо справки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 19:04 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
автор и что я получил вместо справки? Эхь..., Вам же СОВЕТ давали - на этапе отладки ссылку на ексель поставить, тохды не только IntelliSense, тохды ечЁ и Шправки ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2004, 19:13 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
фыыф иногда нужно дать пользователю несохраненный документ XLS Можно проще сделать. Вместо Set WBt = xlsApp.Workbooks.Open(FileName) Сделать Set WBt = xlsApp.Workbooks.Add(FileName). Здесь FileName выступает в качестве шаблона, на основе которого будет создан несохраненный пока документ. И после этого удалить сразу файл с шаблоном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2004, 11:59 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Вот при таком коде не отрывается, в итоге ссылка на Ексель: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. И как удалить файл с шаблоном? Инструкция Kill вызывает сообщения о блокировке шаблона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2004, 18:59 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Excel у тебя остается открытым. Удаляя ссылки на него, ты не закрываешь его. Поэтому либо делай xlsApp.Visible=true с тем, чтобы пользователь сам закрыл его, либо xlsApp.Quit - программно закрывая Excel перед Nothing'ами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 10:16 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2 CtrlAlt Set WBt = xlsApp.Workbooks.Add(FileName) :0) си (правда я уже и сам дотумкал создавать из шаблона). зы: забавное поведение шаблона: 1. пишу в него что-нить и открываю его (руками) в сеансе как файл для редактирования. 2. Вношу в файл шаблона изменения и сохраняю. 3. При открытии (руками) в другом сеансе для редактирования предупреждает о возможности открытия только для чтения. 4. Но при этом ёксель нормально пропускает перезапись файла шаблона не средствами XL (не смотря на то что "он" открыт в екселе на редактироование): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. содержимое в файле полностью обновляется, но ёксель не матерится. т.е., получается, что Kill -ить буферный файл нет никакой нужды (только если хочется проверить, не занят ли он еще чем то)? "Блокировка" екселя при этом все таки мешает отредактировать файл руками из блокнота. Очень забавное поведение. Понять бы, что позволяет инструкциям Код: plaintext 1. 2. безконфликтно обойти блокировку файла ёкселем на изменение. (хотя и тут есть какие-то фокусы, если файл не является файлом екселя (т.е. не сохранен как файл екселя), а именно в пустой (длиной 0), но открытый в XL-е файл оно писать не хочет, пока его не сохранишь как книгу эксель (или не пустой, но явно не эксельный, открытый в екселе как текстовый - до момента первого сохранения _как книги_)). Какие-то унутренние прибабахи. Получается, что уровень блокировки файла екселем (For Binary Access Write) зависит от типа файла (реального, а не расширения). т.е. от того, опознан ли он экселем как родной. И как только опознан, можно писать в него из внешнего (по отношению к екселю, в котором он открыт) процесса, открыв For Binary Access Write. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 11:58 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
tim2 На http://www.ctrlalt.nm.ru/AccessExcel.htm теперь есть пример. Можешь посмотреть фыыф Пока не понял фишку, надо подумать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 12:20 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Ссуть нарно в том, штаа ексель файлы своего формата НЕ Открывает (фактически) для изменения (А всегда создает новые, помечая старый как заблокированный), и стал быть блокировка там несколько иного вида (чем блокировка файла, открытого на изменение). При доступе к нераспознанному (форматом) файлу он блокирует его полностью, вплоть до сохранения его в формате екселя (в этот момент тип блокировки сохраненного изменяется, а "рабочим" (отслеживающим изменения) становится временный файл). Возможно разница блокировок аналогична разнице режимов работы с файлом при открытии как (Append|Output) vs (Binary|Input|Random)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 13:09 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
Почему фыыфт.е., получается, что Kill -ить буферный файл нет никакой нужды ? А если пользователь не захочет сохранять отчет, то этот буферный файл ведь останется неприкаяный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2004, 13:21 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
2 CtrlAlt: А можно ли в указанном тобой примере (http://www.ctrlalt.nm.ru/AccessExcel.htm) сделать так, чтобы при открытии несохраненного пока листа(проц-ра "MakeXLS_2") его название было бы не "temp1". а что-то вразумительное? Чтобы, если пользователь выберет сохранение, имя файла уже было бы сформировано и осталось указать только папку. Т.е. после строки Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 10:32 |
|
||
|
Из Аксесса в шаблон Екселя - есть ли надежный способ?
|
|||
|---|---|---|---|
|
#18+
авторчтобы при открытии несохраненного пока листа его название было бы не "temp1". а что-то вразумительное 1. не следует путать имя листа (можно изменить .Name="NewName") и книги (Read Only, меняется само при сохранении xl.SaveAs filename:=NewPath & "NewName.xls"). Но тогда нет необходимости выгружать файл как шаблон, и создавать клон (методом .Add). Загружайте методом Open (выгрузив из таблицы в файл уже с требуемым окончательным именем, но, может быть, временным путем). 2. можно подгонять имя файла шаблона (ибо все равно во что-то его выгружаете), тогда " несохраненная пока книга" будет иметь необходимое имя + 1. С чем, видимо, надо мириться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 11:42 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32496470&tid=1674983]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 531ms |

| 0 / 0 |
