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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2009, 20:41   #1
PeterMinin
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию Удаление текстов ссылок

Делаю макрос для обрабоки текста из Википедии. Нужно удалить все сноски и ссылки на редактирование страницы. Знаю, что можно пройти по массиву "Hyperlinks", но как удалить не сами ссылки, а их текст?
PeterMinin вне форума Ответить с цитированием
Старый 21.10.2009, 21:13   #2
БуреВестник
Пользователь
 
Регистрация: 19.09.2009
Сообщений: 69
По умолчанию

Вот это не понятно.
Цитата:
Нужно удалить все сноски и ссылки на редактирование страницы.
Сноски удаляются через Найти и заменить: в поле "Найти" вставляешь Знак сноски (Больше - Специальный - Знак сноски), в поле "Заменить" - всё удаляешь - Заменить все.

То же самое делаешь и для Гиперссылок, если они оформлены стилем Гиперссылка (это можно посмотреть на панели инструментов Форматирование): ставишь курсор в поле "Найти" - Больше - Формат - Стиль - Гиперссылка. В поле "Заменить" всё удаляешь - Заменить все.

Последний раз редактировалось БуреВестник; 21.10.2009 в 21:18.
БуреВестник вне форума Ответить с цитированием
Старый 21.10.2009, 21:29   #3
PeterMinin
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

Сноски и редактирование страницы - всё это от Вики. Ссылки такие. И я про макрос спрашиваю, а не про ручную обработку.
PeterMinin вне форума Ответить с цитированием
Старый 21.10.2009, 21:32   #4
БуреВестник
Пользователь
 
Регистрация: 19.09.2009
Сообщений: 69
По умолчанию

Вот макрос:
Код:
Sub RemoveHyperlinksAndFootnotes()
Dim oFootNotes As Footnote
Dim oHyp As Hyperlink
  Do
    For Each oHyp In ActiveDocument.Hyperlinks
      oHyp.Range.Select
      Selection.Delete
    Next
  Loop While ActiveDocument.Hyperlinks.Count <> 0
For Each oFootNotes In ActiveDocument.footnotes
    oFootNotes.Delete
Next
End Sub
Модификация макроса:
Код:
Sub RemoveHyperlinksAndFootnotes()
Dim oHyp As Hyperlink
Dim oFootNotes As Footnote
Do
  For Each oHyp In ActiveDocument.Hyperlinks
    oHyp.Range.Select
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Delete
  Next
Loop While ActiveDocument.Hyperlinks.Count <> 0
For Each oFootNotes In ActiveDocument.footnotes
    oFootNotes.Delete
Next
End Sub

Последний раз редактировалось БуреВестник; 21.10.2009 в 21:39.
БуреВестник вне форума Ответить с цитированием
Старый 21.10.2009, 21:44   #5
PeterMinin
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

Большое спасибо. Только сноски не вордовские, а с Вики, то есть это ссылки, но это не суть.

Последний раз редактировалось PeterMinin; 21.10.2009 в 21:49.
PeterMinin вне форума Ответить с цитированием
Старый 21.10.2009, 21:48   #6
БуреВестник
Пользователь
 
Регистрация: 19.09.2009
Сообщений: 69
По умолчанию

Если сноски - это не сноски, то тогда вот этот код возьмите:

Я намудрил в предыдущих кодах, вот окончательный вариант:
Код:
Sub RemoveHyperlinks()
Dim oHyp As Hyperlink
  Do
    For Each oHyp In ActiveDocument.Hyperlinks
      oHyp.Range.Delete
    Next
  Loop While ActiveDocument.Hyperlinks.Count <> 0
End Sub

Последний раз редактировалось БуреВестник; 21.10.2009 в 22:57.
БуреВестник вне форума Ответить с цитированием
Старый 21.10.2009, 22:53   #7
PeterMinin
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

[edit]Cybernetics and early neural networks
The earliest research ... The close relationship between these ideas suggested that it might be possible to construct an electronic brain.[27]

Я вот такой макрос сделал. Здесь и пример поиска подстроки - InStr. Подскажите, пожалуйста, где тут какие End'ы поставить, чтобы соответствовало структуре, отмеченной отступами?
Код:
Sub clearWikiLinks()
'
' clearWikiLinks Macro
'
'
Dim i As Integer
For i = 1 To ActiveDocument.Hyperlinks.Count
  If InStr(ActiveDocument.Hyperlinks(i).Address, "#") <> 0 Then
    ActiveDocument.Hyperlinks(i).Range.Select
    Selection.Delete
  Else
    If InStr(ActiveDocument.Hyperlinks(i).Address, "action=edit") <> 0 Then
      ActiveDocument.Hyperlinks(i).Range.Select
      Selection.MoveUp Unit:=wdCharacter, Extend:=wdExtend
      Selection.MoveDown Unit:=wdCharacter, Extend:=wdExtend
      Selection.Delete
    End If
For i = 1 To ActiveDocument.Hyperlinks.Count
  ActiveDocument.Hyperlinks(1).Delete
End Sub
PeterMinin вне форума Ответить с цитированием
Старый 21.10.2009, 23:00   #8
БуреВестник
Пользователь
 
Регистрация: 19.09.2009
Сообщений: 69
По умолчанию

Я тебе неправильные коды дал первый раз (они работают, но всё было усложнено). Возьми за основу последний макрос.
Для удаления Гиперссылок не работают циклы for i to и for each next так, как должны работать, поэтому придуманы ухищрения. Программисты Wordа что-то напутали, надо использовать именно цикл, который я привел, или ещё здесь посмотри:
http://www.programmersforum.ru/showthread.php?t=66414

Последний раз редактировалось БуреВестник; 21.10.2009 в 23:13.
БуреВестник вне форума Ответить с цитированием
Старый 21.10.2009, 23:55   #9
БуреВестник
Пользователь
 
Регистрация: 19.09.2009
Сообщений: 69
По умолчанию

Попробуй применить последний макрос - он очень хорошо и по-умному удаляет ссылки.
И я, например, так и не понял, что ты хочешь сделать.

Хотя сейчас попробовал последний макрос, что-то он зацикливается у меня. Короче никак не получается.

Последний раз редактировалось БуреВестник; 22.10.2009 в 00:06.
БуреВестник вне форума Ответить с цитированием
Старый 22.10.2009, 00:26   #10
PeterMinin
 
Регистрация: 21.10.2009
Сообщений: 6
По умолчанию

Я хочу скопировать текст и Википедии (вы её, кстати, видели хотя бы? ) со всеми её ссылками, запустить макрос и получить текст без ссылок на обычных словах и без текста служебных ссылок Википедии (пресловутые сноски и [править]).
Насчёт кривого удаления: чтобы удалить все ссылки, по-моему, проще всего так (эквивалентно тому, что написано в конце моего макроса, но не требует переменной):
Код:
Do
  ActiveDocument.Hyperlinks(1).Delete
  Next
Loop While ActiveDocument.Hyperlinks.Count<>0
Но вот для выборочного удаления мой вариант действительно не подходит. Ну в Паскале/Дельфи, например, проблема решается проходом с конца к началу. Здесь не так? Здесь коллекции после удаления элемента перестраиваются совершенно в другом порядке?
И проверьте, пожалуйста, приведённый мной макрос на правильность End'ов, а то я в Basic'овском синтаксисе не разобрался.
PeterMinin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемма с выводом больших текстов из mySQL Андрей79 PHP 3 05.08.2009 16:44
Срочно нужна программа транслитерации текстов на С++ enna Общие вопросы C/C++ 1 11.06.2009 20:14
Чтение текстов голосом Chi Софт 4 19.10.2008 14:07
Сравнение текстов на схожесть PUH Общие вопросы Delphi 7 21.02.2008 22:18