powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Из Аксесса в шаблон Екселя - есть ли надежный способ?
25 сообщений из 56, страница 1 из 3
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32491716
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите с надежным способом работы с Екселем из Аксесс, в ситуации, когда участвует шаблон документа. У меня то работает "влет", то сыпятся сообщения типа "сервер СРС не доступен". В таблице "Files", в поле "Shablon"(поле объекта OLE) храню шаблоны, у каждого есть ID. В Форме, откуда вызывается все это дело, есть скрытый элемент Shabl(свободная рамка объекта). Работа с Екселем начинается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
    [Forms]![Заявки]!Shabl = DLookup( "Shablon" ,  "Files" ,  "ID = 5 ") 
    [Forms]![Заявки]!Shabl.Action = acOLEActivate
    Set xlsApp = GetObject(,  "Excel.Application" )
    xlsApp.Visible = True
    Set xlsSheet = xlsApp.Worksheets (1 )
    xlsApp.WindowState =  -4137 
     xlsSheet.Activate

Где тут самое "слабое" место не нашел, но может есть у кого отлаженный код?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32491784
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) GetObject(, "Excel.Application") даст ошибку, если Erctkm yt pfuhe;ty d gfvznm
2) Set xlsSheet = xlsApp.Worksheets(1) даст ошибку, если в екселе не открыто ни одной книги
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32491802
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Victoshaесли Erctkm yt pfuhe;ty d gfvznm
Перевожу:
если Уксель не загружен в память
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492145
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как-же приведенный мною код должен выглядеть?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492162
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотря что хочешь получить - если ошибку - то код верен

есть еще createobject
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492171
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное он у тебя не успевает запуститься а ты его уже ловишь
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492212
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри
http://www.ctrlalt.nm.ru/AccessExcel.htm

Пункт 3. Использование шаблонов.

С тех пор как я использую этот метод, ни разу ничего не глючело.
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492486
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CtrlAlt:
так ты хранишь шаблон в виде бинарного файла? Чего-то я так не делал никогда, да и в статье написано, что тогда шаблон напрямую нельзя посмотреть.
А какой код при работе с шаблоном-OLE в статье нет...:(((
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492533
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы посмотреть шаблон, нужно его сохранить куда-нибудь в файл функцией SaveXLS. А потом открыть Excel'ем.

Работу с отчетами я сделал в виде формы с двумя кнопками - "загрузить шаблон", "сохранить шаблон".
Нажимаем сохранить шаблон, выбираем папку куда сохранять и сохраняем.

Работы с шаблоном.
1. Сохраняем его в папку где должен лежать отчет
2. Делаем на него GetObject или CreateObject
3. Изменяем как надо
4. Сохраняем под нужным именем
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492568
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Надо же - работает(это я про бинарный способ)!!!
Исправил ошибку в процедуре вытаскивания шаблона из бд, а именно:
Код: plaintext
XLS = rst(F).GetChunk (0 , rst(F).FieldSize)
до этого перед FieldSize было, почему-то, rst( REG ).
Появляются вопросы: после вытаскивания шаблона он сразу, до обработки, сохраняется в указанной директории, а если он не нужен(допустим данные ошибочные вывелись), его ручками удалять? В случае с OLE - документ, без соответствующей команды, как бы висит в воздухе и можно его просто закрыть, не сохраняя, и не беспокоиться, что плодишь мусор, а здесь как?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492658
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю как:
1. Сохраняю шаблон под именем temp
2. Делаю необходимые действия
3. Сохраняю SaveAs в нужное имя
4. Удаляю шаблон

Если вдруг данные ошибочны, пункт 3 можно опустить. Хотя такую проверку желательно делать до выгрузки. И вообще не выгружать если что-то не так.
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492777
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И с бинарным файлом непонятки, после вытаскивания шаблона из бд в файл, пишу:
Код: plaintext
1.
2.
3.
4.
Set xlsApp = GetObject(Путь к шаблону + имя шаблона)
    xlsApp.Application.Visible = True
    Set xlsSheet = xlsApp.Worksheets (1 )
    xlsApp.WindowState =  -4137 
     xlsSheet.Activate
и на третьей строке получаю: "Ошибка программирования объектов. Сервер RРС недоступен."
Как мне добраться до момента, когда собственно сама работа с Екселем начнется?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32492819
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
...
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493308
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CtrlAlt:
Чего-то я запутался... Вот начало моей проц-ры(бинарный файл уже извлечен из бд и находится по адресу "E:\....xls"):
Код: plaintext
1.
2.
3.
Set xlsApp = GetObject( "E:\....xls" )
xlsApp.Application.Visible = True
Set xlsSheet = xlsApp.Worksheets (1 )
xlsApp.Parent.Windows (1 ).Visible = True

Вопрос1: почему начала у нас разные, а работает и так, и так, и какое начало правильней?
Вопрос2: почему у тебя нет самой последней моей строки и вообще зачем она(содрал ее из примера в Help-e)?
У меня дальше по коду есть такие строки:
Код: plaintext
1.
xlsSheet.Range(.cells (13 ,  3 ), .cells (26 ,  1 )).Select
xlsApp.Selection.Cut
на последней строке получаю сообщение, что этот метод объект не поддерживает.
Вопрос3: когда я работал с шаблоном в виде OLE, то все работало, что случилось?
Где-то тут, может, Application добавить, только где?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493348
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВопрос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 код работает в контекстах разных контейнерных приложений, вот и ведет себя неодинаково.
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493437
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
б) подъем екселя как прлижения, еще до загрузки в него конкретной книги. - так ведь в следующей строке:
Код: plaintext
XlsApp.Workbooks.Open Path &  "temp.xls" 
ты "поднимаешь" конкретную книгу, получается, что моя одна строка = твоим двум, или я чего не понимаю?
Код: plaintext
xlsApp.Selection.Cut
заменил на
Код: plaintext
xlsApp.Application.Selection.Cut
(еще не читал тогда твоего ответа), ошибка исчезла, но осталось непонимание: где надо указывать XlsApp, а где xlsSheet? Использую их скорее интуитивно, чем разумно.
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493463
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Dim XLS, WB, S, C

Set XLS = CreateObject( "Excel.Application" ) 
Set WB=XLS.Workbooks.Open  "E....xls"  

XLS.Visible=true 
Set S= XLS.Sheets (1 )
Set C=S.Cells

S.Range(C (13 ,  3 ),C (26  ,1 )).Cut
 
Set C=nothing
Set S=nothing
Set WB=nothing
Set XLS=nothing



Воспрос 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 какой-нибудь не забыл отобразить)
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493613
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДело в том, что когда ты подключаешь библиотеку, то можешь использовать всякие объекты типа 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

типа не со зла я, а исключительно в целях поправить неточности...
-)
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493655
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да причем здесь "не со зла"? Наоборот - спасибо, за понятное объяснение!!! :))
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493692
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И плавненько так возвращаемся почти к началу ветки - к бинарному файлу:
В процедуре сохранение шаблона в бд указывается только файл-источник и имя столбца таблицы. Соответственно при извлечении из бд файл указывается как
Код: plaintext
XLS = rst(F).GetChunk (0 , rst(F).FieldSize)
, а как быть если нужно несколько шаблонов хранить-извлекать, помещать каждый в отдельное поле?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493703
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493748
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CtrlAlt:
3. Сохраняю SaveAs в нужное имя
Но при SaveAs диалоговое окно не возникает, выходит, что файл сохраняется автоматом? А как ты поступаешь, если то, что сохранилось "не такое", удаляешь руками или опять SaveAs под тем же именем, затирая этим "не такой" вариант?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493823
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясни подробнее, что такое "не такой" вариант?
У меня файлы выгружаются автоматом, без окрывания Excel (Visible=false, так быстрее, кстати) и сохраняются в указанную папку. Т.е. в Access нажал на кнопку и все распечаталось. "Не таких" файлов у меня нет. Разве что при формировании отчета реализуется алгоритм расстановки подписей к диаграммам, и когда это не возможно сделать (вероятность 0.2%) файл сохраняется с префиксом no_ . Потом можно вручную подправить ежели что. Это имеется ввиду?
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32493847
tim2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не совсем: гонится, без открытия, в Ексель, ну скажем, - спецификация. Потом в "указанной папке" файл открывается и обнаруживается "ляп", ну скажем, - нет реквизитов, далее - читай с начала...
...
Рейтинг: 0 / 0
Из Аксесса в шаблон Екселя - есть ли надежный способ?
    #32494000
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это уже тонкости вашей конкретной задачи. Собственно от метода выгрузки в Excel это не зависит. Но опять же повторюсь, нет реквизитов не надо и печатать. Проверки на корректность данных нужно делать ДО выгрузки в Excel.
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Из Аксесса в шаблон Екселя - есть ли надежный способ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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