Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
a_krut
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 18
1

Как перевести макрос VBA в Delphi?

06.11.2016, 12:04. Просмотров 402. Ответов 5

Здравствуйте!
Помогите перевести макрос на VBA в Delphi.
Хочу научиться вставлять формулы в Word.
Перерыл кучу сайтов, нигде не нашел конкретного ответа.
Вопросов на эту тему много. Ответов или нет вообще или предлагают написать макрос на VBA, а потом перевести его в Delphi. Вот я написал.
Решил использовать поля EQ. Макрос работает. Перевести пока не смог.

Visual Basic
1
2
3
4
5
6
Sub Макрос5()
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="eq \r(3)"
Selection.Fields.Update
End Sub
Проблемы с первой строкой. Delphi ругается на wdFieldEmpty.
Подозреваю, что проблемы с синтаксисом.
Макрос должен вставлять (и делает это) в текст в виде формулы корень из 3. Если это получится из Delphi - можно будет вставить любую формулу.

Помогите, кто чем может, а желательно правильно написанной строкой.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2016, 12:04
Ответы с готовыми решениями:

Как через Delphi записать макрос в документ Word?
Вопрос, который я задаю, относится не только к языку Delphi, но и к программе...

Как перевести из PASCAL в DELPHI?
сам проэкт! заранее огромное спасибо!

Как перевести код с паскаля на DELPHI?
Как перевести код с паскаля на DELPHI? program Project1; {$APPTYPE...

как перевести код с Delphi на Builder6
Помогите если кто знает как unit Unit1; interface uses Windows,...

Как перевести заданное уравнение на язык Delphi?
Помогите перевести уравнение на язык Delphi Возможно не по теме

5
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
08.11.2016, 08:43 2
a_krut, надо описать константу: wdFieldEmpty.
Как разрабатывать программы для управления приложениями MS Office на примере MS Excel: Поиск и получение данных из Excel
0
a_krut
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 18
08.11.2016, 09:44  [ТС] 3
Надеюсь, я вас неправильно понял. wdFieldEmpty в VBA равно -1.
Я написал:
Delphi
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
unit word_m1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComObj;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var Word: variant;
  field :OleVariant;
  b,e   :OleVariant;
const  wdFieldEmpty=-1;
begin
try
Word := CreateOleObject('Word.Application');
except
ShowMessage('Не могу запустить Microsoft Word');
end;
Word.Visible := True;
Word.Documents.Add;
  e:=False;
word.Fields.Add(word.Application.Selection.Range,wdFieldEmpty,e);
Word.Selection.TypeText(Text:='eq \r(3)');
Word.Selection.Fields.Update
 
end;
 
end.
Получил:

Что не так?
0
Миниатюры
Как перевести макрос VBA в Delphi?  
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
08.11.2016, 10:43 4
Объект Word.Application не содержит метода Fields. Свойство Fields есть в Word.Document. Кроме этого, слово Word в Delphi является предустановленным идентификатором двухбайтного целочисленного типа без знака. В коде этот идентификатор переопределяется. К ошибкам это не приводит, но снижает переносимость кода.
Можно начать с такого кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
const
  wdFieldEmpty = -1;
var
  wdApp, wdDoc, wdRng, wdField : OleVariant;
begin
  try
    wdApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Не могу запустить Microsoft Word');
  end;
  wdApp.Visible := True;
  wdDoc := wdApp.Documents.Add;
  wdRng := wdDoc.Range.Characters.Last; //Конец диапазона документа.
  wdField := wdDoc.Fields.Add(wdRng, wdFieldEmpty, False);
  wdRng.Text := 'eq\r(3)';
  wdField.Update; //Или для обновления всех полей документа: wdRng.Fields.Update;
end;
Дальше уже разбираться в деталях.
1
a_krut
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 18
08.11.2016, 17:31  [ТС] 5
Большое спасибо. Хотя пример, приведенный вами не работал, выдавал сообщение "Объект был удален".
Но методом научного и ненаучного тыка, плясок с бубном и молитвы макаронному монстру результат получен. Хотя понимание пока не пришло...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
const
  wdFieldEmpty = -1;
var
  wdApp, wdDoc, wdRng, wdField : OleVariant;
begin
  try
    wdApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Не могу запустить Microsoft Word');
  end;
  wdApp.Visible := True;
  wdDoc := wdApp.Documents.Add;
  wdField := wdDoc.Fields.Add(wdDoc.Application.Selection.Range, wdFieldEmpty,'eq \r(3)', False);
  wdField.Update; 
end;
Вот так вышло, работает. Большое спасибо. Буду благодарен за комментарий.
0
a_krut
0 / 0 / 0
Регистрация: 27.04.2015
Сообщений: 18
23.12.2016, 23:20  [ТС] 6
Как выводить формулы в Word - разобрался.
Как текст - тоже.
Но выводить их в один документ поочередно - не получается.
Вот такое нагородил:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.Button1Click(Sender: TObject);
const wdFieldEmpty = -1;
 
var
  MSWord: Variant;
   wdApp, wdRng, wdField : OleVariant;
begin
  try
    MsWord := GetActiveOleObject('Word.Application');
  except
    try
      MsWord := CreateOleObject('Word.Application');
      MsWord.Visible := True;
    except
      Exception.Create('Error');
    end;
  end;
  MSWord.Documents.Add;
 {Это текст }
  MSWord.Selection.Font.Size := 12;
  MSWord.Selection.TypeText('Текст');
 {А это формула}
  wdField := MSWord.Fields.Add(MSWord.Application.Selection.Range, wdFieldEmpty,'eq x\s\do8(2)=\f(-b+\r(D);2a)', False);
end;
Помогите понять, что я делаю не так.

Добавлено через 1 час 36 минут
Вопрос снят. Разобрался.
0
23.12.2016, 23:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2016, 23:20

Регулярные выражения. Как вот такой код с php перевести на Delphi!?
$file = preg_match_all("|<tr><td class='time'>(.*)</tr>|U",$file,$frazes); ...

Макрос в Delphi реально ли?!
Вот собственно у меня есть макрос для мышки X7 Вот так он выглядит в Editor'e:...

Возможно ли как-то перевести unit C++ в unit delphi
Возможно ли как-то перевести unit C++ в unit delphi?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru