vba Word создает переменную со значением текста между 2 точками курсора - PullRequest
0 голосов
/ 28 августа 2018

Мы пытаемся пересмотреть документы rtf, созданные программным обеспечением Molecular Device. Вот пример части одного из этих документов:

Протокол 'C: \ ALL USERS \ Params \ Current \ 2017 Opto Params \ 0 VoltageClampContinuous.pro' открыт. C: \ ALL USERS \ Alan \ 2018_07_11 \ 2018_07_11_0000.abf запущен в 00:19:48 во время секундомера.

Так что сейчас - все, что я пытаюсь сделать, это автоматически найти дату эксперимента (в данном случае = "2018_07_11_") Моя подпрограмма до сих пор может найти правильные позиции курсора, но как мне выбрать текст между двумя позициями курсора?

Ниже приведено то, что у меня есть выражение CursorPosition, конечно, неверно - это то, что я пытаюсь исправить.

Sub FindfilenameDate()

    txt_prior_to_expDate = "\"
    txt_after_expDate = "0000"
    With ActiveDocument.Content.Find
            .Text = txt_after_expDate
            .Forward = True
            .Execute
            If .Found = True Then
                .Parent.Select
                Set after_rng = Selection.Range
                expDateEnd_cursorPos = after_rng.Start - 1
                Selection.HomeKey Unit:=wdStory, Extend:=wdExtend
                With Selection.Find
                    .Text = txt_prior_to_expDate
                    .Forward = False
                    .Execute
                    If .Found = True Then
                        .Parent.Select
                        Set charBefore_expDate = Selection.Range
                        expDateStart_cursorPos = charBefore_expDate.Start + 1
                    End If
                End With
            End If
    End With
   'expDate = CursorPosition(expDateStart_cursorPos, expDateEnd_cursorPos)
'MsgBox ("expDate = " & expDate) 'DELETEMSGBOX
End Sub

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Хотя неясно, почему вы используете строку даты, заканчивающуюся на _0000, а не дату, которая является именем родительской папки, гораздо более простой подход для отдельной даты будет выглядеть так:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[0-9]{4}_[0-9]{2}_[0-9]{2}_0000"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  If .Find.Found = True Then MsgBox "expDate = " & Split(.Text, "_0000")(0)
End With
Application.ScreenUpdating = True
End Sub

И, для всех таких дат в документе:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[0-9]{4}_[0-9]{2}_[0-9]{2}_0000"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found = True
    MsgBox "expDate = " & Split(.Text, "_0000")(0)
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub
0 голосов
/ 28 августа 2018

Трюк с чем-то вроде этого заключается в работе с несколькими Range объектами. Мое личное предпочтение состоит в том, чтобы объявлять Range для каждой отдельной вещи, с которой нужно работать, вместо того, чтобы пытаться вычислить минимум и повторно использовать Range - по крайней мере, для исходного кода и в целях тестирования.

Затем для этой задачи я использую четыре диапазона: 1) для исходного поиска, 2) для конца требуемой "позиции курсора", 3) для второго поиска, 4) для конечной "позиции курсора" ».

Другие важные понятия - как «свернуть» диапазон и как «скопировать» его.

Свертывание диапазона - это как нажатие клавиши со стрелкой вправо или влево с выделением, так что это «точка» и ничего не содержит. Диапазон может быть свернут до начальной или конечной позиции.

Копирование диапазона (установка одного диапазона на другой) необходимо выполнить с помощью свойства Duplicate, чтобы копия не зависела от оригинала. Иначе, когда один из них изменяется, другой тоже меняется.

Sub FindfilenameDate()
    Dim rngFind As Word.Range, rngBefore As Word.Range
    Dim rngAfter As Word.Range, rngFound As Word.Range

    txt_prior_to_expDate = "\"
    txt_after_expDate = "0000"
    Set rngFind = ActiveDocument.content
    With rngFind.Find
            .Text = txt_after_expDate
            .Forward = True
            .Execute
            If .found = True Then

                Set rngAfter = rngFind.Duplicate
                rngAfter.Collapse wdCollapseStart
                Set rngBefore = rngFind.Duplicate
                rngBefore.Collapse wdCollapseStart
                With rngBefore.Find
                    .Text = txt_prior_to_expDate
                    .Forward = False
                    .Execute
                    If .found = True Then
                        Set rngFound = rngBefore.Duplicate
                        rngFound.Collapse wdCollapseEnd
                        rngFound.End = rngAfter.Start
                        'rngFound.Select
                    End If
                End With
            End If
    End With
   'expDate = CursorPosition(expDateStart_cursorPos, expDateEnd_cursorPos)
    MsgBox ("expDate = " & rngFound.Text) 'DELETEMSGBOX
End Sub
...