Форум » [x]Harbour » шаблон Microsoft Word » Ответить

шаблон Microsoft Word

Новичок: Кто подскажет (и покажет) - требуется использовать шаблон Word (взаимодействие - подготовка, открытие, передача параметров и т.д.), то есть требуется подготовить определенный шаблон Word, передать параметры с программы, сохранить в формате docx в определенном месте или направить на печать.

Ответов - 103, стр: 1 2 3 4 5 6 All

Dima: Вероятно все действия проделать в WORD с записью в макрос а затем пробовать все повторить в Harbour используя текст макроса.

Новичок: спс но... данный вариант я итак использую... - то есть я в программе создаю весь документ Word, а при изменении текста в Word, соответственно приходится изменять исходный код в программе. - хотелось бы использовать шаблон Word, чтобы при изменении текста в документе - пользователям и мне достаточно было изменить этот шаблон не изменяя исходный код программы И во-вторых, в дальнейшем мне было бы достаточно предоставить =Справочник выходных переменных=, с помощью которого пользователи могли бы создавать свои любые отчеты, документы - просто создав шаблон, указав переменные и установив в определенную директорию моей программы.

Dima: Так сразу и храни эти переменные в шаблоне. Затем его грузим , поиск и замена переменных по тексту из справочника. И все. Например шаблон: Директор [value1] Бухгалтер [blabla] В справочнике есть value1 и есть на что ее заменять , как и blabla.


SadStar3333: если я правильно понял проблему то возможно подойдет мое решение (о котором я уже здесь упоминал) 1. Нужные места в документе ворд помечаю именами. В 2003-м - Меню/Вставка/Закладка 2. в программе делаю так [pre2] .... aAdd(aBookMarks, {"Team", s}) aAdd(aBookMarks, {"Sign3", wMain.txt_Manager3.Value}) aAdd(aBookMarks, {"Sign4", wMain.txt_Manager4.Value}) aAdd(aBookMarks, {"Sign2", wMain.txt_Manager2.Value}) If oResDoc:Bookmarks:Count > 0 BkMrk:="" For Each BkMrk In oResDoc:Bookmarks bmName:=BkMrk:Name if (n:=AScan( aBookMarks, {|x| x[ 1 ] == bmName} ))>0 //BkMrk:Range := BkMrk:Name BkMrk:Range := aBookMarks[n,2] endif Next //BkMrk EndIf [/pre2]

Dima: SadStar3333 пишет: то возможно подойдет мое решение Да тоже нормальный вариант !

Andrey: Думал что не буду пользоваться таблицами Ворда. А не получилось, нужно делать.... Подскажите решение (может кто поделиться функциями) как сделать из шаблона таблицы Ворда: как найти в тексте таблицу, как сделать добавление столбца и вставку данных из базы ? Хочу использовать простой шаблон, типа:

Pasha: Если поставить закладку внутри таблицы, то найти ее можно так: oSelect:Goto(-1,,, <BookmarkName>) Вставить столбец в таблицу в указанном месте можно вызовами методов: oSelect:InsertColumns() или oSelect:InsertColumnsRight() Вставить текст: oSelect:TypeText(<text>) Перемещение между ячейками таблицы: oSelect:MoveRight(1, 1) аналогично есть методы MoveLeft, MoveUp, MoveDown, и еще несколько Move*

Andrey: Pasha пишет: Если поставить закладку внутри таблицы, то найти ее можно так: Спасибо БОЛЬШОЕ !

Andrey: Всем привет ! Вопрос возник по ходу решения поиск/замена выражения в Ворде. Не хочу делать закладку, уже имел печальный опыт, юзера при правке шаблона стирают закладки. Если будет стоять текст другого цвета (у меня в шаблоне синий) то они этот текст не трогают. Сделал макрос поиск/замена всех строк:[pre2] Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "#M->Date1" .Replacement.Text = "01/01/2016" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll[/pre2] Как его перевести на Харбор ? Помогите пожалуйста, уже лет 5 не занимался этим.

Pasha: Вместо точки ставить двоеточие После вызова метода ставить скобки Так: oFind := oSelec:Find oFind:ClearFormatting() oFind:Replacement:ClearFormatting() oFind:Text := "#M->Date1" oFind:Replacement:Text := "01/01/2016" oFind:Forward := .T. oFind:Wrap := 1 и так далее в конце oFind:Execute(,,,,,,,,,, 2) справку по методам смотреть в файле VBAWD10.CHM Из этого файла: Runs the specified find operation. Returns True if the find operation is successful. Boolean. expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace, MatchKashida, MatchDiacritics, MatchAlefHamza, MatchControl) видно, что Replace - это 11-й параметр метода Execute. В таком порядке и надо передавать значения ну и подставлять значения констант wd* поправил опечатки

Andrey: Pasha СПАСИБО БОЛЬШОЕ !!! Пошёл делать...

Andrey: Сразу большая непонятка. Открываю Ворд так: [pre2] oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFileDoc ) oActive := oWord:ActiveDocument oSelect := oWord:Selection [/pre2] oFind: нужно менять на что ? Не пойму где здесь работа с oFind И ещё вопрос, если есть #include "word.ch" можно же не менять значения констант wd* ?

Dima: Andrey Попробуй вариант с созданием таблицы в EXCEL и после просто скопируй ее и вставь в WORD , должно сработать , да и гимора меньше мне кажется. PS Проверил в рукопашную , работает на ура

Andrey: Dima пишет: Попробуй вариант с созданием таблицы в EXCEL и после просто скопируй ее и вставь в WORD , должно сработать , да и гимора меньше мне кажется. Не пойдёт. Нужно пример сделать для учёбы. Чтобы потом любой желающий к себе в прогу забирал. Пример работы с EXCEL я сделал ( с вашей помощью). Теперь нужно так же с Вордом сделать. У меня есть вставка/замена через rtf файл, есть с закладками. Но это не то. Этот пример гибче будет. Да и работы с таблицами в Ворде так и не нашёл нигде. Будем биться с Вордом !

Dima: Andrey пишет: Будем биться с Вордом ! Удачи !

Andrey: Вот здесь есть похожее решение. http://clipper.borda.ru/?1-4-0-00001048-000-0-0-1426699788 С помощью Паши и Haz - поиск/замена заработала !

Andrey: Как получить хендл открытого Вордом окна ? Для Экселя знаю как получить: [pre2] // окно таблицы Excel на передний план hWnd := oExcel:hWnd ShowWindow( hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop( hWnd ) [/pre2] Для Ворда не срабатывает... hWnd := oWord:hWnd Выдаёт ошибку: Error Word.Application/0 S_OK: HWND</p> Called from TOLEAUTO:HWND(0) Called from MYWORD2OLE(56)

Петр: Если для Excel expression .Hwnd expression A variable that represents an Application object. то в Word expression .Hwnd expression A variable that represents a Window object. Поэтому, должно сработать что-то типа hWnd := oWord:ActiveDocument:ActiveWindow:Hwnd или oWord:Windows("Document1"):Hwnd ShowWindow( hWnd, 3 ).. можно заменить на :Windows("Document1"):Activate :Windows("Document1"):WindowState := wdWindowStateMaximize

Andrey: Петр пишет: oWord:Windows("Document1"):Hwnd Не работает ! Причём у меня Русский MS Word и всегда создаётся "Документ2", у юзеров тоже может быть по другому. Вот и не хочется делать перебор разных вариантов: [pre2] cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) hWnd2 := FindWindowEx(,,, cTitle2 ) [/pre2] А получить хенд созданного ворд-документа: oWord:Documents:Add() oActive := oWord:ActiveDocument() oMarks := oActive:BookMarks oText := oWord:Selection() Как это сделать ?

Петр: Andrey пишет: Не работает ! Да, действительно, хотя по документации должно бы работать. Andrey пишет: А получить хенд созданного ворд-документа: oWord:Documents:Add() oActive := oWord:ActiveDocument() Пробуйте так oWord:Documents:Add() oActive := oWord:ActiveDocument() cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle )

Andrey: Петр пишет: oWord:Documents:Add() oActive := oWord:ActiveDocument() cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) Не пашет ! Додумался до следующего: [pre2] cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) ? cTitle, hWnd cTitle += " - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) ? cTitle, hWnd [/pre2] Результат такой: [pre2]Документ1 0 Документ1 - MICROSOFT WORD 396408 [/pre2] Как быть с таким окном Ворда (у юзеров периодически попадают) ? cTitle := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD"

Петр: Andrey пишет: Додумался до следующего: Нет универсальности, лучше сначала использовать коллекцию Documents, а потом Windows [pre2] cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) IF hWnd == 0 cTitle := oWord:Windows(1):Caption hWnd := FindWindowEx(,,, cTitle ) ENDIF[/pre2] если нет уверенности, сколько окон открыто в Ворде, а нужно последнее nCount := oWord:Windows:Count cTitle := oWord:Windows(nCount ):Caption или перебор можно сделать [pre2] cTitle := oActive:Name FOR nI := 1 TO nCount IF cTitle $ oWord:Windows(nI):Caption .. [/pre2] В отличие от коллекции Documents, в коллекцию Windows попадут и служебные окна (диалоги) Word, имейте ввиду. В общем выход есть - пробуйте, и не ждите готового ответа.

Andrey: Петр пишет: В отличие от коллекции Documents, в коллекцию Windows попадут и служебные окна (диалоги) Word, имейте ввиду. Что-то не работает: nCount := oWord:Windows:Count ? nCount ? oWord:Windows(1):Caption Выдает 1 и вылет с ошибкой на следующем операторе: Error Word.Application/0 S_OK: WINDOWS Called from TOLEAUTO:WINDOWS(0) Called from MYWORD1OLE(83) Хотя по Менеджеру памяти 5 скрытых процесса Ворд висят....

PSP: Andrey Может ЭТО поможет?

Andrey: PSP пишет: Может ЭТО поможет? Не, не понимаю... Уже совсем заработался... Достали эти окна...

Петр: Andrey пишет: Выдает 1 и вылет с ошибкой на следующем операторе: Error Word.Application/0 S_OK: WINDOWS Called from TOLEAUTO:WINDOWS(0) Called from MYWORD1OLE(83) Замените библиотеку hbole на hbwin.

Andrey: Петр пишет: Замените библиотеку hbole на hbwin. Поменял местами библиотеки, совсем избавиться не могу, т.е. проверка на наличие ВОРДА - требуется hbole. Сразу не работает код: [pre2] oWord := TOleAuto():NEW( "Word.Application" ) IF Ole2TxtError() != 'S_OK' MsgStop( "На этом компьютере MS Word не установлен !" , "Ошибка!" ) RETURN .F. ENDIF [/pre2] Если убрать выход, то ошибка пропадает, код этот работает: [pre2] nCount := oWord:Windows:Count ? nCount ? "Caption=",oWord:Windows(1):Caption [/pre2] Но результат всё равно не верен: 1 Caption= Документ5 Хотя 7 штук скрытых WORD сидят в памяти. Опять перебора не получается...

Петр: Andrey пишет: проверка на наличие ВОРДА - требуется hbole Да вы что, [pre2] IF ( oWord := win_oleCreateObject( "Word.Application" ) ) != NIL oWord:Documents:Add() .. ELSE ? "Error. MS Word not available.", win_oleErrorText() ENDIF [/pre2] Я вас не понимаю, что значит поменял библиотеки местами - просто используйте hbwin вместо hbole! ВСЕ! Что значит убрать выход? При чем здесь скрытые Word в памяти - что вы от них хотите? Что значит верно - не верно? Это согласно документации или вашим ожиданиям? Если вы хотите бороться с Word - боритесь. Если хотите, что бы кто-то помог - приведите полноценный фрагмент кода, в котором вы сомневаетесь, укажите, что и как используете и т.д.

Dima: Петр пишет: IF ( oWord := win_oleCreateObject( "Word.Application" ) ) != NIL А не лучше ли так ? IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == "O" PS Я про Valtype забыл , нужно его туда прицепить

Andrey: Петр пишет: Я вас не понимаю, что значит поменял библиотеки местами - просто используйте hbwin вместо hbole! ВСЕ! Убрал воообще hbole. На экране 3 открытых вордовых документов. Ещё один WORD скрытый процесс. Вот полноценный фрагмент кода: [pre2] oWord := TOleAuto():NEW( "Word.Application" ) oWord:Documents:Add() oActive := oWord:ActiveDocument() oText := oWord:Selection() oWord:ActiveDocument:PageSetup:Orientation := wdOrientLandscape oWord:ActiveDocument:PageSetup:LeftMargin := 72.0 //~2.5 см ....// построение таблицы и т.д. nCount := oWord:Windows:Count ? nCount[/pre2] Выдает 1. Почему ?

Dima: Andrey пишет: Вот полноценный фрагмент кода: nCount := oWord:Windows:Count ? nCount Начни с самого начала , где создается объект

Петр: Andrey пишет: Вот полноценный фрагмент кода: nCount := oWord:Windows:Count ? nCount Полноценный - так полноценный.. Вы каким-то образом создали экземпляр OLE обьекта Дальше, наверное, вы создали новый документ добавив его в коллекцию Documents oWord:Documents:Add() При этом, поскольку документы Word живут в Window, добавился также обьект в коллекцию Windows (заметим, что 1 обьект!) Поэтому oWord:Windows:Count вернет 1 Если вызвать oWord:Documents:Add() oWord:Documents:Add() получим 2 и т.д. Все ваши действия относятся к конкретному OLE экземпляру, а не к процессам в памяти или чему вы там решили.

Петр: Dima пишет: А не лучше ли так ? IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == "O" win_oleCreateObject в случае неуспеха вернет NIL, когда-то это активно обсуждалось разработчиками. На том и порешили

Петр: Andrey пишет: Убрал воообще hbole. На экране 3 открытых вордовых документов. Ещё один WORD скрытый процесс. Вот полноценный фрагмент кода: oWord := TOleAuto():NEW( "Word.Application" ) Класс TOleAuto определен в библиотеке hbole. Что вы там делаете не знаю, но часть ваших слов вызывает определенные сомнения.

Andrey: Петр пишет: Все ваши действия относятся к конкретному OLE экземпляру, а не к процессам в памяти или чему вы там решили. А я решил что это относиться к процессам в памяти. Вопрос был изначален - как узнать хендл окна Worda с открытым документом, чтобы его на экран впереди всех задач вынести. В противном случае он остается после МиниГуи задачи.

Dima: Andrey А ты пробовал вообще , то что Петр советовал ? Использовать для создания объекта Word , win_oleCREATEOBJECT , ну а далее то что он предлагал.

Петр: Andrey пишет: Вопрос был изначален - как узнать хендл окна Worda с открытым документом, чтобы его на экран впереди всех задач вынести. Вы сами дали на него ответ - FindWindowEx В чем затык?

Andrey: Dima пишет: А ты пробовал вообще , то что Петр советовал ? Использовать для создания объекта Word , win_oleCREATEOBJECT , ну а далее то что он предлагал. Пробовал. Разница в одном операторе, который мне не нужен. Мне нужен хендл открытого документа, который я сам создал. Петр пишет: Вы сами дали на него ответ - FindWindowEx В чем затык? Это моё временное решение. Нужно добавлять к названию документа такую штуку: cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" А для английской версии Ворда что нужно добавлять ? Вот и озадачился я сделать как в Excel'е - он же сразу правильно выдаёт хендл созданного окна.

Петр: Andrey пишет: Это моё временное решение. И опять позвольте усомниться в ваших словах Andrey пишет: Нужно добавлять к названию документа такую штуку: cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" А для английской версии Ворда что нужно добавлять ? Нужно добавлять ТАКУЮ штуку cTitle := oWord:ActiveDocument():Name + "-" + oWord:Caption или nIndex := 1 cTitle := oWord:Windows(nIndex):Caption + "-" + oWord:Caption И еще раз: hbole старая версия OLE из hbwin, в ней больше ошибок, в частности не исправлена работа с коллекциями по индексу. А значит вы не можете использовать циклы по коллекциям. Но, по моему, это вас и не интересует.

Andrey: Петр пишет: Но, по моему, это вас и не интересует. Интересует. Понял что hbwin лучше ! А хендл окна сразу можно получить, без FindWindowEx() ?

Pasha: Что-то не работает: nCount := oWord:Windows:Count ? nCount ? oWord:Windows(1):Caption К элементу коллекции надо обращаться не через круглые скобки, это же не метод, а через квадратные, т.е: oWord:Windows[1] Свойство Caption объекта Window r/w, т.е ему можно присвоить что хочется, без головняка с получением хэндла окна: oWord:Windows[1]:Caption := "blabla.." дополню: с экселем заголовок окна можно также изменить стандартным способом. вот пример из хэлпа по vba: ActiveWorkbook.Windows(1).Caption = "Consolidated Balance Sheet"

Pasha: По поводу примеров работы с таблицами word из fw: в том разделе это не по теме, напишу здесь Андрей, я тебе дал пример заполнения таблицы. Если ты не хочешь использовать закладки, то надо только заменить начальное позиционирование на 1-й элемент таблицы вместо oSelect:Goto(-1, ... поставить <table>:Cells(nR, nC):Range:Select() и оставить последующий код без изменений

Andrey: Pasha пишет: Андрей, я тебе дал пример заполнения таблицы. Если ты не хочешь использовать закладки, то надо только заменить начальное позиционирование на 1-й элемент таблицы А я никак сделать его под себя не могу... Пошёл переделывать. Pasha пишет: Свойство Caption объекта Window r/w, т.е ему можно присвоить что хочется, без головняка с получением хэндла окна: Мне нужен хенд окна, для того чтобы переместить это окно поверх всех окон. Чтобы юзер не искал на рабочем столе созданный документ. С Экселем получилось, с Вордом нет !

Dima: Andrey пишет: С Экселем получилось, с Вордом нет ! Вероятно так Hwnd:=oWord:Windows[1]:hwnd

Andrey: Pasha получилось ! Заработало.... Спасибо огромное !

Andrey: Dima пишет: Вероятно так Hwnd:=oWord:Windows[1]:hwnd Ошибка: Error 3277332/0 S_OK: HWND Called from TOLEAUTO:HWND(0) Called from MYWORD2OLE(105)

Dima: Andrey А так Hwnd:=oWord:Windows:hwnd

Pasha: Свойство hWnd присутствует у объекта Window, а не у коллекции Windows, что логично. По-видимому, в ранних версиях офиса его нет, поэтому и происходит ошибка.

Andrey: Dima пишет: Hwnd:=oWord:Windows:hwnd Ошибка ! Pasha пишет: Свойство hWnd присутствует у объекта Window, а не у коллекции Windows, что логично. По-видимому, в ранних версиях офиса его нет, поэтому и происходит ошибка. А как правильно узнать хенл окна у современных версиях офиса ? Чтобы точно работало !

Pasha: В Office 2010 свойство hWnd у объекта Window еще отсутствует. В Office 2013, судя по доке, уже есть. А как узнать хендл - ну так и узнать, обратиться к свойству hWnd, если версия office выше, чем 2013

Pasha: Насчет hWnd так и есть: Window.Hwnd Property (Word) Returns a Long that indicates the window handle of the specified window. Read-only. Collapse sectionVersion information Version Added: Word 2013 т.е, обращаться к нему можно, если oWord:Version больше чем значение (определенная константа) для office 2013

Andrey: Понял. Пока писал, уже сделал. Word 2014 выдает правильно и по ошибке не слетает... hWnd := oWord:ActiveDocument:ActiveWindow:Hwnd Спасибо, понял в чем моя ошибка - искал там, где нет. У меня у юзеров еще 2003 офисы стоят...

Dima: Вообще не много странно. В Excel 2003 можно поймать хендл окна Excel по Excel:Hwnd а в той же версии Word уже нет.

Pasha: Странно и то, что в Excel 2003 свойство hWnd есть у объекта Application, а не у Window. Может так оказаться, что это хендл не того окна, которое нужно. В Excel 2013 свойство hWnd добавили и у Window.

Dima: Pasha пишет: Может так оказаться, что это хендл не того окна, которое нужно. Пока ни кто не жаловался , и промахов не было В основном у юзеров стоит 2003 офис.

Andrey: Dima пишет: В основном у юзеров стоит 2003 офис. А как делаешь ?

Dima: Andrey пишет: А как делаешь ? чито ?

Andrey: Хендл окна поймал. Вывожу на передний план так: ShowWindow( hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop( hWnd ) MsgDebug(hWnd) Не выводится... Фар всё равно на переднем плане... Как правильно поместить окно Word поверх всех окон ?

Dima: Andrey Для Excel так , норм вроде [pre2] Func Showexcel(ex) local hWnd hWnd := Ex:hWnd ShowWindow(hWnd, 3) BringWindowToTop(hWnd) return nil [/pre2]

Andrey: Dima пишет: Для Excel так , норм вроде Да у меня с ним тоже в порядке, а с Вордом проблема.... Делаю так: [pre2]ShowWindow( hWnd, 6 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 INKEYGUI(800) ShowWindow( hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop( hWnd ) MsgDebug(hWnd) [/pre2] Окно Ворда исчезает, а потом появляется. Но окно Проводника или Фара не перекрывают, почему то Ворд на заднем плане.

Dima: Возможно не тот хендл поймал у Word

Andrey: Dima пишет: Возможно не тот хендл поймал у Word Нет, то окно. Окно Ворда исчезает, а потом появляется. Разобрался.Нужно ставить задержку. Потом желающие смогут проверить у себя.

Andrey: Остался ещё один вопрос: Как сделать в таблице авто суммирование столбца ? Т.е. я в конце таблицы добавляю колонку и хочу сделать в ней сумму столбца. Хотя можно и самому в цикле посчитать, но лучше сделать как положено. oTbl:Cell(nRowDbf,2):Range:ParagraphFormat:Alignment:= wdAlignParagraphRight oTbl:Cell(nRowDbf,2):Range:Font:Bold = .T. // ------------ как сделать автосумирование колонки ??? //oTbl:Cell(nRowDbf,2):Range:InsertFormula := "=Sum()"

Dima: SUM (ABOVE) ЗЫ Всегда можно спросить гугл

Andrey: Dima пишет: Всегда можно спросить гугл Не всегда... Не получается вставит формулу. По макросу так: [pre2]Selection.InsertFormula Formula:="=SUM(ABOVE)", NumberFormat:="# ##0,00"[/pre2] А как оператором написать формулу и формат ? [pre2]oTbl:Cell(nRowDbf,2):Range:InsertFormula????? := "=Sum(ABOVE)"[/pre2] Перебрал несколько вариантов. Так не работает: [pre2] oTbl:Cell(nRowDbf,3):Range:InsertFormula:Formula := "=Sum(ABOVE)" - ошибка oTbl:Cell(nRowDbf,3):Range:InsertFormula := "=Sum(ABOVE)" - ошибка oTbl:Cell(nRowDbf,3):Range:Formula := "=Sum(ABOVE)" - ошибка [/pre2]

Dima: Andrey пишет: Не получается вставит формулу. Подсмотри как это делается в Excel , делал же наверное уже.

Andrey: Dima пишет: Подсмотри как это делается в Excel , делал же наверное уже. Вот так: [pre2]oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0,00' ) // числовая ячейка и oSheet:Cells[ nI, nRowXls + 1 ] := "=СУММ(R[-" + HB_NtoS(nRowXls + 1 - nLine) + "]C:R[-1]C)" [/pre2]

Петр: Andrey пишет: По макросу так: Selection.InsertFormula Formula:="=SUM(ABOVE)", NumberFormat:="# ##0,00" Selection:InsertFormula( "=SUM(ABOVE)", "# ##0,00" )

Dima: Andrey пишет: Хотя можно и самому в цикле посчитать, но лучше сделать как положено. Я делаю в цикле , ведь это же отчет по реальным цифрам а иначе это будет подгонка нужного результата.

Andrey: Петр пишет: Selection:InsertFormula( "=SUM(ABOVE)", "# ##0,00" ) Сделал так: [pre2] oTbl:Cell(nRowDbf,3):Range:Select() // перейти и выделить ячейку таблицы Selection:InsertFormula( "=SUM(ABOVE)", "# ##0,00" ) [/pre2] Не проходит... Выдаёт ошибку: Error BASE/1003 Переменная не существует: SELECTION Called from MYWORD1OLE(148)

Andrey: Уф... Сделал ... Надо так: [pre2] oText := oWord:Selection() .... // ---------- сделать автосуммирование колонки ----------- FOR nI := 3 TO 7 oTbl:Cell(nRowDbf,nI):Range:Select() // перейти и выделить ячейку таблицы oText:InsertFormula( "=SUM(ABOVE)", "# ##0,00" ) NEXT[/pre2]

Pasha: Оставлю здесь ссылку на Office 2013 VBA Documentation в формате chm: http://www.microsoft.com/en-us/download/details.aspx%3Fid%3D40326

Andrey: По просьбе желающих выложил готовые примеры у Григория на сайте - http://hmgextended.com/applications.html Преобразование DBF в DOC через объект ОЛЕ в МиниГуи / Convert DBF to DOC via the OLE object in MiniGui Преобразование DBF в XLS через объект ОЛЕ в МиниГуи / Convert DBF to XLS via the OLE object in MiniGui

ММК: Andrey пишет: Преобразование DBF в DOC Преобразование DBF в XLS Вам бы надо было все это в TsBrows вклюючить. И добавить преобразование DBF в PDF

Andrey: ММК пишет: Вам бы надо было все это в TsBrows вклюючить. Это только Григорий может.... ММК пишет: И добавить преобразование DBF в PDF Я не делал такого. Может присоединишься ? Сейчас делаю: DBF_to_PostgreSQL

ММК: Andrey пишет: Я не делал такого. Может присоединишься ? Сейчас делаю: DBF_to_PostgreSQL Понимаете Андрей , когда Вам нужна помощь при разработке какой-то задачи - понимаю. Но зачем заниматься Минигуи если все это есть в FW ? Какой смысл? :)

Andrey: ММК пишет: Но зачем заниматься Минигуи если все это есть в FW ? Какой смысл? Не нашел я что-то вариант DBF в DOC в FW... DBF в PostgreSQL тоже нет в FW... Или есть ? На МиниГуи это уже работает, правда привыкнуть надо к PostgreSQL. FW платный продукт, покупать нужно, осваивать тоже нужно... А МиниГуи бесплатен, правда время много потратил на освоение, но чтобы уходить на другую платформу тоже придётся тратить время. Да и подсказки Григория, и других форумчан тоже много дают. На МиниГуи классные примеры получаются... Да и с терминалки мигрировать в МиниГуи возможно, чем и занимаюсь. FW тоже хороший продукт, смотрел в своё время, но подкупил МиниГуи с русскоязычной поддержкой.

Pasha: Как-то здесь все в кучу намешано. Есть харбор с библиотекой hbwin, которая позволяет выгружать документы в word/excel посредством механизма ole. Пример использования этого механизма можно сделать с использованием интерфейса хоть fw/hmg/hwgui, хоть консольного. Консольный пример даже будет предпочтительнее, так как в нем не будет ничего лишнего. Надо выдать на экран какое-то окно с кнопочкой, вот и вся функция fw или hmg Окно с кнопочкой можно сделать красивым, но эта красота никак не связана с выгрузкой таблицы в word. Вот если для класса tsbrowse hmg добавить метод выгрузки в word аналогично методу ExcelOle, тогда это станет частью hmg, и можно будет говорить и примере его использования в hmg. Тоже самое касается и конвертации в pdf или postgres.

Andrey: Спасибо Pasha - всё по полочкам поставил ! Осталось только сделать - Консольный пример или для класса tsbrowse hmg добавить метод выгрузки в word аналогично методу ExcelOle.

Dima: Andrey пишет: Осталось только сделать - Консольный пример А я сразу и писал про консоль ))

Andrey: Всем привет ! Для центровки строки в таблице по горизонтали использую так: [pre2] oTbl:Cell(nI,nJ):Range:ParagraphFormat:Alignment:= wdAlignParagraphCenter [/pre2] А как сделать центровку строки по вертикали ? Пробовал так - oTbl:Cell(nI,nJ):Range:VerticalAlignment := wdCellAlignVerticalCenter - не работает....

Andrey: Нашёл как: // ветикальная ценровка строки в ячейке oTbl:Cell(nI,nJ):Cells:VerticalAlignment := wdCellAlignVerticalCenter

Andrey: Печатаю в Ворде 2010 таблицу из 400 записей... Простая таблица 5 граф: ФИО, номер документа, дата документа, ну и ещё 2 номера. Сдыхает Ворд, и закрывается программа, таблицу не доделывает... Пишет что слишком много ошибок при проверки правописания... Как программно отключить проверку правописания в Ворде ?

Dima: wdApp.Options.CheckSpellingAsYouType = False

ММК: Уже достаточно давно пользуюсь вот таким классом - https://cloud.mail.ru/public/8Xve/UTv9YCg65/RTFTEKST.7z Здесь исходники и примеры. Написан для FW поэтому подойдет для минигуи. Удобно и просто формировать отчеты, на выходя файл RTF что позволяет не заморачиваться версией офиса.

Andrey: Dima пишет: wdApp.Options.CheckSpellingAsYouType = False А как для Харбора это сделать ?

Dima: Andrey пишет: А как для Харбора это сделать ? А поиграться... oWord:Options:CheckSpellingAsYouType:= .F.

ММК: Andrey пишет: Осталось только сделать - Консольный пример или для класса tsbrowse hmg добавить метод выгрузки в word аналогично методу ExcelOle. Совершенно правильно. Сделать консольный пример , потом добавить все это в TsBrows, потом туда же добавить конвертацию в PDF и другие возможности, потом сделать так ,что бы бровс нормально работал с базами SQL и т.д. и т.п. ... И таких вопросов много не только на уровне бровса. Другими словами нужно сделать инструмент с помощью которого любой мог бы писать пр-мы ,а не делать из крестовидной отвертки плоскую ,что бы прикрутить костылик . Andrey пишет: Не нашел я что-то вариант DBF в DOC в FW... DBF в PostgreSQL тоже нет в FW... Думаю Андрей Вы искали, но Вас кто-то отвлек . В бровсе есть возможность формировать таблицы различной конфигурации, формирования филтров ( все встроенно , придумывать не надо ) .... А дальше - Все эти возможности уже включены в бровс METHOD ToWord( bProgress, aCols, nTableFormat, nOrientation ) METHOD ToHTML( cHtmlFile, [lShow := .t.] ) --> Saved cHtmlFile with full path METHOD Report( cTitle, lPreview, lModal, bSetUp, aGroupBy, cPDF ) // PDF METHOD ToExcel( bProgress, nGroupBy, aCols, lShow ) Включая картинки , с группами, можно выгружать в ексел .. А можно формировать бровс не из DBF, а прямо из екселя. Или в бровсе работать с текстом. Можно с SQL. Это ADORDD 13) What SQL engines can I use ? ADS ACCESS ANYWHERE DBASE POSTGRE FIREBIRD FOXPRO INFORMIX MSSQL MYSQL ORACLE POSTGRE SQLITE But others can be easily added to be supported. Кстати в бровсе можно работать и с таким синтаксисом - cSql := ; "SELECT COUNT(*) AS EMPLOYEES, SUM(SALARY) AS TOTSALARY FROM CUSTOMER" Все. Надо останавливаться :)) Тут столько возможностей ,что хоть отдельную тему создавай. Даже самому стало интересно :) Andrey пишет: FW платный продукт, покупать нужно, осваивать тоже нужно... Да, осваивать нужно :(( Действительно FW платный ,но с учетом потраченного времени и сил на решение давно решенных вопросов МиниГуи обходится дороже.

Veeha: ММК пишет: Все. Надо останавливаться :)) Тут столько возможностей ,что хоть отдельную тему создавай. Даже самому стало интересно :) Andrey пишет: цитата: FW платный продукт, покупать нужно, осваивать тоже нужно... Да, осваивать нужно :(( Действительно FW платный ,но с учетом потраченного времени и сил на решение давно решенных вопросов МиниГуи обходится дороже.

Andrey: ММК пишет: Да, осваивать нужно :(( Действительно FW платный ,но с учетом потраченного времени и сил на решение давно решенных вопросов МиниГуи обходится дороже. Не знаю сейчас как FW, но пока МиниГуи менять не согласен. Ещё свою большую систему не переделал на него ! 2 менюшки осталось переделать... Надеюсь в след.году доделаю.... ММК пишет: METHOD ToExcel( bProgress, nGroupBy, aCols, lShow ) Включая картинки , с группами, можно выгружать в ексел .. Пробовал использовать - что-то не сложилось. Нужно тоже самостоятельно где-то хранить высоту шапки, строк и т.д. для Экселя. Покрутил и бросил... Да и не всегда нужно строить бровс, а потом выводить через Эксель. Проще сделать самому. Сделал из-за этого свой пример DBF_to_XLS

Andrey: // ветикальная ценровка строки в ячейке oTbl:Cell(nI,nJ):Cells:VerticalAlignment := wdCellAlignVerticalCenter Вот такая конструкция в Ворде 2003 работает, а в 2010 нет. Как можно модифицировать этот код для 2010 и выше ?

Andrey: Я так понял, что офисы работают по разному ? У заказчика одно, а у себя ставишь как у заказчика офис - ошибка такая же не получается...

Vlad04: ММК Да, осваивать нужно :(( Действительно FW платный К сожалению отсутствие Визуального дизайнера сводит все эти плюсы к нулю (для меня).

Andrey: Vlad04 пишет: К сожалению отсутствие Визуального дизайнера сводит все эти плюсы к нулю (для меня). Я тоже с этим согласен.

ММК: Andrey пишет: Я тоже с этим согласен. И Вы тоже... Один раз Вы уже разыгривали меня визуальным дизайнером для Харбора :) Vlad04 пишет: К сожалению отсутствие Визуального дизайнера сводит все эти плюсы к нулю (для меня). Ну, насчет нуля это перебор :) Тем более ,что альтернативы нет. Если не ошибаюсь мы с Вами уже как-то обсуждали этот вопрос :)) Что на сегодня - 1.можно использовать Visual Studio IDE .Все настойки для FW сделаны 2.можно использовать UEStudio и здесь все настройки есть 3.http://forums.fivetechsupport.com/viewtopic.php?f=3&t=29991&start=240 это скорее IDE , но они его постоянно дорабатывают, что-то может и будет 4.Разные Visual (включая поставку ) Они периодически всплывают и так же тихо исчезают. Но , тем не менее обновляются. Видимо с ними надо просто работать 5.Ну и на уровне "форм" и "экранов" работает наверное любой ресурсредактор. Сам использовал два. В каких-то ситуациях удобно...

Andrey: ММК Спасибо за полный обзор по FW ! Жалко, что такого нет для МиниГуи... Про ResHack для МиниГу у Григория спрашивал уже, не помню что он ответил...

Dima: Andrey пишет: ММК Спасибо за полный обзор по FW ! Это далеко не полный обзор. И да , лично мне такой дизайнер не нужен , спокойно можно обойтись и без него. Михаил такого же мнения , во всяком случае Михаил из прошлого ...лет так 5 назад или более. Но на вкус и цвет как говорится.........

Softlog86: Поддержу слова Димы . Дизайнер форм вещь хорошая , но ручками делать (лично мне) удобнее . Львиная доля времени при написании программ уходит не на написание форм , а на логику , работы с базами и т д .... Сколько той формы : поля ввода , таблицы , надписи .... : для каждого контрола всего 1-2 строки кода ....;

ММК: Dima пишет: Михаил такого же мнения , во всяком случае Михаил из прошлого ...лет так 5 назад или более. Все по прежнему , Дима :)) Действительно, в этом нет особой необходимости тем более ,что в FW очень много примеров. Совсем в сложном случае можно нарисовать экран в Ресхакере. Может только настройка цветов, гамы, картинок..... Не знаю, как это правильно назвать :)) Одним словом раскрасить этот экран. Вот для этого есть пр-мы Ukoenig'а ( поиск по этому слову на форуме ) Он их регулярно выкладывает . Удобный инструмент :)) Поищите по форуму, ссылок много будет. Посмотрите просто картинки, это интересно ! http://forums.fivetechsupport.com/viewtopic.php?f=3&t=31388&hilit=ukoenig http://forums.fivetechsupport.com/viewtopic.php?f=3&t=31622&hilit=ukoenig

Dima: ММК пишет: Может только настройка цветов, гамы, картинок..... Не знаю, как это правильно назвать Я делаю по простому. Снимаю скрин своей формы , гружу его в Paint и там "издеваюсь" над цветовой гаммой :) Опа , подобрал цвет , списал RGB , занес в код проги.

ММК: Dima пишет: Опа , подобрал цвет , списал RGB , занес в код проги. Можно и так. Но там более конкретно. Т.е. можно , к примеру , сделать градиент и добавить картинку, сместить и т.д. Т.е. сделать все по месту. Надписи... Хотя, повторюсь, для меня это не принципиально :)) Кстати там екзешники поэтому их можно использовать и для МиниГуи

Vlad04: Видел такой Дизайнер форм visualfw.exe лет 5 назад. Но толком неработающий. Может , сейчас улучшили или совсем забросили. Действительно, в этом нет особой необходимости А в этом вы ММК ,Softlog86 неправы. Платформа, претендующая на популярность, обязательно должна иметь Визуальный дизайнер или какой-то механизм создания форм.

PSP: Dima пишет: Я делаю по простому. Снимаю скрин своей формы , гружу его в Paint и там "издеваюсь" над цветовой гаммой :) Опа , подобрал цвет , списал RGB , занес в код проги. Вот http://www.nattyware.com/pixie.php еще проще)



полная версия страницы