Создание очень маленького диапазона внутри очень большого текстового документа - PullRequest
0 голосов
/ 27 мая 2020

Я вставил сюда среднюю часть большего кода, чтобы вы, ребята, могли видеть его большую часть, но строка, которая вызывает у меня некоторые проблемы, находится во второй части и выглядит следующим образом: Set wordRng2 = ActiveDocument.Paragraphs(parNmbr).Range(Start:=startPos, End:=endPos) .

Есть очень большой документ, в котором примерно 200 абзацев. Поэтому, используя wordRng.SetRange Start:=ActiveDocument.Paragraphs(parNmbr).Range.Start, End:=ActiveDocument.Paragraphs(parNmbr).Range.End, я извлекаю 23-й абзац и делаю из него диапазон. В этом абзаце есть данные, которые мне нужны. Это дата, но написанная словом месяц в Poli sh, поэтому ее трудно извлечь с помощью подстановочных знаков слов.

У меня есть несколько постоянных слов, которые всегда находятся в одном месте в этом абзаце . Я назначаю их переменным textToFind1 и textToFind2.

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

With wordRng.Find
      .Text = "<[A-Z]{3} [0-9]{6}>"            'you can use the tags < and > to mark the start and end of a word, respectively.
      .MatchWildcards = True     'these wildcards refer to polish ID number that is: ABC 123456 or BCF 765432 - it works fine;
      .MatchCase = False           'this part of the code works fine;
      .Wrap = wdFindStop
      .Forward = True
      .Execute
      If .Found = True Then
        idNmbr = wordRng
        idNmbr = Trim$(idNmbr)
        intCol = Application.WorksheetFunction.match("nr_dokumentu", Worksheets("data").Range("1:1"), 0)    'Range("1:1") is row 1.
        mySheet.Cells(lngRow, intCol) = idNmbr                                                              'lngRow = lngRow + 1.
      End If
   End With

   'InStr function returns a Variant (Long) specifying the position of the first occurrence of one string within another.
   wordRng.SetRange Start:=ActiveDocument.Paragraphs(parNmbr).Range.Start, End:=ActiveDocument.Paragraphs(parNmbr).Range.End
   Debug.Print wordRng
   startPos = InStr(1, wordRng, textToFind1) - 1                  'here we get 217, we're looking 4 id validity date;
   endPos = InStr(startPos, wordRng, textToFind2) - 1             'here we get 247, we're looking 4 id validity date;
   Set wordRng2 = ActiveDocument.Paragraphs(parNmbr).Range(Start:=startPos, End:=endPos)            'Set myRange = ActiveDocument.Range(Start:=pos, End:=pos2)
   'Wrong number of arguments or invalid property assignment error.
   'at the moment "wordRng2" variable holds long date with month written as a word = października, listopada, grudnia;
   Debug.Print wordRng
   Debug.Print wordRng2
   wordRng2 = Trim$(wordRng2)
   Debug.Print wordRng2

Я установил вторую переменную диапазона, которая должна содержать именно ту строку, которую мне нужно извлечь, с возможным конечным пробелом в конце. Но строка, которую я использую для этого: Set wordRng2 = ActiveDocument.Paragraphs(parNmbr).Range(Start:=startPos, End:=endPos) возвращает ошибку «Неверное количество аргументов или недопустимое присвоение свойств».

В примере, который я пробую, он должен содержать 18 или 19 символов.

enter image description here

Даже если я изменю это ошибочная строка в:

Set wordRng2 = ActiveDocument.Paragraphs(parNmbr).Range            
wordRng2.SetRange Start:=startPos, End:=endPos

все же я получаю строку между 217 и 247 позициями от начала всего документа, а не строку между этими значениями в 23-м абзаце.

1 Ответ

2 голосов
/ 28 мая 2020

Из того, что вы описываете, вам не нужно ничего сложнее, чем:

With wordapp.ActiveDocument.Paragraphs(23).Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<[0-9]{1,2} [cgklmpsw][airtuwz][eijprstuyzź]*> [0-9]{4}>"
    .Replacement.Text = ""
    .Format = False
    .Forward = True
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  If .Find.Found = True Then MsgBox .Text
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...