Консультация № 177173
09.03.2010, 17:37
35.77 руб.
0 34 1
Здравствуйте уважаемые эксперты, подскажите, пожалуйста, в следующем
как среди всех ссылок в документе удалить ссылки, которые ссылаются не на имеющуюся в документе закладку. Но есть исключение нельзя удалять ссылки на файл D:\Рабочая папка\ГК РФ.doc

Спасибо Эндрю



Обсуждение

Неизвестный
12.03.2010, 18:46
общий
Ципихович Эндрю:
Цитата: 238244
Ну давайте поступим по другому в любом открытом документе прогоните код:
If Not (Bookmarks.Exists("file:///E:\\9.htm")) Then Beep
Получили ошибку № 424, конечно да!!!, почему???, потому что насколько я понимаю Вы спрашиваете закладку имя которой
просто не может существовать
Сделал как вы просите. Получил ли ошибку? КОНЕЧНО НЕТ. Получил Beep. Я же у заточеной под это функции спрашиваю есть ли закладка с таким именем - она отвечает False (типа, закладка с таким именем не найдена), ответ инвертируется отрицанием и в работу включается ветка then. Что я делаю не так?
Неизвестный
12.03.2010, 20:36
общий
Andrew Kovalchuk:
Это чудеса какие то, я загрузил файл, вот ссылка:
https://rfpro.ru/upload/1819
Глядя на него видно, что я прогоняю код в котором одна строка
Видно, что документ чистый, и видна ошибка № 424
Ну я же не фокусник
Не знаю тогда что за чудеса, есть какаие то мысли???
Неизвестный
12.03.2010, 20:57
общий
Ципихович Эндрю:
Файл скачал. Рисунок видел. Я помещал макрос и в документ, и в шаблон. Ошибка не воспроизводится. Попробуйте начинать перечисление с ActiveDocument.Bookmarks.Exists. Других мыслей нет .
Неизвестный
12.03.2010, 21:17
общий
Andrew Kovalchuk:
Вы говорите: Я помещал макрос и в документ, и в шаблон
Нет никакого макроса есть всего одна строка
То есть открыт чистый, новый документ, жмём
Альт Эф 11
Строку вставляем If Not (Bookmarks.Exists("file:///E:\\9.htm")) Then Beep
Прогоняем её нажимая Эф8 получаю ошибку № 424, если у Вас не так, то я тогда не знаю, что это такое
Неизвестный
13.03.2010, 00:12
общий
Ципихович Эндрю:
Цитата: 238244
То есть открыт чистый, новый документ, жмём
Альт Эф 11
Строку вставляем If Not (Bookmarks.Exists("file:///E:\\9.htm")) Then Beep
Прогоняем её нажимая Эф8 получаю ошибку № 424, если у Вас не так, то я тогда не знаю, что это такое
Описываемый порядок действий приводит к ошибке компиляции (Invalid outside procedure) - это и логично - откуда же взяться конструкциям языка если точка входа отсутствует. Вы же все время твердите о (run time error #424). Это не эквивалентные вещи.
Неизвестный
13.03.2010, 06:23
общий
Andrew Kovalchuk:
Не возражаю там было указано run time error '424', я по своему называю это ошибкой № 424, уж извините
Тогда далее, подскажите что такое Not, для чего служит, вроде ничего ему не присвоено, я его спутал с Nothing
И скажите Nothing и Not это одно и тоже, в чём различие
А что касается всего кода напишу завтра
Неизвестный
13.03.2010, 13:25
общий
Ципихович Эндрю:
Not - логическая операция отрицания, она инвертирует значение логической переменной к которой применяется.
Nothing - предопределенное значение указывающее в "никуда". Используется для указания того, что объект не определен.
Как видите, это совершенно разные вещи.
Неизвестный
14.03.2010, 11:34
общий
Andrew Kovalchuk:
Спасибо за пояснения, но run time error #424 на строке
If Not (Bookmarks.Exists(bm)) Then никуда не делось
Скриншот:https://rfpro.ru/upload/1833
без пароля
Неизвестный
14.03.2010, 17:21
общий
Ципихович Эндрю:
Цитата: 238244
Спасибо за пояснения, но run time error #424 на строке
If Not (Bookmarks.Exists(bm)) Then никуда не делось
Покажите значения переменных bm, link, Bookmarks в этот момент (надеюсь, это прояснит ситуацию).
Неизвестный
14.03.2010, 17:59
общий
Andrew Kovalchuk:
'bm="C:\\Documents
'link=HYPERLINK "C:\\Documents and Settings\\user1\\Мои документы\\catalog"
'переменной Bookmarks вроде же нет????
'Чудеса да и только попутно хотел спросить, чтобы Вам ответить пишу
'Selection.TypeText Text:=bm
'Всё нормально, ниже пишу
'Selection.TypeText Text:=link, выделяет ".TypeText" и сообщение Тип Мисматч, с ума сойти можно
'я знаю, что лучше писать для таких целей дебуг принт но это моё слабое место
Неизвестный
14.03.2010, 21:21
общий
Цитата: 238244
'переменной Bookmarks вроде же нет????
Вполне очевидно, что ошибка 424 Object required подходит в данном случае. Интерпретатор ожидал увидеть объект у которого можно вызвать метод Exists(), но объекта не обнаружил. Вот и ругнулся.
Неизвестный
14.03.2010, 22:34
общий
Andrew Kovalchuk:
Ну он ругнулся, а ведь надо внести коррективы в код
Вы спрсили в 17-21 Покажите значения переменных bm, link, Bookmarks в этот момент (надеюсь, это прояснит ситуацию)
Я вам отвечаю
bm="C:\\Documents
link такого нет, есть link.Code, равно HYPERLINK "C:\\Documents and Settings\\user1\\Мои документы\\catalog"
Повторяю переменной Bookmarks вроде же нет????, что не так, её нет
В коде слово Bookmarks встречается 1 раз в контексте If Not (Bookmarks.Exists(bm)) Then, если это переменная, то не для меня



Неизвестный
15.03.2010, 01:24
общий
Ципихович Эндрю:
Цитата: 238244
Повторяю переменной Bookmarks вроде же нет????, что не так, её нет
В коде слово Bookmarks встречается 1 раз в контексте If Not (Bookmarks.Exists(bm)) Then, если это переменная, то не для меня
Bookmarks - это объект, который содержит в себе сведения о всех имеющихся в документе закладках и методы для работы с ними. Сделайте Add Watch из контекстного меню для этого объекта и проследите что он из себя представляет в момент непосредственно перед ошибкой.
Неизвестный
15.03.2010, 18:13
общий
Andrew Kovalchuk:
Сделал как Вы просили, мне лично ничего не понятно в строке Експрессион надпись Bookmarks
Ниже процедура FIO
ниже модуль NewMacros
Скриншот на эту ситуацию https://rfpro.ru/upload/1855
Что далее??

Неизвестный
15.03.2010, 19:38
общий
Ципихович Эндрю:
Цитата: 238244
Что далее??
Вы остановились на полпути. Теперь нажмите кнопку ОК и в нижней части экрана с кодом появится область для просмотра значения переменных. Вот она-то нам и будет нужна. В этой области можно будет просмотреть значения переменных и свойств.
Неизвестный
15.03.2010, 22:30
общий
Andrew Kovalchuk:
Значение не определено
Тип не определено
Контекст НьюМакросФИО
Что далее??? Так я стано префессионал, не боитесь, что форум будет не нужен??
Неизвестный
16.03.2010, 02:01
общий
Ципихович Эндрю:
Цитата: 238244
Значение не определено
Тип не определено
Контекст НьюМакросФИО
Правильное значение для поля Тип, в данном случае - Object/Bookmarks. Без документа в котором это у вас не работает сказать что-либо затруднительно - тестовый документ работает совершенно нормально.
Цитата: 238244
Так я стано префессионал, не боитесь, что форум будет не нужен??
Ну так еще одним грамотным человеком в мире станет больше . Разве ж это плохо? Чего здесь бояться? .
Неизвестный
16.03.2010, 19:15
общий
Andrew Kovalchuk:
Метод решения задачи мен понятен - от строки link.Code.Text
отнимаем что нужно, сколько нужно
А можно прямо присваивать переменную того, на что ссылается ссылка, ставить условие если ссылка ссылается на закладку и т. д.
Неизвестный
16.03.2010, 21:32
общий
Ципихович Эндрю:
Цитата: 238244
А можно прямо присваивать переменную того, на что ссылается ссылка, ставить условие если ссылка ссылается на закладку и т. д.
Я не понял вопроса. Ссылка это объект и, при желании, можно объявить переменную типа Field и сделать с ней то, что посчитаете необходимым. Если же вы хотите отобрать только те ссылки, которые ссылаются на закладки, то можно воспользоваться вот таким условным оператором
Код:
If (link.Type = wdFieldRef) Then ' если ссылка ссылается на закладку
' Здесь поместите код для исполнения
End If
Неизвестный
17.03.2010, 05:43
общий
Andrew Kovalchuk:
Имею в документе одну закладку и одну ссылку на неё, далее код:

For Each link In ActiveDocument.Fields
Код_поля_ссылки = Trim$(link.Code.Text)'здесь вижу что всё правильно
If (link.Type = wdFieldRef) Then Beep'звука нет, так как в правую сторону компилятор не заходит, почему??????
Next
Неизвестный
17.03.2010, 08:05
общий
Andrew Kovalchuk:
Извините меня, но
В своём вопросе я спросил как среди всех ссылок в документе удалить ссылки, сам текст этой ссылки, который на экране удалять не нужно

Неизвестный
17.03.2010, 17:26
общий
Цитата: 238244
Имею в документе одну закладку и одну ссылку на неё, далее код:

For Each link In ActiveDocument.Fields
Код_поля_ссылки = Trim$(link.Code.Text)'здесь вижу что всё правильно
If (link.Type = wdFieldRef) Then Beep'звука нет, так как в правую сторону компилятор не заходит, почему??????
Потому что тип ссылки отличный от wdFieldRef.
Неизвестный
17.03.2010, 17:32
общий
Ципихович Эндрю:
Цитата: 238244
Извините меня, но
В своём вопросе я спросил как среди всех ссылок в документе удалить ссылки, сам текст этой ссылки, который на экране удалять не нужно
Это легко исправить - код который удаляет ссылку замените приведенным:
Код:
If Not (Bookmarks.Exists(bm)) Then
link.Select
link.Delete
Selection.Range.Text = bm
End If
Неизвестный
18.03.2010, 16:31
общий
Andrew Kovalchuk:
Вы говорите
Потому что тип ссылки отличный от wdFieldRef
Но строкой выше
Код_поля_ссылки = Trim$(link.Code.Text)'здесь я вижу что всё правильно, что ссылка ссылается на закладку, так как я сам прежде чем прогонять строки поставил эту закладку, поставил ссылку, то есть я знаю, что ссылка ссылается не на документ нет в переменной Код_поля_ссылки что то вроде D:\
Тогда надо значит надо указать в условии If (link.Type = wdFieldRef) Or ???????? Then Beep' чтот именно????
Я писал: А можно прямо присваивать переменную того, на что ссылается ссылка
Ответ я не понял вопроса.
Вопрос в том, всё в Вашем решении отталкивается от переменной=link.Code.Text
Потом имея её Вы от строки отбрасывает столько то знаков, чтобы не ставить условие Like "*D:\\Рабочая папка\\ГК РФ.doc*", а напрямую ="D:\\Рабочая папка\\ГК РФ.doc"

Таже протестировав Ваш файл по этому вопросу я понял
Что пользователи могут ставить ссылку несколькими способами
Например часть текста выделив в документе и нажав Контрол + К и присвоить ссылку
или вставив поле вида { REF Начало\h } так вот мне также нужно учесть чтобы удалились все ссылки независимо каким способом они поставлены.
Неизвестный
18.03.2010, 20:57
общий
Ципихович Эндрю:
Цитата: 238244
Я писал: А можно прямо присваивать переменную того, на что ссылается ссылка
Ответ я не понял вопроса.
Вопрос в том, всё в Вашем решении отталкивается от переменной=link.Code.Text
Потом имея её Вы от строки отбрасывает столько то знаков, чтобы не ставить условие Like "*D:\\Рабочая папка\\ГК РФ.doc*", а напрямую ="D:\\Рабочая папка\\ГК РФ.doc"
Единственное общее, что есть между закладкой и ссылкой на нее - это наименование (текст) закладки. Так что выглядит вполне логичным связывать эти две вещи по общему признаку. Обычной практикой является присваивать что-либо (читай значение) ПЕРЕМЕННОЙ. Фраза "присваивать переменную того" не несет смысловой нагрузки.
Цитата: 238244
Вы говорите
Потому что тип ссылки отличный от wdFieldRef
Но строкой выше
Код_поля_ссылки = Trim$(link.Code.Text)'здесь я вижу что всё правильно, что ссылка ссылается на закладку, так как я сам прежде чем прогонять строки поставил эту закладку, поставил ссылку, то есть я знаю, что ссылка ссылается не на документ нет в переменной Код_поля_ссылки что то вроде D:\
Тогда надо значит надо указать в условии If (link.Type = wdFieldRef) Or ???????? Then Beep' чтот именно????
Чего вы добиваетесь функцией Trim$ мне непонятно. Ссылку, которую нужно исключить из удаления я отсекаю еще до того, как начинается работа с текстом ссылки.
Вопрос все также не понят.
Неизвестный
19.03.2010, 05:53
общий
Andrew Kovalchuk:
Тримом я ничего не добиваюсь, это привычка, я бы сказал хорошая, потому, что
переменная link.Code.Text может начинаться как " Гиперлинк...." так и "Гиперлинк..." применяю трим вариантов не остаётся всегда "Гиперлинк..."
Вам вопрос не понятен
Поясняю открываю документ, чистый документ редактором Ворд
Сам лично ставлю закладку "й"
Сам лично в любом месте набираю акрабадкабру
Сам лично выделяю её сам лично ставлю ссылку и указываю, эту ссылку на место в документе, закладку "й"
Всё это делаю в хорошем здравии, осознанно
Накжимаю Альт Эф 11
В код вставляю 3 строки
1For Each link In ActiveDocument.Fields
2Код_поля_ссылки = Trim$(link.Code.Text)
3If (link.Type = wdFieldRef) Then Beep
уйдя со второй строки наведя курсор на "2Код_поля_ссылки " убеждаюсь, что всё идёт по плану
пройдя третью строку звука нет, так как в правую сторону компилятор не заходит, почему??????
Ваш ответ: Потому что тип ссылки отличный от wdFieldRef
Я и говорю тогда надо указать, как теперь я знаю
If (link.Type = 3) Or (link.Type = 88) Then Beep '
теперь подскажите
link.Type = 3 = wdFieldRef
link.Type = 88 = ?????
Я также спрашиваю в таком случае пишем
If (link.Type = 3) Or (link.Type = 88) Then На_что_ссылается_ссылка=??????? и я насколько понял без отбрасывания знаков от строки link.Code.Text не обойтись????

Неизвестный
19.03.2010, 16:28
общий
Цитата: 238244
выделяю её сам лично ставлю ссылку и указываю, эту ссылку на место в документе, закладку "й"
Ссылки в документе я всегда ставил через Вставка-Ссылка-Перекрестная ссылка... Следуя таким путем я всегда получал поле {REF ...}. Судя по тому, что вы получаете поле {HYPERLINK ...} вы используете вариант Вставка-Гиперссылка-Связать с: местом в документе.
Цитата: 238244
Я и говорю тогда надо указать, как теперь я знаю
If (link.Type = 3) Or (link.Type = 88) Then Beep '
теперь подскажите
link.Type = 3 = wdFieldRef
link.Type = 88 = ?????
Подозреваю, что wdFieldHyperlink.
Цитата: 238244
Я также спрашиваю в таком случае пишем
If (link.Type = 3) Or (link.Type = 88) Then На_что_ссылается_ссылка=???????
Ссылка у вас уже содержится в переменной link. Для меня остается загадкой - что вы хотите получить в переменной На_что_ссылается_ссылка - могу подозревать, что саму закладку. Вот только непонятно для чего. В задаче не было необходимости манипуляций закладками - только ссылками на них.
Цитата: 238244
и я насколько понял без отбрасывания знаков от строки link.Code.Text не обойтись????
Я бы сказал не "отбрасывания знаков", а "разбора (parsing) строки" ссылки (что может в итоге стать вполне самостоятельной задачей ).
Неизвестный
19.03.2010, 17:27
общий
Andrew Kovalchuk:
и я насколько понял без "разбора (parsing) строки" ссылки не обойтись???
Точно так в строке
If (link.Type = 3) Or (link.Type = 88) Then На_что_ссылается_ссылка=???????
Я хочу получить На_что_ссылается_ссылка=Имя закладки или имя документа вида, например D:\\Рабочая папка\\ГРОК РФ.doc, или нак папку, вида C:\Documents and Settings\user1\Мои документы\catalog
Неизвестный
19.03.2010, 21:44
общий
Цитата: 238244
и я насколько понял без "разбора (parsing) строки" ссылки не обойтись???
Не буду утверждать наверняка - может и существуют способы сделать эти другими путями - но мне таковые неизвестны.
[q=23824Точно так в строке If (link.Type = 3) Or (link.Type = 88) Then На_что_ссылается_ссылка=???????
Я хочу получить На_что_ссылается_ссылка=Имя закладки или имя документа вида, например D:\\Рабочая папка\\ГРОК РФ.doc, или нак папку, вида C:\Documents and Settings\user1\Мои документы\catalog [/q]Так это же и есть часть тела ссылки, которую нужно "достать" из объекта "ссылка".
Неизвестный
19.03.2010, 22:07
общий
Andrew Kovalchuk:
Я согласен, что это же и есть часть тела ссылки, которую нужно "достать" из объекта "ссылка"
Не хочу доставать
Мое мнение таково Ворд есть 2003, 2007, 2010 и будет например 2013
Но ВБА в нём не меняется в лучшую сторону, плохо
По этому вопросу уже всё выяснили, что надо задать другой вопрос его номер 177351
Форма ответа