• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

[VBA] Курсор в поле сноски или в основном тексте?

auto-teacher

Новый пользователь
Сообщения
25
Симпатии
4
#1
Плохо владею VBA, не знаю объектов Word.
Помогите, please, выполнить условия в макрокоманде.

Sub Макрос()
Если курсор в основном тексте, то:
Операторы 1
Если курсор в тексте сносок, то:
Операторы 2
End Sub
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,682
Симпатии
5,575
#2
VB.NET:
'для обычной сноски
Debug.Print Selection.Information(wdInFootnote)

'для концевой сноски
Debug.Print Selection.Information(wdInEndnote)
 

auto-teacher

Новый пользователь
Сообщения
25
Симпатии
4
#3
Извиняюсь!
Я не могу отсюда понять, как обеспечить условный переход.
Наверное, должно быть как-то так:

Sub СледСноска()
If условие ' Если курсор в области обычных сносок
Операторы 1
Else ' Если курсор в основном тексте
Операторы 2
End If
End Sub
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,682
Симпатии
5,575
#4
VB.NET:
Sub СледСноска()
    If Selection.Information(wdInFootnote) then
        msgbox "Операторы 1"
    Else ' Если курсор в основном тексте
        msgbox "Операторы 2"
    End If
End Sub
 

auto-teacher

Новый пользователь
Сообщения
25
Симпатии
4
#5
Супер! Действует классно!
Спасибо!
Удивительно, что мозги у программистов по-разному работают!
На другом форуме мне прислалали вместо этого:
If Selection.Information(wdInFootnote) Then

вот такое:
If Selection.StoryType = wdFootnotesStory Then

Великолепно получается и так, и так.
Даже не знаю, какому варианту отдать предпочтение.
Остаются еще вопросы к этой теме.
Как описать условия действий в этих случаях:
1. Если нет сносок, что делать?
2. Если достиг первой сноски, что сообщить, чтобы не тыркаться напрасно?
3. Если достиг последней сноски, что сообщить?
Пожалуй, придется для обычных сносок выбрать один вариант, а для концевых другой, чтобы оба работали. Не так ли?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,682
Симпатии
5,575
#6
В этом случае у VBA спрашивают - "Курсор (выделенный текст) относится к сноске?"
If Selection.StoryType = wdFootnotesStory Then
А в этом проверяется тип текста.
Что по факту приводит к одинаковому результату.

Пожалуй, придется для обычных сносок выбрать один вариант, а для концевых другой, чтобы оба работали. Не так ли?
Обобщить всегда можно, но проще для реализации и понимания будет прописать для каждой отдельный код, т.к. это разные объекты.
VB.NET:
'Если нет сносок
If ActiveDocument.Footnotes.Count = 0 Then
2. Если достиг первой сноски, что сообщить, чтобы не тыркаться напрасно?
3. Если достиг последней сноски, что сообщить?
Здесь будет чуть по-сложнее:
VB.NET:
Sub test()
    'кол-во сносок > 0 и курсор находится в основном документе?
    If ActiveDocument.Footnotes.Count <> 0 And Selection.StoryType = wdMainTextStory Then
       
        'позиция курсора находится на позиции 1-й сноски?
        If (Selection.Start = ActiveDocument.Footnotes(1).Reference.Start) Then
       
            MsgBox "Достигли первой сноски."
           
        ElseIf (Selection.Start = ActiveDocument.Footnotes(ActiveDocument.Footnotes.Count).Reference.Start) Then
       
            MsgBox "Достигли последней сноски."
       
        End If
    End If
End Sub
 

auto-teacher

Новый пользователь
Сообщения
25
Симпатии
4
#7
Требуется время, чтобы переварить и вставить, куда надо...
 
Сверху Снизу