Word VBA

21 отговора 478 прегледа
#1

Word VBA

Търся помощ от човек който се е занимавал с темата. Целта е да се подаде на уорда информация чрез Automation, да се форматира, и да се отпечата. Информацията се подава от друго MFC бездокументо приложение.
Приемаме, че съм наясно с аутото, но ми трябва някой да ме насочи кои точно класове и методи трябва да използвам за поставената задача, защото нямам никакво намерение да уча Worr VBA!
Ако пък някой има по-добра идея, винаги съм отворен за предложения!

Отговор
в отговор на Шkeмбe #2

Re: Word VBA

Щом си отворен... Ето и алгоритъма:
1) Отваряш Word и стартираш запис на макрос
2) Извършваш квото ти трябва
3) Спираш макроса и му гледаш кода
4) Прехвърляш кода в твоята програма
Този алгоритъм действа безупречно в VB и Delphi. За Ц плюс-пляс не съм опитвал.

чети и дишай по-леко
Отговор
в отговор на Шkeмбe #3

Re: Word VBA

Значи...
В Word има два класа: Range и Selection. Първия представлява кой да е участък от текста, втория - текущо селектирания текст. В определни случаи са еквивалентни като функционалност, но според MSDN е по-добре да се използва Range.
И двата класа има пропърти Font - можеш да го използваш за форматиране на шрифта (включително големина, цвят, подчертаваници и т.н.). За форматиране на параграфите (разстояния м/у тях, разстояния м/у редовете, общо взето всичко, което го има в диалога за Pragraph Format) и двата класа имат пропърти Paragraphs, което пък си има пропърти Format.

За отпечатване можеш да ползваш класа Document и по-специално неговия метод PrintOut.

Общо взето работата с Word протича така:
1. Взимаш си Application обекта. Той е на върха на йерархията.
2. От него получаваш документа, който ти трябва (от клас Document). За целта използваш или ActiveDocument пропъртито (за текущия документ), или колекцията Documents (индексира се по име на файла).
3. От Application или Document обекта си взимаш Range или Selection. Ако решиш да работиш със Selection, трябва да си сигурен, че точно твоя документ е активен - ползваш метод Activate на Document обекта.
4. Оттам нататък с Range-a си правиш, каквото ти душа иска.

стой та гледай
Отговор
в отговор на lndependent #4

Re: Word VBA

Чудесно! А как мога да вкарам в Range-a текст?. Че като го погледнах тоя контролерен клас направо ми се стъжни!
И как да създам рейндж обект в документа? Същото важи и за параграфите!

Отговор
в отговор на lndependent #5

Re: Word VBA

И къде в MSDN-a успя да откриеш това? За да не ти губя времето...

Отговор
в отговор на Шkeмбe #6

Re: Word VBA

1) Range.Text
2) Не можеш да създаваш Range, а само да го взимаш. Document си има метод Range - оттам. Или от Selection.Range.
3) Не питай за параграфите, защото с тях ми се беше взело здравето. Аз ги слагах, като към рейнджа добавях chr(10) :-). Иначе Document си има колекция Paragraphs, но нейния Add метод нещо не ми работеше като хората.

стой та гледай
Отговор
в отговор на Шkeмбe #7

Re: Word VBA

Ох, не питай
Щях да откача, докато разбера кое как. Предимно с много ровене. Предполагам, че ако търсиш "Application" в крайна сметка ще успееш да разплетеш кълбото.

стой та гледай
Отговор
в отговор на lndependent #8

Re: Word VBA

Ako moga da dobawq moq skromen opit kym WORD-a
na men mi trqbwashe da merge-wam nqkolko dokumenta w edin...
i...mnogo hubawo raboteshtata w menuto opciq merge si bachka kato slynce ama kato izwikash metoda - tz :(
taka che proweri koi function-i rabotqt i koi kak tochno rabotqt shtoto mai ne e sywsem triwialno :( t.e. da wiknesh function-a i hop - gotowo...
az se naloji da selectwam wseki now dokument i da go paste-wam w kraq na edin now zaradi towa che merge wryshtashe - "not implemented yet"

-------------------------------
Koito go moje - go moje!
Отговор
в отговор на Шkeмбe #9

Re: Word VBA

Word- си има собствен VBA help. Инсталирай си го и погледни там - по-удобно е от MSDN, щото е описан само VBA и тук-таме даже има и примери.

My blade can cut through armor, and still cut a tomato
Отговор
в отговор на Mobile #10

Re: Word VBA

Изобщо не е тривиално, мога да кажа само.
Имам щастието (или по-скоро нещастието) да се занимавам с WORD VBA от доста време. И мога да кажа само, че с прочитане на VBA help-а към Word-а или на MSDN-а нищо не става.
И това с "not implemented yet" е бял кахър, защото има много "implemented" методи и свойства, които или изобщо не работят или не правят това за което са описани, или се получават много странни неща.
Пример: великият Range обект - когато селектираш една колона на таблица вертикално, Selection.Range връща доста по различна област от това, което си селектирал. Или пък Row обекта - при мерджване на две полета вертикално си е просто "Out of services". А за Outlined Numbering да не говорим.
А прилагането на повече от един път ApplyListTemplate метода има доста странно действие. Но според MSDN-а това не е проблем. Просто този метод трябва да се прилага от края към началото на файла. Супер.
А пък за Footer и Header да не говорим.
Моят съвет към "Шкембе" -то е - "Не ти трябва да се занимаваш с обектният модел на Word. Ако все пак ти се налага, по-добре наеми някой, който си е блъскал главата дълго и е спал по Майкрософтските форуми с надеждата Джон МакДжи да му отговори, какво да прави (и добре, че човека отговаря) . Ето гледам, че има хора като Independant или Mobile, които са вътре в нещата.

Отговор
в отговор на пpoГЪPMИcт #11

Re: Word VBA

Това с ВБ хелпа е меко казано е*ана работа. Освен това нямам никакво намерение да пиша каквото и да било на ВБА. Целта е да науча какво е необходимо за да вмъкна текст през ОЛЕ-то на уорда ( контролерните класове и методи ) , да го форматирам, запиша и принтна!

Отговор
в отговор на Lupi #12

Re: Word VBA

Идеята си я биваше...но това беше още преди първия постинг тука! Загубих два часа в MSDN-a и още 3 в VBA хелпа на уорда! Резултата беше буквално никакъв. Щото на мен ВБ-то нищо ама нищо не ми говори!

Отговор
в отговор на lndependent #13

Re: Word VBA

Мамка му! А нов документ каксе създава да го е*а!

Отговор
в отговор на Шkeмбe #14

Re: Word VBA

Прекаляваш...
Application.Documents.Add

стой та гледай
Отговор
в отговор на lndependent #15

Re: Word VBA

Да,да... Това го захапах, ама със закъснение!

Обаче определено говорим на различни езици! В крайна сметка ей ви малко код а някой ако може да ме светне защо уорда плюе изключение на реда дето пише rangeObj.InsertBefore...?

_Application app;
if(!app.CreateDispatch("Word.Application") )
AfxMessageBox("Не е то името на класа!");
else
{
//AfxMessageBox("Бах мааму! Трябва да си пусна тото!");
Documents docsObj ( app.GetDocuments() );
_Document docObj;
docObj.AttachDispatch(docsObj.Add( (COleVariant)"Normal.dot", COleVariant( (short) FALSE ), COleVariant( (short) FALSE ), COleVariant( (short) FALSE ) ));
Range rangeObj( docObj.Range( COleVariant( (short) 0 ), COleVariant( (short) 0 ) ) );
//rangeObj.InsertParagraph();
rangeObj.InsertBefore("Това трябва да се вмъкне в Word-а");
app.SetVisible( true );
AfxMessageBox("Дали ще го убие?");
}


A? Идеи? Кво иска толкова ши*ания интерфейс?

Отговор
в отговор на Шkeмбe #16

Re: Word VBA

A na bas che ne ti e validen RangeObj
I koqto i function da izwikash kym nego sha grymne

May the beer be with you

-------------------------------
Koito go moje - go moje!
Отговор
в отговор на Mobile #17

Re: Word VBA

Narochno go prawim po-trudno za da se nauchish
Haide wzemi da probwash malko powechko i da chetesh oshte powechko predi da zadawash wyprosi oshte
Qsno e che weche si razbral principa - sega hodi go razbii...w stenata

-------------------------------
Koito go moje - go moje!
Отговор
в отговор на Mobile #18

Re: Word VBA

Добър опит ама не позна! rangeObj.InsertParagraph() бачка безотказно!
Ама инъсърт бифор или афтър тц. Плюе на поразия!
Защо си мислиш, че рейнджа не е валиден?

Отговор
в отговор на Шkeмбe #19

Re: Word VBA

Така!
Това трябва да е бъг в Уорда! Нямам стара версия да го пробвам! Или някой от М$ е спал като е писал!
COM-а плюе изкючение защото, представете си ап обекта е скрит. Т.е в скрит прозорец на обекта мога да блъскам параграфи, но не мога да вмъкна текст. В понеделник ще пробвам да форматирам...пък да видим.
Ако имате друго обяснение на подобна простотия - моля да я споделите с моя милост.

Отговор
в отговор на Шkeмбe #20

Re: Word VBA

Наистина имаше някаква простотия с прозорците. На нас ни се наложи да покажем на екрана един временен документ, иначе не щеше да върви.
Общо взето идеята беше да се пише във временен документ, после с copy-paste в таргета и готово. Обаче ако го създавахме документа като invisible, нещо се инатеше.

стой та гледай
Отговор