Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2009, 22:39   #1
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
Сообщение Вывод сообщения о скрытом тексте

Как написать макрос, который бы при открытии документа выводил сообщение, что в документе содержится скрытый текст?

Здесь есть один (а может и больше - не знаю) нюанс: если в документе содержится больше 50 абзацев, то ворд видит скрытый текст.
Busine2009 вне форума Ответить с цитированием
Старый 30.06.2009, 01:03   #2
CaptainNemo
Пользователь
 
Аватар для CaptainNemo
 
Регистрация: 02.06.2009
Сообщений: 49
По умолчанию

По-моему вопросы скрытого текста обсуждались на форуме уже неоднократно. Но если сделать скидку на то, что повторенье – мать ученья, то можно и повторить…
Самый простой путь написать - это воспользоваться макрорекодером. А для того, что бы этот макрос запускался при открытии документа, нужно ещё осознать концепцию событий Office.
Что касается скрытого текста в целом, то проверить документ на наличие такового можно просмотрев все символы в цикле на свойство Hidden (поскольку и пробел может быть скрытым). Ну, например, вот так (это самый примитивный вариант кода, его нужно поместить в модуль ThisDocument):
Код:
Private Sub Document_Open()
With ActiveDocument
For i = 1 To .Characters.Count
    If .Characters(i).Font.Hidden = True Then
        MsgBox "Есть скрытый текст"
        Exit Sub
    End If
Next i
End With
End Sub
Android & Linux
CaptainNemo вне форума Ответить с цитированием
Старый 30.06.2009, 01:03   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Действительно, ошибается Word при большом количестве абзацев. Тогда можно их просто перебрать. Это займет некоторое время, но результат будет точным
Код:
Sub ShowHidden()
  Dim bHid As Boolean, oPar As Paragraph
  For Each oPar In ActiveDocument.Paragraphs
    bHid = bHid Or oPar.Range.Font.Hidden
  Next
  If bHid Then MsgBox "В документе есть скрытый текст!"
End Sub
CaptainNemo, думаю, что проверять каждый символ нет необходимости.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 30.06.2009, 01:25   #4
CaptainNemo
Пользователь
 
Аватар для CaptainNemo
 
Регистрация: 02.06.2009
Сообщений: 49
По умолчанию

А я думаю, что необходимость всё же есть. Ваш код не ищет скрытые непечатные знаки внутри параграфа. А иногда это может пригодится…
Android & Linux

Последний раз редактировалось CaptainNemo; 30.06.2009 в 08:10.
CaptainNemo вне форума Ответить с цитированием
Старый 30.06.2009, 20:19   #5
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

Спасибо за ответы, завтра гляну.
Busine2009 вне форума Ответить с цитированием
Старый 04.07.2009, 09:06   #6
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

Использовал макрос Витера.

Уже 2 раз помог.

Хотя я свою систему разработал: это при открытии документов выводить диалоговое окно "Найти и заменить", чтобы не забывать проводить проверку на наличие скрытого текста. Но макрос, бессомненно, лучше.

Хотя я сей час подумал, макрос Витера не ищет скрытый текст в колонтитулах, а с помощью диалогового окна "Найти и заменить" скрытый текст ищется в колонтитулах, что может сыграть существенную роль, поэтому, наверное, надо перейти к своему способу поиска скрытого текста.

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

Последний раз редактировалось Busine2009; 04.07.2009 в 09:23.
Busine2009 вне форума Ответить с цитированием
Старый 25.09.2009, 07:12   #7
Energy42
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 10
По умолчанию

Мой вопрос перекликается с вопросом, озвученным в этой теме, поэтому не стал заводить новый топик...

В документе есть скрытый текст, в котором "спрятано" ключевое слово, макрос должен найти это ключевое слово и на его месте вставить содержимое другого документа.
Делаю так:

Private Sub test()
With ActiveDocument.Content.Find
.Forward = True
.ClearFormatting
.MatchWholeWord = True
.MatchCase = False
.Wrap = wdFindContinue
If .Execute(FindText:="<$insdoc$>") = True Then
.Parent.Select
Selection.InsertFile FileName:="c:\...\insdoc.doc", ConfirmConversions:=False, Link:=True, Attachment:=False
End If
End With
End Sub

Этот код работает если ключевое слово не скрыто, если же сделать скрытым, то код не может найти скрытый текст и соответственно вставить документ.

Вопрос: Как выполнить поиск учитывая скрытый текст и найдя это место, вставить, заместо скрытого текста, содержимое другого документа?
Energy42 вне форума Ответить с цитированием
Старый 25.09.2009, 11:50   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Попробуйте так:
Код:
Sub FindHidden()
  Selection.HomeKey wdStory, wdMove
  With Selection.Find
    .ClearFormatting
    .Text = "<$insdoc$>"
    .Font.Hidden = True
    .MatchWholeWord = True
    .Format = True
    If .Execute Then Selection.InsertFile FileName:="c:\...\insdoc.doc", ConfirmConversions:=False, Link:=True, Attachment:=False
  End With
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 25.09.2009, 12:35   #9
Energy42
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 10
По умолчанию

Такой код не работает, я тоже так пробовал...
Временно сделал такой вариант:
Код:
Private Sub test()
  Dim WasShowHiddenText
  WasShowHiddenText = ActiveDocument.ActiveWindow.View.ShowHiddenText
  ActiveDocument.ActiveWindow.View.ShowHiddenText = True
  With ActiveDocument.Content.Find
    .Forward = True
    .ClearFormatting
    .MatchWholeWord = True
    .MatchCase = False
    .Wrap = wdFindContinue
    If .Execute(FindText:="<$insdoc$>") = True Then
      .Parent.Select
      Selection.InsertFile FileName:="c:\...\insdoc.doc", ConfirmConversions:=False, Link:=True, Attachment:=False
    End If
  End With
  ActiveDocument.ActiveWindow.View.ShowHiddenText = WasShowHiddenText
End Sub
То есть перед поиском принудительно показываю скрытый текст, после поиска, возвращаю первоначальный режим просмотра. На небольших документах, не заметно "моргание", но если машина будет медленная, то наверняка будет видно.

Возможное найдётся более красивое решение?
Energy42 вне форума Ответить с цитированием
Старый 26.09.2009, 09:19   #10
БуреВестник
Пользователь
 
Регистрация: 19.09.2009
Сообщений: 69
По умолчанию

В начале кода вставляете
Код:
Application.ScreenUpdating = False
В конце кода вставляете.
Код:
Application.ScreenUpdating = True

Последний раз редактировалось БуреВестник; 26.09.2009 в 09:31.
БуреВестник вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод сообщения без кнопок transgd Microsoft Office Excel 6 19.06.2009 06:15
вывод сообщения при закрытии программы tiger Помощь студентам 4 27.08.2008 23:31
Вывод сообщения на экран при выборе из списка определенного значения MaGistR Microsoft Office Excel 1 31.01.2008 09:10
Нужен вывод сообщения на экран: ну типа создать файл? Максим-2 Общие вопросы Delphi 7 28.07.2007 14:45
Как при скрытом чужом окне сделать его дочерние окна(сообщения) видимыми ? Starwarrior Win Api 1 20.03.2007 09:51