Уважаемые программисты!
Фактически с вашими советами по моей теме уже почти все сделано (и я тащусь от счастья!), но вы же сами и недовольны, что какого-то блеска в коде не хватает.
Задачу о подсказках я выше подробно описывал, поэтому сейчас подробнее скажу об условиях (о ветвях, наверное) выполнения.
Цель: использовать в документе с большим количеством сносок, ссылок и примечаний три команды Word или их менее сложные заменители посредством горячих клавиш.
На примере обычных сносок (потому что переделать для концевых сносок, у меня мозгов должно хватить) опишу еще раз.
Так как такие команды есть, то я и взял их на вооружение, но с желанием усовершенствовать.
1. GoToPreviousFootnote - ПредСноска - перескок к предыдущей сноске.
Нажимаю Alt+Щ.
Должны выполняться такие условия:
• Если обычных сносок в документе нет - ничего не происходит, кроме сообщения об этом, которое после появления (на секундочку) лучше само бы и закрылось (не знаю, есть ли такая фишка с таймером).
• Если курсор в основном тексте, то курсор перескакивает к знаку предыдущей сноски, и подсказка (после моей мультипликации) всплывает,
а Если курсор в области сносок - курсор просто перескакивает выше к знаку пред. сноски (здесь мультипликация не нужна, и выделять текст сноски ни к чему - именно так делает штатная команда).
• Если сноска самая первая, - об этом сообщается в окне, но немного не так, как вы написали.
По вашим советам сначала появлялось сообщение, а после нажатия "ОК" всплывала подсказка. Это же неправильно? Сообщение должно появляться только после следующей попытки искать ниже последней сноски: "Успокойся, дружок! Это была последняя сноска!" Так будет логичней.
2. ViewFootnoteArea - СноскиОбычные - перескок между знаками текущей сноски из области сносок в основной текст или наоборот (именно так делает команда).
Нажимаю Alt+Д.
Если сносок нет - сообщение об этом, которое лучше бы через секунду само и исчезло.
Здесь надо сделать пояснение. В режиме разметки эта команда очень удобно делает перескок именно между знаками текущей сноски - туда-сюда. А вот в режиме Черновика для области сносок открывается подокно: и если в нем сделать переход к другой сноске, то потом ViewFootnoteArea подокно закрывает и курсор скачет куда попало.
3. GoToNextFootnote - СледCноска - перескок к следующей сноске.
Нажимаю Alt+Ю.
И все также, как для ПредСноска.
Что касается гиперссылок, к которым у меня с вашей помощью (с моей мультипликацией) также стали сами загораться подсказки, то хотелось бы также немного добавить операторов в макрос.
PrevField - ПредГиперссылка - перескок к предыдущей гиперссылке.
Если в доке не гиперссылок - сообщение об этом, а Если пришли к первой, то сообщение об этом и предложение пройтись этой же командой с самого низу (по кругу, как это устроено для исправлений), например: "Это была первая гиперссылка в тугаменте. Не желаете ли, Сэр, начать просмотр гиперссылок с конца?"
Из предложенных вами, уважаемые знатоки, кодов в настоящий момент я работаю с такими опробованными макросами:
Sub СноскиОбычные()
Set footnoterange = Nothing
On Error Resume Next
Set footnoterange = ActiveDocument.StoryRanges(wdFootnotesStory)
On Error GoTo 0
If footnoterange Is Nothing Then
MsgBox "В документе нет обычных сносок"
Else
Application.Run "ViewFootnoteArea"
End If
End Sub
Sub СледСноска()
'Определить сначала, где курсор - в области концевых сносок или нет
Dim cX As Long, cY As Long, i As Byte
Dim selrange As Range
Dim footnoterange As Range
Dim selinfootnotes As Boolean
Set selrange = Selection.Range
Set footnoterange = Nothing
On Error Resume Next
Set footnoterange = ActiveDocument.StoryRanges(wdFootnotesStory)
On Error GoTo 0
If footnoterange Is Nothing Then
MsgBox "В документе нет обычных сносок"
Else
selinfootnotes = selrange.InRange(footnoterange)
If selinfootnotes Then
Application.Run "GoToNextFootnote"
Else
Application.Run "GoToNextFootnote"
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range
For i = 0 To 2
SetCursorPos cX + i, cY + i
Dim Start
Start = Timer ' текущее время в секундах
Do While Timer < Start + 0.05
Loop
Next i
End If
End If
End Sub
Sub СледСноска()
' Выбран другой вариант кода. См. ниже
Dim cX As Long, cY As Long, i As Byte
On Error Resume Next
On Error GoTo 0
If Selection.StoryType = wdFootnotesStory Then ' Если курсор в области простых сносок, подсказки не будет
Application.Run "GoToNextFootnote"
Else ' Подразумевается, что курсор в основном тексте, - подсказка будет
Application.Run "GoToNextFootnote"
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range
For i = 0 To 2
SetCursorPos cX + i, cY + i
Dim Start
Start = Timer ' текущее время в секундах
Do While Timer < Start + 0.05
Loop
Next i
End If
End Sub
Sub СледующаяСноска()
Dim cX As Long, cY As Long, i As Byte
If Selection.Information(wdInFootnote) Then
Application.Run "GoToNextFootnote"
Else ' Если курсор в основном тексте
Application.Run "GoToNextFootnote"
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range
For i = 0 To 2
SetCursorPos cX + i, cY + i
Dim Start
Start = Timer ' текущее время в секундах
Do While Timer < Start + 0.05
Loop
Next i
End If
End Sub
Sub СледКонцеваяСноска()
' С условиями перехода в зависимости от области текста и сообщением о последней найденной концевой сноске
Dim cX As Long, cY As Long, i As Byte
Dim en As Endnote
Dim en_cnt As Long
Dim enr As Range
en_cnt = ActiveDocument.Endnotes.Count
On Error Resume Next
On Error GoTo 0
If Selection.StoryType = wdEndnotesStory Then ' Если курсор в области концевых сносок, после перехода подсказки не ожидается
Application.Run "GoToNextEndnote"
Else ' Следовательно, подразумевается, что раз курсор не в области сносок, значит, - в основном тексте, - подсказка должна будет всплыть, как дрессированный дельфин
If en_cnt > 0 Then ' Вариант перехода к концевой сноске с имитацией движения мыши
Application.Run "GoToNextEndnote"
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range ' Находим координаты курсора...
For i = 0 To 2 ' ... даем их указателю мыши...
SetCursorPos cX + i, cY + i
Dim Start ' ... и сдвигаем этим циклом по таймеру указатель вправо-вниз для имитации движения.
Start = Timer ' текущее время в секундах
Do While Timer < Start + 0.05
Loop
Next i
Set enr = Selection.Range
For Each en In ActiveDocument.Endnotes
If en.Reference.Start = enr.Start Then
If en.Index = en_cnt Then
MsgBox "Дальше можно не искать! Это последняя концевая сноска в документе!"
End If
End If
Next
End If
End If
End Sub
Если тут что-то лишнее, то я уж и не разберусь.
Для гиперссылок:
Sub СледГиперссылка()
Dim cX As Long, cY As Long, i As Byte
Selection.GoTo What:=wdGoToField, Which:=wdGoToNext, Count:=1, Name:="HYPERLINK"
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range
For i = 0 To 2 ' Хорошо всплывают при масштабе 100%. Для больших масштабов надо двигать на 15
SetCursorPos cX + i, cY + i
Dim Start
Start = Timer ' текущее время в секундах
Do While Timer < Start + 0.1
Loop
Next i
End Sub
Если вы мне не вставите их в желаемые условия и ветви, то я не скоро изменю и буду пока как есть пользоваться.