1

Тема: Помогите усовершенствовать мой макрос DeleteComent

Добрый день.
В документах ХТМЛ часто есть блоки с комментариями. Для сокращения текста я их удаляю. Вот пример текста для правки:

<!--  текст комментария -->
текст 
…
текст
<!--  текст комментария -->
текст 
…
текст 
<!--  текст комментария -->
текст 
…
текст
<!--  текст комментария -->

А вот код макроса для удаления одного комментария:

Sub DeleteComent()
' Макрос удаляет блок <!-- ... -->
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Dim MyRange As Range, rStart&, rEnd&
    Set MyRange = ActiveDocument.Content
    'Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<!--"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    a = Selection.Start
   
   With Selection.Find
        .Text = "-->"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    b = Selection.End
    If b > a Then
        ActiveDocument.Range(a, b).Select
        Selection.Delete Unit:=wdCharacter, Count:=1
    Else
        Selection.HomeKey Unit:=wdStory
    End If
End Sub

Помогите его усовершенствовать следующим образом – макрос должен удалять все комментарии в тексте. После этого снова возвращаться в начало документа.
А вообще, как организовать функцию, которая в цикле выполняла другую функцию наподобие DeleteComent от начала до конца документа?
Я попытался таким образом:

Sub Проба()
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Do While Selection.Find.Execute
        Call DeleteComent
    Loop
    Selection.HomeKey Unit:=wdStory
End Sub

Но макрос работает только тогда, когда я хоть один раз выполню макрос DeleteComent.
Спасибо.

2

Re: Помогите усовершенствовать мой макрос DeleteComent

Т.е. у вас в вордовском документе есть код html и вы хотите его очистить от комментариев? Или вы открываете документ html через Word и в нём хотите удалить комментарии?

Лучше день потерять — потом за пять минут долететь!

3

Re: Помогите усовершенствовать мой макрос DeleteComent

Добрый день.
Да, я копирую содержимое HTML документа в Ворд и там чищу его от "мусора" (комментариев, скриптов, стилей и т.д.). Получаю более компактный текст и далее с ним работаю, например, перевожу в формат chm. Получаю более компактный справочный документ. Заодно всё-таки интересно как же запустить единичный макрос, что бы он пробежался по всему документу и вернулся в начало. На базе такого цикла можно будет писать любой макрос. Это что-то на подобии поиск и замена в стандартном исполнении: можно пошагово, а можно сразу всё! Спасибо, что откликнулись.

4

Re: Помогите усовершенствовать мой макрос DeleteComent

Я так долго ждал помощи, что в конце-концов сам "родил" такой код:

Sub DelCommentAll()
    Call DelComment
    Do While Selection.Find.Execute
        Call DelComment
    Loop
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.HomeKey unit:=wdStory
End Sub

Хотелось всё-таки услышать мнение спецов "макрописания", так как код несовершенен, может удалять первый символ текста, если не найдет ни одного коментария в тексте.
Так что  вопрос по-прежнему актуален. Очень надеюсь, что таки окажут мне помощь

5

Re: Помогите усовершенствовать мой макрос DeleteComent

не поняла, откуда НТМ
--с интернета
--или подготовили нечто в ворде, сохранили как НТМ, а затем этот НТМ и чистите

-----------
лично я переводила текстовые и вордовские документы своим макросом в достаточно чистом виде(создание электронных книг в НТМ формате)
--рисунки
--несложные таблицы
--переводила весь текст к 3 заголовкам и просто тексту(курсив-жирность-размер)

----------
работала по фрилансу
три раза переделала всю работу ввиду нечеткости постановки
заплатили только за начальный вариант
а после моих напоминаний о доплате за 2-3 вариант ---исчезли

6

Re: Помогите усовершенствовать мой макрос DeleteComent

Да все гораздо проще:
1. Понравилась страница в нете.
2. Сохранил как ХТМЛ страницу с рисунками, css, js.
3. Затем открываю простым текстовым редактором, хоть блокнотом (я использую Notepad++), копирую текст и вставляю в новый документ WORD.
4. Теперь мне предстоит вычистить этот текст от ненужной информации (кода). Делаю это с помощью WORDа. Будем считать что просто работаем в WORDе с текстом. Написал ряд макросов. Один из них приведен выше. Смысл таков – нужно удалять блоки текста заключенные в определенные теги. Например, такие:

<!--[if IE]>
  <xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v"/>
<![endif]-->

Это блок комментария. Он не нужен для моей дальнейшей работы. Так вот задача выделить блок, заключенный в теги <!-- и --> и удалить его. Макрос, который находит и удаляет такой ЕДЕНИЧНЫЙ блок, я написал. Он приведен в стартопике. Вопрос о помощи заключается в том, что я не знаю как написать макрос, который бы находил все ТАКИЕ блоки и удалял их. При этом если таких блоков нет, то макрос должен просто переместить курсор в начало текстового документа.

Далее из обработанного теста я делаю документ формата CHM, PDF и т.д. Он компактнее и не содержит не нужной в данной ситуации информации.

7

Re: Помогите усовершенствовать мой макрос DeleteComent

в интернете страничек с несколькими сотнями табличек(да еще вложенных в десяток-другой уровней) и дивов  --основная масса
многие из них вордом в режиме дос-документа не открываются(word 2007) или не сохраняются(2003)
---
у меня это основная проблема

8

Re: Помогите усовершенствовать мой макрос DeleteComent

Может проще на другом языке программирования сделать? На паскале, на дельфи. Открыть текстовый файл и удалить нужные строки.

9

Re: Помогите усовершенствовать мой макрос DeleteComent

Писал когда-то функцию чистки HTML после сохранения вордом в формате HTML:

Function CleanHTML(ByVal sHTML As String) As String
    Dim colRegExps As New Collection
    Dim objRegExp As Object
'    комментарии
    colRegExps.Add "<!--(\w|\W)+?-->"
'    классы
    colRegExps.Add "\s?class=\w+"
'    стили, кроме цвета
    colRegExps.Add "\s+style='[^color][^']+'"
'    ненужные теги
    colRegExps.Add "<(meta|link|/?o:p|/?div|/?style)[^>]*?>"
'    пустые строки
    colRegExps.Add "(^[ \t]*$\r?\n)"
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.MultiLine = True
    objRegExp.Global = True
    Dim i As Integer
    For i = 1 To colRegExps.Count
        objRegExp.Pattern = colRegExps(i)
        sHTML = objRegExp.Replace(sHTML, "")
    Next
'    атрибуты тегов html и body
    objRegExp.Pattern = "<(html|body)(?:[^>]*?)>"
    sHTML = objRegExp.Replace(sHTML, "<$1>")
'    Заголовок H1
    objRegExp.Pattern = "(<body>\r?<)p(>.*?</)p(>)"
    sHTML = objRegExp.Replace(sHTML, "$1h1$2h1$3")
    Set objRegExp = Nothing
    CleanHTML = sHTML
End Function

На вход функции подаём текст для очистки, получаем чистый html. По комментариям видно, какой шаблон что чистит. Поиск Wordа для этой цели не удобно использовать: он недостаточно гибок

Лучше день потерять — потом за пять минут долететь!

10

Re: Помогите усовершенствовать мой макрос DeleteComent

viter.alex пишет:

Писал когда-то функцию чистки HTML ...

Спасибо за ответ. Буду разбираться.
А вообще, и для shanemac51 в частности переиначу свой изначальный вопрос. Ибо он вызвал неадеккватные для меня ответы.
Значит так, забудем про HTML. Допустим есть вордовский документ (чисто вордовский и баста!). Я написал макрос с именем DelComment, который выполняет одну единственную операцию: ищет первый встретившийся блок текста заключенный между двумя символами, например "Ъ" и "Ы" или групп символов "<!--" и "-->", и удаляет найденный блок. Такой макрос я написал.
А теперь вопрос: как мне его вызвать с помощью функции Call из ДРУГОГО макроса, что бы он выполнил удаление ВСЕХ таких блоков во всем документе? Или же по другому, как усовершенствовать первый макрос (DelComment), что бы он удалял все такие блоки, если таковы имеюся, а при отсутсвии онных ничего не делал.
У меня не получается организовать цикл выполнения еденичной операции для всего документа. Мне просто надо подсказать как правильно организовать такую работу кода. Аналог уже есть в самом ворде: "Поиск и замена" как для одиноразового выполнения - "Заменить", так и для всего документа - "Заменить все". Надеюсь не сильно замудрённо написал. Об одном прошу, забудьте про HTML - работаем только с VBA в WORD-е. Спасибо.