maod
Гость
|
|
« : 15-02-2006 16:10 » |
|
Подскажите пожалуйста как реализовать такую вещь , как сделать так чтоб нужный текст в ворде отделялся от ненужного и записывался в другой файл! Например редактируем текст, к нужному применяем выделение цветом например зеленым, после запускаем свою программу жмем кнопку и она выделенное собирает в новом файле . Помогите очень надо.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #1 : 15-02-2006 18:28 » |
|
Я бы воспользовался одним из двух способов.
1. Написать макрос на Visual Basic for Application, встроенном в Word. Для записи в файл можно воспользоваться обектом COM TextStream (библиотека Microsoft Scripting Runtime).
2. Написать отдельное приложение, которое будет управлять Word'ом через OLE Automation.
Выбирай на вкус, оба подхода работают.
|
|
« Последнее редактирование: 20-12-2007 16:15 от Алексей1153++ »
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #2 : 15-02-2006 20:48 » |
|
AlfДело втом что я невладею ни Visual Basic for Application ни VB. Я только недавно начал его самостоятельно изучать. А тут такая необходимость в такой программке даже незнаю с чего начать и как все это реализовать. :-/Может если тебе нетрудно поможеш исходноком буду очень благодарен.С меня пиво
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #3 : 15-02-2006 22:40 » |
|
По нынешней погоде только пиво возить из Краснодара в Ростов Тут в пределах города не проберешься... Проясни ситуацию, чего хочешь достичь: научиться писать приложения по работе с текстами или просто получить готовую программу, не вникая в суть? И каким образом планируешь выделять? Если, скажем, зеленым цветом, нужна гарантия, что такой цвет не встретится в самом тексте, до выделения. И еще. После того, как выделенный текст выписан в файл, он должен оставаться в исходном документе или его следует удалить?
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #4 : 16-02-2006 09:38 » |
|
ALF По нынешней погоде только пиво возить из Краснодара в Ростов Тут в пределах города не проберешься... Если в Ростов пиво возить то далековато, а в Краснодарском крае то я на лыжах домчу !!!! )) Шутка. А если конкретно то я научиться писать приложения по работе с текстами. Но я неразу еще ничего не писал. Но у меня натура дотошная я буду код разбирать пока невъеду. Насчет выделения цветом то я думаю можно остановиться на конкретном пусть будет зеленый, а если он попадется в тексте то его легко исправить на нужный. П осле форматирования оригинал остается прежним, а готовый отформатированный сохраняется в новом файле.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #5 : 16-02-2006 12:13 » |
|
Тогда я сделаю кое-какие наметки и выложу здесь, а потом обсудим.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #6 : 16-02-2006 21:48 » |
|
Вот набросал макрос на VBA. Public Sub ProcessDocument() Dim fso As New FileSystemObject Dim ts As TextStream Dim i As Long Dim cl As WdColor Dim chars As Characters cl = wdColorGreen Set chars = Application.ActiveDocument.Characters Set ts = fso.OpenTextFile("c:\GetFromWord.txt", ForWriting, True) i = 1 While (i <= chars.Count - 1) While (i <= chars.Count - 1) And (chars(i).Font.Color <> cl) i = i + 1 Wend While (i <= chars.Count - 1) And (chars(i).Font.Color = cl) ts.Write chars(i) i = i + 1 Wend ts.WriteLine Wend ts.Close End Sub Особо с ним не заморачивался. Пишет всегда в один и тот же файл фрагменты текста, выделенные в документе зеленым цветом. Но принцип понять сможешь, а там и улучшишь до нужной степени уже самостоятельно. Макрос не обрабатывает последнюю литеру, поскольку, как оказалось, VBA вычисляет логические функции полностью, даже если это не требуется. Для упрощения пожертвовал последней литерой. Надеюсь, потеря не столь велика.
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #7 : 17-02-2006 11:55 » |
|
Alf Круто ,но можно поподробнее объяснить как все это дело вставить в ворд и заставить работать. Как я говорил я никогда ничего на писал в смысле программ макросов и так далее я конкретно сидел на видео оцифровка сжатие делаю свадьбы и так далее все в этом духе. А тут вдруг решил попробовать себя в сфере программирования. Но как выяснилось в этой сфере мои ручонки корявые мягко сказано, но буду их потихоньку выпрямлять. (Это я к тому чтоб ты понял мои познания в программировании) А теперь к теме я запустил ворд меню сервис макрос создать в редакторе вставляю твой код сохраняю затем в тексте выделяю нужное зеленым запускаю макрос через меню сервис но наработает чета ругается. Наверное я чего-то неправильно сделал , если нетрудно объясни как сделать правильно.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #8 : 17-02-2006 12:07 » |
|
запускаю макрос через меню сервис но наработает чета ругается. Наверное я чего-то неправильно сделал , если нетрудно объясни как сделать правильно. Трудно, потому как ошибку "чета ругается" сложно диагностировать. Приведи сообщение дословно. Не помешает также скриншот в момент ошибки. Покажи также скриншот редактора NBA.
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #9 : 17-02-2006 17:00 » |
|
Alf Извини наверное я тебя дастал вот
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #10 : 17-02-2006 17:05 » |
|
Что-то не получается вставить скрин,вот ошибка которая получается при компиляции User-defined type not defined
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #11 : 17-02-2006 22:49 » |
|
Давай сделаем так. Я выкладываю файл с работающим макросом. Ты попробуешь его выполнить у себя. Если что-то не получается, сообщи,какие ошибки возникли. Если все нормально, попытайся проделать то же самое со своими документами.
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #12 : 18-02-2006 16:11 » |
|
Alf Странно но и в твоем документе наработает таже ошибка. У меня стоит офис 2003 SP1 проблем с ним небыло система ВЫНЬ XP SP2 тоже вроде неглючит, вот вылаживаю рисунок с ошибкой.
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #13 : 18-02-2006 18:22 » |
|
Это уже ближе к делу.
Проверь для начала, есть ли у тебя файл C:\Windows\system32\scrrun.dll
В этой библиотеке находятся объекты для работы с файловой системой - FileSystemObject и TextStream. Если ее нет в системе, сначала придется установить.
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #14 : 18-02-2006 19:38 » |
|
Alf
Нашел библиотеку подключил все заработало, но тормаза страшные, а более менее больших файлах вообще зависает. А так все работает Alf огромное тебе спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #15 : 18-02-2006 19:42 » |
|
а обязательно писать в текстовый (плоский) файл? в новый вордовский документ нельзя?
|
|
« Последнее редактирование: 18-02-2006 19:44 от PooH »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Alf
Гость
|
|
« Ответ #16 : 18-02-2006 20:28 » |
|
Alf
Нашел библиотеку подключил все заработало, но тормаза страшные, а более менее больших файлах вообще зависает. Увы, OLE Automation штука вообще гибкая, но не слишком быстрая, а в сочетании со скриптовыми языками - и вовсе тормоз. Именно по этой причине редко можно найти серьезные приложения на основе MS Word, Excel и Access - функциональность кое-какая присутствует, а вот производительность никакая. Хотя для разовых задач годится, конечно. Единственное, что радует, - это то, что копировать вручную через буфер обмена пришлось бы еще гораздо дольше. А так все работает Alf огромное тебе спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Хорошо. А с принципом разобрался, комментарии не нужны?
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #17 : 18-02-2006 20:52 » |
|
Alf Извини за нахальство, а можно все это реализовать в VB6. Может там будет работать побыстрее! Плизззззззззззззззззззззз. )))))) PooH Можно и в вордовский поменяй расширение на *.doc в коде макроса
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #18 : 18-02-2006 21:14 » |
|
Alf
Извини за нахальство, а можно все это реализовать в VB6. Можно, причем практически ничего менять не придется. VB6 и VBA - близнецы-братья, совместимость очень высокая. Может там будет работать побыстрее! Плизззззззззззззззззззззз. )))))) Увы, не будет. Побуквенное чтение из Word - чрезвычайно медленная операция, на моем P4-1800 дает порядка 10 литер (не литров! ) в секунду. Я делал подобные приложения на C#, скорость не возрастала совершенно. Word грузит процессор на 100%, причем время от времени программа останавливается надолго, кажется, что она зависает, но потом столь же неторопливо движется дальше. Я думаю, ускорить программу можно, если добавить ограничения. Если, например, выделять целиком слова, тогда можно будет читать текст пословно, а не побуквенно, это должно ускорить дело. Если выделять целые абзацы - дело пойдет еще быстрее, чем перебор по одной буквочке. PooH Можно и в вордовский поменяй расширение на *.doc в коде макроса Так не пойдет, таким образом ты всего лишь поменяешь расширение имени файла, а формат его не изменится. Нужно создать средствами VBA новый документ и выписывать выделенные фрагменты в него вместо текстового файла.
|
|
|
Записан
|
|
|
|
maod
Гость
|
|
« Ответ #19 : 19-02-2006 13:30 » |
|
Я думаю, ускорить программу можно, если добавить ограничения. Если, например, выделять целиком слова, тогда можно будет читать текст пословно, а не побуквенно, это должно ускорить дело. Если выделять целые абзацы - дело пойдет еще быстрее, чем перебор по одной буквочке.
Alf Скажи а как внести эти ограничения в код. Ты пробовал так делать.
|
|
|
Записан
|
|
|
|
RomCom
|
|
« Ответ #20 : 19-02-2006 14:46 » |
|
Мне кажетси если воспользоваться функцией поиска дело быстрей пойдет. вот кусок кода для поиска по цвету. Selection.Find.ClearFormatting Selection.Find.Font.Color = wdColorGreen With Selection.Find .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute т.е. выделяем (через поиск), копируем, дальше ищем.
|
|
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
RomCom
|
|
« Ответ #21 : 20-02-2006 02:20 » |
|
Предлогаю такой вариант чарез VBA: Sub КопированиеЦвета() Dim rng As Range, newdoc As Document Set rng = ActiveDocument.Content Set newdoc = Documents.Add(DocumentType:=wdNewBlankDocument) With rng.Find .ClearFormatting .Text = "" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Font.Color = wdColorSeaGreen 'цвет Изумрудный While .Execute If .Found Then newdoc.Activate Selection.EndKey Unit:=wdStory Selection.TypeParagraph 'добавляем новый параграф, чтоб не склеилось :) Selection.TypeText Text:=rng.Text rng.Delete End If Wend End With End Sub Проверил, вродебы быстренько так деится
|
|
« Последнее редактирование: 20-12-2007 16:17 от Алексей1153++ »
|
Записан
|
R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
|
|
|
maod
Гость
|
|
« Ответ #22 : 21-02-2006 10:43 » |
|
RomCom Да действительно работает очень быстро. А я тут реализовал это дело в батике тоже недурно получилось. А вооще тебе и ALF большое спасибо что помогли. Хороший форум обязательно буду заглядывать. Пока !!!!
|
|
|
Записан
|
|
|
|
Oxotnik
Гость
|
|
« Ответ #23 : 15-02-2009 12:10 » |
|
А код написанный выше с тексток какого цвета работает???
|
|
|
Записан
|
|
|
|
|