Word 2016. Возможно ли сделать такое? По команде с ленты: Вкладка Ссылки/Сноски/Следующая сноска программа находит знак сноски, и курсор становится слева от него. Больше ничего не происходит; можно навести на эту сноску указатель мыши, и появится всплывающая подсказка. Мне всегда казалось это недостаточным, и всегда хотелось, чтобы всплывающая подсказка появлялась не после наведения указателя на сноску, а сразу после выполнения указанной команды. То есть, суть мечты: назначаешь для FootnotePreviousWord и FootnoteNextWord горячие клавиши (например: Alt+O и Alt+>) и переходишь по сноскам, сразу читая подсказки к ним. Красиво и конкретно подсказать никто не захотел, и пришлось искать выход окольными путями, объединяя помощь с разных форумов. В результате получилось вот что: [vba]
Код
Sub СноскаОбычнаяПред() Dim cX As Long, cY As Long, i As Byte If ActiveDocument.Footnotes.Count = 0 Then lRetVal = MsgboxOKDrop("Обычных сносок еще никто не вставил!" & vbCrLf & _ "Возможно, есть концевые сноски!", vbOKOnly + vbInformation, "ОТСУТСТВИЕ СНОСОК В ТЕКСТЕ", interval) ElseIf Selection.StoryType = wdFootnotesStory Then ' Для концевых выбран другой вариант выделения Application.Run "GoToPreviousFootnote" Else ' Если курсор в основном тексте Application.Run "GoToPreviousFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range ' На данный момент (02.02.2020) это самый действенный цикл для более-менее надежного всплытия подсказок к ссылкам, сноскам, примечаниям и гиперссылкам. For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах (Знать бы еще, что тут происходит. Но оно работает!) Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i Set r = Selection.Range If (r.Start <> Selection.Start) Or (r.End <> Selection.End) Then ElseIf Selection.Characters.First.Footnotes.Count <= 0 Then lRetVal = MsgboxOKDrop("Выше обычных сносок нет!" & vbCrLf & _ "Попробуй поискать вниз!", vbOKOnly + vbInformation, "ВСЕ ОБЫЧНЫЕ СНОСКИ НИЖЕ", interval) Exit Sub End If End If End Sub
[/vba] [vba]
Код
Sub СноскаОбычнаяСлед() Dim cX As Long, cY As Long, i As Byte If ActiveDocument.Footnotes.Count = 0 Then lRetVal = MsgboxOKDrop("Обычных сносок еще никто не вставил!" & vbCrLf & _ "Возможно, есть концевые сноски!", vbOKOnly + vbInformation, "ОТСУТСТВИЕ СНОСОК В ТЕКСТЕ", interval) ElseIf Selection.StoryType = wdFootnotesStory Then ' Для концевых выбран другой вариант выделения Application.Run "GoToNextFootnote" Else ' Если курсор в основном тексте Application.Run "GoToNextFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах (Знать бы еще, что тут происходит. Но оно работает!) Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i Set r = Selection.Range If (r.Start <> Selection.Start) Or (r.End <> Selection.End) Then ElseIf Selection.Characters.First.Footnotes.Count <= 0 Then lRetVal = MsgboxOKDrop("Ниже обычных сносок нет!" & vbCrLf & _ "Попробуй поискать вверх!", vbOKOnly + vbInformation, " ВСЕ ОБЫЧНЫЕ СНОСКИ ВЫШЕ", interval) Exit Sub End If End If End Sub
[/vba] В этих макросах ключевым моментом является цикл (мало для меня понятный), но подбором значений я добился, что подсказки к сноскам каким-то чудом появляются, как будто на них наводится мышь. Что интересно, достигнутый эффект оказался полезным для перехода и по концевым сноскам, а также по примечаниям и гиперссылкам (при замене соответствующих команд). Одно плохо: не всегда четко срабатывает. Что-то иногда "пугает" всплывающие подсказки, и они всплывают нестабильно, причем, по-разному для сносок, концевых сносок, гиперссылок и примечаний. Вопрос: можно ли и как сделать все, что задумано, правильными средствами, а не моей галиматьей? Может, кто-нибудь как следует въедет в тему и догадается?
Word 2016. Возможно ли сделать такое? По команде с ленты: Вкладка Ссылки/Сноски/Следующая сноска программа находит знак сноски, и курсор становится слева от него. Больше ничего не происходит; можно навести на эту сноску указатель мыши, и появится всплывающая подсказка. Мне всегда казалось это недостаточным, и всегда хотелось, чтобы всплывающая подсказка появлялась не после наведения указателя на сноску, а сразу после выполнения указанной команды. То есть, суть мечты: назначаешь для FootnotePreviousWord и FootnoteNextWord горячие клавиши (например: Alt+O и Alt+>) и переходишь по сноскам, сразу читая подсказки к ним. Красиво и конкретно подсказать никто не захотел, и пришлось искать выход окольными путями, объединяя помощь с разных форумов. В результате получилось вот что: [vba]
Код
Sub СноскаОбычнаяПред() Dim cX As Long, cY As Long, i As Byte If ActiveDocument.Footnotes.Count = 0 Then lRetVal = MsgboxOKDrop("Обычных сносок еще никто не вставил!" & vbCrLf & _ "Возможно, есть концевые сноски!", vbOKOnly + vbInformation, "ОТСУТСТВИЕ СНОСОК В ТЕКСТЕ", interval) ElseIf Selection.StoryType = wdFootnotesStory Then ' Для концевых выбран другой вариант выделения Application.Run "GoToPreviousFootnote" Else ' Если курсор в основном тексте Application.Run "GoToPreviousFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range ' На данный момент (02.02.2020) это самый действенный цикл для более-менее надежного всплытия подсказок к ссылкам, сноскам, примечаниям и гиперссылкам. For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах (Знать бы еще, что тут происходит. Но оно работает!) Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i Set r = Selection.Range If (r.Start <> Selection.Start) Or (r.End <> Selection.End) Then ElseIf Selection.Characters.First.Footnotes.Count <= 0 Then lRetVal = MsgboxOKDrop("Выше обычных сносок нет!" & vbCrLf & _ "Попробуй поискать вниз!", vbOKOnly + vbInformation, "ВСЕ ОБЫЧНЫЕ СНОСКИ НИЖЕ", interval) Exit Sub End If End If End Sub
[/vba] [vba]
Код
Sub СноскаОбычнаяСлед() Dim cX As Long, cY As Long, i As Byte If ActiveDocument.Footnotes.Count = 0 Then lRetVal = MsgboxOKDrop("Обычных сносок еще никто не вставил!" & vbCrLf & _ "Возможно, есть концевые сноски!", vbOKOnly + vbInformation, "ОТСУТСТВИЕ СНОСОК В ТЕКСТЕ", interval) ElseIf Selection.StoryType = wdFootnotesStory Then ' Для концевых выбран другой вариант выделения Application.Run "GoToNextFootnote" Else ' Если курсор в основном тексте Application.Run "GoToNextFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах (Знать бы еще, что тут происходит. Но оно работает!) Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i Set r = Selection.Range If (r.Start <> Selection.Start) Or (r.End <> Selection.End) Then ElseIf Selection.Characters.First.Footnotes.Count <= 0 Then lRetVal = MsgboxOKDrop("Ниже обычных сносок нет!" & vbCrLf & _ "Попробуй поискать вверх!", vbOKOnly + vbInformation, " ВСЕ ОБЫЧНЫЕ СНОСКИ ВЫШЕ", interval) Exit Sub End If End If End Sub
[/vba] В этих макросах ключевым моментом является цикл (мало для меня понятный), но подбором значений я добился, что подсказки к сноскам каким-то чудом появляются, как будто на них наводится мышь. Что интересно, достигнутый эффект оказался полезным для перехода и по концевым сноскам, а также по примечаниям и гиперссылкам (при замене соответствующих команд). Одно плохо: не всегда четко срабатывает. Что-то иногда "пугает" всплывающие подсказки, и они всплывают нестабильно, причем, по-разному для сносок, концевых сносок, гиперссылок и примечаний. Вопрос: можно ли и как сделать все, что задумано, правильными средствами, а не моей галиматьей? Может, кто-нибудь как следует въедет в тему и догадается?auto-teacher
auto-teacher
Сообщение отредактировал auto-teacher - Четверг, 02.07.2020, 13:40
krosav4ig, очень сорри! Сноски-то не я придумал, так что можно было в любом своем доке самому их навставлять штук несколько и походить по ним. Но если именно без моего примера никак нельзя разобраться, то гружу "Файл-пример со сносками" и теперь уж очень надеюсь, что гениальное решение найдется обязательно. И я извиняюсь еще за то, что случайно оставил в макросах код самогаснущих сообщений, для появления которых нужны дополнительные условия. Без кода сообщений макросы выглядят так: [vba]
Код
Sub СноскаОбычнаяПредыдущая() Dim cX As Long, cY As Long, i As Byte Application.Run "GoToPreviousFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i End Sub
[/vba] [vba]
Код
Sub СноскаОбычнаяСледующая() Dim cX As Long, cY As Long, i As Byte Application.Run "GoToNextFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i End Sub
[/vba] Повторюсь: я не до конца понимаю, как действует цикл, который шевелит курсор. Когда я где-то сдувал это все по отдельности, я предположил: можно будет подобрать количество скачков курсора по вертикали и по горизонтали, и задержку, имитируя наведение мыши на знак сноски. В итоге цель мультипликации как бы достигнута, но я чувствую, что с точки зрения программирования на VBA это бред.
krosav4ig, очень сорри! Сноски-то не я придумал, так что можно было в любом своем доке самому их навставлять штук несколько и походить по ним. Но если именно без моего примера никак нельзя разобраться, то гружу "Файл-пример со сносками" и теперь уж очень надеюсь, что гениальное решение найдется обязательно. И я извиняюсь еще за то, что случайно оставил в макросах код самогаснущих сообщений, для появления которых нужны дополнительные условия. Без кода сообщений макросы выглядят так: [vba]
Код
Sub СноскаОбычнаяПредыдущая() Dim cX As Long, cY As Long, i As Byte Application.Run "GoToPreviousFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i End Sub
[/vba] [vba]
Код
Sub СноскаОбычнаяСледующая() Dim cX As Long, cY As Long, i As Byte Application.Run "GoToNextFootnote" ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Range For i = 0 To 1 SetCursorPos cX + i, cY + i Dim Start Start = Timer ' текущее время в секундах Do While Timer < Start + 0.1 Loop Next i SetCursorPos cX + i, cY + i End Sub
[/vba] Повторюсь: я не до конца понимаю, как действует цикл, который шевелит курсор. Когда я где-то сдувал это все по отдельности, я предположил: можно будет подобрать количество скачков курсора по вертикали и по горизонтали, и задержку, имитируя наведение мыши на знак сноски. В итоге цель мультипликации как бы достигнута, но я чувствую, что с точки зрения программирования на VBA это бред.auto-teacher