VBA и автоматизация
От: Oldpasp  
Дата: 17.02.02 06:06
Оценка:
Сможет ли кто-нибудь объяснить (желательно как для тупых) каким образом можно управлять объектами Office (Word, Exel, и т.п.)
Задача — создать ActiveX dll, на основе ATL (или иначе, но чтобы не надо было тащить с собой MFC)
Чтобы использовать можно было из VBA, например:

Set appdll=New APPDLL.Class1
appdll.HangeSize Me 'где Me -форма в VBE

соответственно в dll по этому методу допустим меняется размер формы(или другое свойство)

Сделать подобное на VB -5секунд, но опять же потом требуется vb-библиотека, да и скорость при некоторых задачах

Доступные мне примеры работают так: запускается VC программа, а из нее создается документ Office и тд, причем в основном на основе MFC :(

Мне же надо наоборот — главным идет VBA

Пытался разобраться по статье "Директива #import" — но увы, с ATL проэктом не катит- куча ошибок на создаваемый *.tlh

Только просьба, по существу, советы "прочитай книгу ...." — не надо, я бы это сделал, но в радиусе 500 км таких книг нету :(

Если у кого есть пример, скиньте на мыло oldpasp@mail.ru

И еще, здесь часто есть ссылка на optim.ru — никак не могу попасть, она работает?
Re: VBA и автоматизация
От: George_Seryakov Россия  
Дата: 18.02.02 03:38
Оценка:
Здравствуйте Oldpasp, Вы писали:

O>Сможет ли кто-нибудь объяснить (желательно как для тупых) каким образом можно управлять объектами Office (Word, Exel, и т.п.)

O>Задача — создать ActiveX dll, на основе ATL (или иначе, но чтобы не надо было тащить с собой MFC)
O>Чтобы использовать можно было из VBA, например:

O>Set appdll=New APPDLL.Class1


А в VBA есть типизированные объекты? Вроде, нет, все через дисп.

O>appdll.HangeSize Me 'где Me -форма в VBE


O>соответственно в dll по этому методу допустим меняется размер формы(или другое свойство)


O>Сделать подобное на VB -5секунд, но опять же потом требуется vb-библиотека, да и скорость при некоторых задачах


Я не очень понял, что тебе надо. Из VBA вызывать программу, которая будет работать с экселем через автоматизацию? А почему не работать с экселем напрямую? И откуда VBA узнает про "форму в VBE"?

Но если ты имеешь код на VB (не VBA, компилируемый), то перевести в C++/ATL его можно автоматически. Главное — директива #import, дуальные интерфейсы и внимательно следить за типами в интерфейсах.

O>Пытался разобраться по статье "Директива #import" — но увы, с ATL проэктом не катит- куча ошибок на создаваемый *.tlh


Ну, давай начинать с первой непонятной. Show me the code.

O>Только просьба, по существу, советы "прочитай книгу ...." — не надо, я бы это сделал, но в радиусе 500 км таких книг нету


MSDN?
GS
Re[2]: VBA и автоматизация
От: Oldpasp  
Дата: 18.02.02 04:51
Оценка:
Здравствуйте George_Seryakov

GS> А в VBA есть типизированные объекты? Вроде, нет, все через дисп.

Да по мне то хоть через что, лишь бы выполняла свои функции и требовала минимальных действий при установке и использовании. Я уже примерно понял, что через интерфейсы :), вопрос — как

GS> Я не очень понял, что тебе надо. Из VBA вызывать программу, которая будет работать с экселем через автоматизацию? А почему не работать с экселем напрямую? И откуда VBA узнает про "форму в VBE"?


не будем применять термин VBE — так как сам не до конца разобрался, чем он отличается от VBA :)

Задача: в среде Word,Exel,Access (мне кажется это не принципиально, механизм должен быть одинаковым) открываем Документ(Форму, Лист). Пусть будет Форма (UserForm) с кнопочкой
По нажатию "кнопочки" изменяется размер формы и цвет фона.
Разумеется, сделать это (и многое другое) в среде VBA и VB поверьте, для меня не составляет практически никаких трудностей.
Вопрос — как свести это дело в DLL — (не VB-шную, а скажем "чистая, Windows-ая dll")
Эта задача лишь пример, в самом деле может потребоваться большой объем вычислений или работы с Windows
Думаю будет верным утверждать, что большинство программных продуктов у широкого пользователя (нормального, не "сдвинутого" на компьютере) — использует или широко поддерживает среду VBA
А если ряд есть ряд действий, операций, часто используемых — то почему бы не вынести в DLL

GS> Но если ты имеешь код на VB (не VBA, компилируемый), то перевести в C++/ATL его можно автоматически.


Хорошо, пусть будет VB
Я ведь про то и спрашиваю, как перевести на C++/ATL
Конечно, это наверняка долго объяснять, поэтому, если есть пример работы с объектами VB(VBA) в C++/ATL- DLL — обращаю внимание, не создаваемыми в процедурах DLL, а УЖЕ СУЩЕСТВУЮЩИМИ, т.е. вызов методов происходит из среды VB(VBA) с передачей в качестве аргумента ссылку на объект — буду весьма признателен за ссылку или за посылку :)

GS>Ну, давай начинать с первой непонятной. Show me the code.


Со статьей разобрался, просто для использования #import библиотеки Assess2000 надо еще делать импорт ADO (в статье сделан только DAO)

GS>MSDN?


Много лет пытались меня выучить немецкому, так что конечно можно и это, только если стиль не сильно литературный :)

Наверное не надо уже пояснять, что я только начал разбираться и поставил цель не разрабатывать собственные полнофункциональные приложения (на хлеб с маслом и так пока хватает), а создавать дополнения к уже существующим.(Лень мне тащить огромные куски кода из документа в документ)
Re[3]: VBA и автоматизация
От: George_Seryakov Россия  
Дата: 18.02.02 16:36
Оценка:
Здравствуйте Oldpasp, Вы писали:

O>Задача: в среде Word,Exel,Access (мне кажется это не принципиально, механизм должен быть одинаковым) открываем Документ(Форму, Лист). Пусть будет Форма (UserForm) с кнопочкой

O>По нажатию "кнопочки" изменяется размер формы и цвет фона.
O>Разумеется, сделать это (и многое другое) в среде VBA и VB поверьте, для меня не составляет практически никаких трудностей.
O>Вопрос — как свести это дело в DLL — (не VB-шную, а скажем "чистая, Windows-ая dll")

Т.е. нужна работа с объектами оффиса из C++ кода? http://www.rsdn.ru/article/?vcpp/import.xml
Автор(ы): Игорь Ткачёв
Дата: 9.03.2001

В данной статье приводится объяснение работы директивы #import
компилятора Visual C++ и даны примеры её использования с
MS Word, MS Excel, ADO DB и ActiveX Control.
и особенно примеры в конце .
Или проблема, как такой код вызвать из VBA? Делать интерфейсы дуальными.

O>Я ведь про то и спрашиваю, как перевести на C++/ATL

O>Конечно, это наверняка долго объяснять, поэтому, если есть пример работы с объектами VB(VBA) в C++/ATL- DLL — обращаю внимание, не создаваемыми в процедурах DLL, а УЖЕ СУЩЕСТВУЮЩИМИ, т.е. вызов методов происходит из среды VB(VBA) с передачей в качестве аргумента ссылку на объект — буду весьма признателен за ссылку или за посылку :)

У тебя есть DLL написанное на VB, значит есть и IDL. Его можно увидеть, посмотрев на DLL с помощью OleView. Вот это IDL и нужно воспроизвести в ATL-ном коде.

При передаче объекта из VBA в С++ код можно передавать через IDispatch*. Просто VBA все объекты держит нетипизированными и работает с ними через Invoke. В С++ коде ты уже можешь сделать QI на типизированный объект и дальше работать с типами, полученными через #import.

Я сейчас не могу сообразить — можно ли использовать вызовы с типизированными объектами в интерфейсах, сделает ли VBA при вызове QI. Возможно, да. Посмотри IDL от своей VB-шной DLL-и, там правильно.

O>Наверное не надо уже пояснять, что я только начал разбираться и поставил цель не разрабатывать собственные полнофункциональные приложения (на хлеб с маслом и так пока хватает), а создавать дополнения к уже существующим.(Лень мне тащить огромные куски кода из документа в документ)


Зачем тогда C++/ATL? Васик и флаг в руки. Серьезно.
GS
Re[4]: VBA и автоматизация
От: Oldpasp  
Дата: 19.02.02 00:20
Оценка:
Здравствуйте George_Seryakov

Спасибо, направление примерно понятно, будем копать

В статье про "#import" и других примерах меня больше всего смущает вот эта строка:
    _ApplicationPtr excel("Excel.Application");//запускается новый экземпляр Exel
или
    _Application app; 
    app.CreateDispatch("Excel.Application");


Как можно получить указатель на приложение-текущего хозяина DLL (с учетом того, что запущено несколько одинаковых "Excel.Application"
Все остальное тогда можно решить.

>Зачем тогда C++/ATL? Васик и флаг в руки. Серьезно.

А спортивный интерес
Серьезно:
Да я бы и особо не полез, но есть несколько контролов и пр. приблуд (с исходниками — VB), которые красиво работают в программах VB, но тормозятся при использовании в VBA одна из причин (как мне кажется) — слишком медленная обработка оконных сообщений.
Да и некоторые VC — контролы некорректно работают в VBA, что не есть порядок.

С важением
Re[5]: VBA и автоматизация
От: George_Seryakov Россия  
Дата: 19.02.02 01:27
Оценка:
Здравствуйте Oldpasp, Вы писали:

O>Как можно получить указатель на приложение-текущего хозяина DLL (с учетом того, что запущено несколько одинаковых "Excel.Application"


Передать какой-нибудь объект в DLL и пойти по ссылкам до Application.

>>Зачем тогда C++/ATL? Васик и флаг в руки. Серьезно.


O>А спортивный интерес


Тогда MSDN. Все остальное — сделать и забыть.

O>С важением
GS
Re[6]: VBA и автоматизация
От: Oldpasp  
Дата: 19.02.02 06:49
Оценка:
М-да, с чего начали, к тому пришли

George_Seryakov, спасибо, что не оставили без внимания, дальнейшее прошу не воспринимать.

Судя по откликам эта задача либо ну совсем простая, либо "ноу-хау", либо я не один такой глупый.
Самый распространенный ответ на форумах- "почитай MSDN" — мне кажется это знает каждый, кто решился первый раз запустить среду разработки.
Второй по распространенности — "почитай книгу...." — но ведь не увсех есть возможность приобрести книги, Россия- она большая.
Я пока не владею "профессиональной" терминологией, поэтому наверное вопросы большинству непонятны.
Re[2]: VBA и автоматизация
От: frogge Россия  
Дата: 19.02.02 19:17
Оценка: 3 (1)
Здравствуйте George_Seryakov, Вы писали:


GS> А в VBA есть типизированные объекты? Вроде, нет, все через дисп.


В VBA есть, и прекрасно себя чуствуют, вот в VB Script их нет.
Re[3]: VBA и автоматизация
От: George_Seryakov Россия  
Дата: 19.02.02 23:43
Оценка:
Здравствуйте frogge, Вы писали:

F>Здравствуйте George_Seryakov, Вы писали:



GS>> А в VBA есть типизированные объекты? Вроде, нет, все через дисп.


F>В VBA есть, и прекрасно себя чуствуют, вот в VB Script их нет.


Воистину так. Пошел и нашел References в Экселе. А я, недогадливый, так и писал в эксельном VB как в VBS...

Ну тогда проблема с передачей объекта в ATL-ный код очевидна. Пишется IDL, с котором importlib-аются нужные интерфейсы. Строится интерфейс, имеющий в качестве входно параметра указатель на интерфейс передаваемого объекта. Внутри ATL/C++-ного кода импортируются те же самые DLL-и (да, импортировать надо два раза), и сгененерированными при импорте типами переданные объекты успешно хендлаются.

Но в ASP типизации ведь нет? Я не совсем clueless?
GS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.