Ошибка выдачи скрипта Regex vba: ошибка времени выполнения 9... Нижний индекс вне диапазона

У меня есть документ Word с некоторыми цифрами, указанными в сносках. и я экспортирую эти ссылки в виде файла csv.

Sub FindNumber()
Dim exp, exp1 As RegExp
Set exp = New RegExp
exp.Pattern = "\b[A-Za-z]{3}[0-9]{7}\b"
exp.Global = True

Dim splits(1000) As String
Dim x As Long

Dim results As MatchCollection
Set results = exp.Execute(ActiveDocument.StoryRanges(wdFootnotesStory))
x = 1

For Each res In results
splits(x) = res
x = x + 1
Next res


Dim Filename As String, line As String
Dim i As Integer
Filename = "C:\VBA Export" & "\Numbers.csv"
Open Filename For Output As #2
Print #2, "Control Numbers"
For i = LBound(splits) To UBound(splits)

Print #2, splits(i)

Next i
Close #2
MsgBox "Numbers were exported to " & Filename, vbInformation
End Sub

Приведенный выше код работал нормально и внезапно начал выдавать ошибку в «splits (x) = res». Я попытался проверить свое регулярное выражение и вижу, что оно работает нормально. Если я изменяю split(x) на split(6) или что-то подобное, это работает как шарм.

Может кто-нибудь помочь?

Когда это не удается, какова ценность x? Почему бы не записать каждое значение res непосредственно в файл? splits() особой необходимости нет.

Tim Williams 22.03.2022 23:33

Привет, Тим, 1001 - это значение x, а в моем документе должно быть около 500-600 ссылок, которые я ищу.

Mohitn29 22.03.2022 23:38

Поэтому либо увеличьте массив, замените его на Collection, либо запишите результаты прямо в файл.

Tim Williams 22.03.2022 23:39

Как бы я написал это прямо в файл? Извините за нуба в этом.

Mohitn29 22.03.2022 23:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

РЕДАКТИРОВАТЬ — изменен код для записи совпадений напрямую в Excel.

Sub Tester()

    Dim oXl As Excel.Application 'add reference to MS Excel object library...
    Dim oWb As Excel.Workbook, c As Excel.Range, i As Long, col As Collection
    
    Set oXl = New Excel.Application
    oXl.Visible = True
    Set oWb = oXl.Workbooks.Add()
    Set c = oWb.Worksheets(1).Range("A1")
    
    ListMatchesInExcel ActiveDocument.StoryRanges(wdFootnotesStory), _
                       "\b[A-Za-z]{3}[0-9]{7}\b", _
                       "Id Numbers", c
    Set c = c.Offset(0, 1)
                    
    ListMatchesInExcel ActiveDocument.StoryRanges(wdFootnotesStory), _
                    "\b[A-Za-z]{2}[0-9]{9}\b", _
                    "Other Numbers", c
    Set c = c.Offset(0, 1)
    
    'etc etc
End Sub

'Search through `SearchText` for text matching `patt` and export all
'  matches to Excel with a header `HeaderText`, starting at range `c`
Sub ListMatchesInExcel(SearchText As String, patt As String, _
                     headerText As String, c As Excel.Range)
    'add reference to MicroSoft VBscript regular expressions
    Dim exp, exp1 As RegExp, col As New Collection
    Dim results As MatchCollection, res As Match, i As Long
    
    Set exp = New RegExp
    exp.Pattern = patt
    exp.Global = True
    Set results = exp.Execute(SearchText)
    'log to Immediate pane
    Debug.Print (col.Count - 1) & " matche(s) for '" & patt & "'"
    c.Value = headerText
    i = 1
    For Each res In results
        c.Offset(i).Value = res
        i = i + 1
    Next res
    c.EntireColumn.AutoFit
End Sub

Спасибо, это сработало отлично! также я предложил пару правок в объявлениях, чтобы избежать ошибок компиляции

Mohitn29 23.03.2022 00:17

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

Mohitn29 23.03.2022 00:18

В разных файлах или как новые столбцы в том же файле?

Tim Williams 23.03.2022 00:24

В том же файле, пожалуйста :)

Mohitn29 23.03.2022 04:36

Я не понимаю, как бы вы организовали файл? Разве разные шаблоны не дадут разное количество попаданий?

Tim Williams 23.03.2022 04:38

Я имел в виду столбец A-шаблон 1, столбец B-шаблон 2 и т. д.

Mohitn29 23.03.2022 04:50

Что бы вы сделали с выходным файлом? Открыть в экселе?

Tim Williams 23.03.2022 05:55

Да, просто эксель использовать.

Mohitn29 23.03.2022 22:29

ОК - см. редактирование выше.

Tim Williams 24.03.2022 00:11

Спасибо, я добавил выражения VB v1.0 и 5.5, но все еще не определяет excel.range как переменную. какие-нибудь советы ?

Mohitn29 24.03.2022 01:03

Смотрите первый комментарий в подписке Tester

Tim Williams 24.03.2022 02:05

Сладкий, да, это прекрасно! Ваше здоровье :)

Mohitn29 24.03.2022 04:48

Другие вопросы по теме