Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создать VB макрос в Delphi и запустить на, выполнение в Word  
V
    Опции темы
zhefran
Дата 27.5.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



 Суть вопроса отображена в теме.
 Мое приложение должно запускать мой макрос в Word и покуда энтое дело будет запускаться на нескольких машинах, то хотелось бы, что бы в моем приложении создавался макрос, а потом выполнялся в Word. Что-то типа а-ля автоматизации.
 Не хочеться писать макросы в самом Word, есть несколько нюансов: человек переставил Word, поудалял все макросы, или впадло мне на каждой машине писать макрос  smile. 

Хочеться раз и все!!!   

Нашел такой кусок кода:
Код

try
      VBComp := WB.VBProject.VBComponents.Add(1); // vbext_ct_StdModule
      VBComp.Name := 'TestModule';
      // запишем туда наш макрос
      VBComp.CodeModule.AddFromString(
        'Public Sub Test(ByVal ADate As Date)'#10 +
        #9'MsgBox "Привет из VBA!" & Chr(13) & "Сегодня " & ADate, _'#10 +
        #9#9'vbInformation, "Test макроса"'#10 +
        'End Sub'
      );
    except
      ShowMessage('Нужно включить вручную в Excel''е "Доверять доступ к Visual Basic Project"');
    end;
    // выполним макрос
    XL.Run('Test', Date());


По этому коду вопрос: Что нужно подключить что бы использовать WB.VBProject.VBComponents.Add(1); // vbext_ct_StdModule или где он может находиться?
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 27.5.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



попробуй:
Код

WordApplication1.VBE....



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
zhefran
Дата 27.5.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Цитата(Albinos_x @  27.5.2008,  13:09 Найти цитируемый пост)
WordApplication1.VBE....

Я там не нашел VBComponents.

Добавлено через 14 минут и 21 секунду
какой формат у VBComp?
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 27.5.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



товарищи... пора уже научиться пользоваться справкой)))
Код
...
WordApplication1.VBE.VBProjects.Add(Type_);
...

переменная Type_ типа TOleEnum может принимать следующие значения:
vbext_ct_StdModule := 1
vbext_ct_ClassModule := 2
vbext_ct_Document := 100
vbext_ct_MSForm := 3
vbext_ct_ActiveXDesigner := 11

перечисленные переменные лежат в модуле VBIDEXP

показанная в коде операция возвращает _VBProject который тоже описан в VBIDEXP;

Это сообщение отредактировал(а) Albinos_x - 28.5.2008, 13:16


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
zhefran
Дата 28.5.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Написал такой код:
Код

procedure TForm1.Button2Click(Sender: TObject);
var vbproj:_VbProject;
    vbcomp: _VbComponent;
begin
try
Vbproj:=Wordapplication1.VBE.VBProjects.Add(vbext_ct_StdModule);
Vbcomp:=VBproj.VBComponents.Add(1);
Vbcomp.Name:='TestModule';
Vbcomp.CodeModule.AddFromString('Public Sub Mymacro'#13#10+
'CommandBars("lines").Controls.Item(6).Execute'#13#10+'end sub');
 except
     ShowMessage('Нужно включить вручную в Word'е "Доверять доступ к Visual Basic Project"');
    end;
    // выполним макрос
    Wordapplication1.Run('Mymacro');
end;
end;

Выдает ошибку:
user posted image


Это сообщение отредактировал(а) zhefran - 28.5.2008, 10:40
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 28.5.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



на какой строчке выдаёт?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
zhefran
Дата 28.5.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Цитата(Albinos_x @  28.5.2008,  13:21 Найти цитируемый пост)
на какой строчке выдаёт? 


Код

Vbproj:=Wordapplication1.VBE.VBProjects.Add(vbext_ct_StdModule);


подключение делал так:
Код

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, WordXP, ExtCtrls, VBScript_RegExp_55_TLB,
  OleCtrls, MSScriptControl_TLB, VBIDEXP;

--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 28.5.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



хм.... а сервер к ворду поключён?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
zhefran
Дата 29.5.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Если имеется ввиду 
Код

WordApplication1.Connect;
 
то да!!!
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
zhefran
Дата 29.5.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Вот весь код
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, WordXP, ExtCtrls, VBScript_RegExp_55_TLB,
  OleCtrls, MSScriptControl_TLB, VBIDEXP;

type
  TForm1 = class(TForm)
    WordApplication1: TWordApplication;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
Button1.Caption:=inttostr(wordapplication1.CommandBars.Count);
for i:=1 to wordapplication1.CommandBars.Count do
  begin
  memo1.Lines.Add(wordapplication1.CommandBars.Item[i].Name);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
var vbproj:_VbProject;
    vbcomp: _VbComponent;
begin
WordApplication1.Connect;
try
Vbproj:=Wordapplication1.VBE.VBProjects.Add(vbext_ct_StdModule);
Vbcomp:=VBproj.VBComponents.Add(1);
Vbcomp.Name:='TestModule';
Vbcomp.CodeModule.AddFromString('Public Sub Mymacro'#13#10+'CommandBars("lines").Controls.Item(6).Execute'#13#10+'end sub');


 except
     ShowMessage('Нужно включить вручную в Word''е "Доверять доступ к Visual Basic Project"');
    end;
    // выполним макрос
    Wordapplication1.Run('Mymacro');
    Wordapplication1.Disconnect;
end;

end.



Это сообщение отредактировал(а) zhefran - 29.5.2008, 16:23
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 29.5.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Код
...
var vbproj:_VbProject;
    vbcomp: _VbComponent;
    vb : _VBProjects;
begin
// соединяемся
WordApplication1.Connect; 
// делаем видимым
WordApplication1.Visible:=true;
try
   vb:=Wordapplication1.VBE.VBProjects;
   // это использовать не будем, т.к. возникает конфликт
   //Vbproj:=vb.Add(vbext_ct_Document);
   // присоединяемся к имеющимся проектам
   Vbproj:=vb.VBE.ActiveVBProject;
   // добавляем
   Vbcomp:=VBproj.VBComponents.Add(1);
   /// эту строку тоже использовать не будем
   // Vbcomp.Name:='TestModule';
   // добавляем новый макрос в шаблон
   Vbcomp.CodeModule.AddFromString('Public Sub Mymacro'#13#10+'CommandBars("lines").Controls.Item(6).Execute'#13#10+'end sub');
 except
    // если ошибка выводм сообщение
     ShowMessage('Íóæíî âêëþ÷èòü âðó÷íóþ â Word''å "Äîâåðÿòü äîñòóï ê Visual Basic Project"');
    end;
// запускаем макрос
// ! НО ! Если открытых документов нет, то у Нас всё зависнет
// поэтому проверяем, а стоит ли запускать
if WordApplication1.Documents.Count>0 then
    Wordapplication1.Run('Mymacro');
// эта строка нам тоже не нужна или по крайней мере
// использовать в паре с
  // Wordapplication1.Quit;
  //  Wordapplication1.Disconnect;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
zhefran
Дата 30.5.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



На строчке
Код

Vbcomp:=VBproj.VBComponents.Add(1);

Выдает ошибку:
user posted image

Хотя, в макросах безопасность стоит низкая и Доверять доступ к Visual Basic Project


Добавлено:
Наваял еще такой вариант:
Код

procedure TForm1.Button3Click(Sender: TObject);
var w:variant;
wbcomp:variant;
begin

w:=Createoleobject('Word.Application');
W.vISIBLe:=true;
try
 w.documents.open('g:\\new.doc');
wbcomp:=w.activedocument.Vbproject.Vbcomponents.Add(1);
//wbcomp.name:='Test1';
Wbcomp.Codemodule.addfromstring('Sub Mymacro'#13#10+
'CommandBars("lines").Controls.Item(6).Execute'#13#10+'end sub');
 W.Run('Mymacro');
 except
     ShowMessage('Нужно включить вручную в Word''е "Доверять доступ к Visual Basic Project"');
    end;
end;
 
Он выполнился, но меня этот вариант не устраивает! Потому, что нельзя запустить этот макрос в уже открытом документе.
+ Макрос записывается не в Normal.dot, а мне хотелось бы писать в него! 
 

Это сообщение отредактировал(а) zhefran - 30.5.2008, 13:18
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 30.5.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



хм... странно... приведённый мной код у меня работает, даже при высокой безопасности в макросах...
у тебя ошибка видимо в другом... он у меня тоже ошибку сначала выдавал, когда я пытался добавлять проект, при его существовании... проверяй его ещё на это...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
zhefran
Дата 30.5.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Цитата(Albinos_x @  30.5.2008,  13:25 Найти цитируемый пост)
у тебя ошибка видимо в другом... он у меня тоже ошибку сначала выдавал, когда я пытался добавлять проект, при его существовании... проверяй его ещё на это...

Вы оказались правы, сударь!!!

--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
zhefran
Дата 31.5.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Написал что-то типа с проверкой. Проверьте, пожалуйста.
Буду ждать замечаний и пожеланий.
Код

procedure TForm1.Button1Click(Sender: TObject);
var vb:_VBProjects;
    vbcomp: _VbComponent;
    vbproj:_VBProject;
    t:Olevariant;
    a,b,c,d:integer;
begin
a:=1;
b:=1;
c:=1;
d:=1;
t:='bla1';
Wordapplication1.Connect;
wordapplication1.Visible:=true;
 try
  vb:=wordapplication1.VBE.VBProjects;
  vbproj:=vb.VBE.ActiveVBProject;
  vbcomp:=vbproj.VBComponents.Item(t);
  if vbcomp.CodeModule.Find('Commandbars',a,b,c,d,false,false,false)=false then
   begin 
    showmessage(':(');
    vbcomp.CodeModule.AddFromString('Sub mymacro()'#13#10+'CommandBars("lines").Controls.Item(6).Execute'#13#10+'end sub');
   end;
 except
   try
    vb:=wordapplication1.VBE.VBProjects;
    vbproj:=vb.VBE.ActiveVBProject;
    vbcomp:=vbproj.VBComponents.Add(1);
    vbcomp.Name:='bla1';
    vbcomp.CodeModule.AddFromString('Sub mymacro()'#13#10+'CommandBars("lines").Controls.Item(6).Execute'#13#10+'end sub'); 
  except
    showmessage(':((');
  end;
 end;
end;

--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.