Создать новый объект выделения во время выполнения в слове vba - PullRequest
1 голос
/ 03 апреля 2009

Я задавал этот вопрос ранее, но не думаю, что был достаточно ясен.

Мне нужно написать макрос Word VBA, который будет предлагать пользователю выбрать какой-либо текст, выделив его после запуска макроса, а затем обработать новый выбор. Этот процесс будет повторяться неизвестное количество раз в макросе.

Единственная проблема, с которой я столкнулся, - это выяснить, как заставить макрос VBA приостановить действие и позволить пользователю сделать этот выбор. Если кто-то знаком с AutoCAD VBA, я ищу эквивалент AcadSelectionSet.SelectOnScreen метода. Это кажется настолько очевидным и основополагающим, но я просто не могу найти ничего в файлах справки Microsoft или в поиске в Интернете, который бы показал мне, как это сделать. Пожалуйста, помогите, если можете!

Ответы [ 2 ]

1 голос
/ 05 апреля 2009

Должны ли вы смотреть на WindowSelectionChange событие Application объекта?

В специальном модуле ThisDocument вам нужен код, подобный следующему:

Public WithEvents app As Application

Private Sub app_WindowSelectionChange(ByVal Sel As Selection)

MsgBox "The selection has changed"

End Sub

Очевидно, замените MsgBox полезным кодом и используйте параметр Sel, чтобы получить доступ к выбору. Если вы хотите попробовать другие события, используйте выпадающие списки в верхней части ThisDocument module

Чтобы настроить его, вам нужен такой макрос в обычном кодовом модуле:

Sub setUpApp()

Set ThisDocument.app = ThisDocument.Application

End Sub

После однократного запуска setUpApp событие app_WindowSelectionChange будет срабатывать при каждом изменении выбора

0 голосов
/ 30 апреля 2009

Вы можете использовать немодальную форму, чтобы ваш макрос продолжал работать, пока не будет выполнено определенное условие:

Дизайнер форм:

  • Добавить форму.
  • Добавить одну кнопку.
  • Добавить одну метку.

Код формы:

Option Explicit

Dim m_stopHere As Boolean
Dim m_timesDone As Long

Private Sub CommandButton1_Click()

    m_timesDone = m_timesDone + 1
    m_stopHere = Not DoStuff(m_timesDone)

    Me.Caption = "DoStuff was called " & m_timesDone & " time(s)."

       If m_stopHere Then
    MsgBox "Processing finished, closing form..."
    Unload Me
   End If
End Sub

Private Function DoStuff(times As Long) As Boolean

    Dim myCondition As Boolean

    If times < 5 Then
    MsgBox "You selected: " & Selection.Text
    Selection.Collapse wdCollapseEnd
    myCondition = True
    Else
    Me.Label1.Caption = "No more selections, thanks!"
    End If

    DoStuff = myCondition
End Function

Private Sub UserForm_Initialize()
    Me.Label1.Caption = "Please select some text in Word and press the button."
End Sub

Другой кодовый модуль:

Sub StopAndGo()
    UserForm1.Show vbModeless
End Sub
...