У меня есть документ 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) или что-то подобное, это работает как шарм.
Может кто-нибудь помочь?
Привет, Тим, 1001 - это значение x, а в моем документе должно быть около 500-600 ссылок, которые я ищу.
Поэтому либо увеличьте массив, замените его на Collection
, либо запишите результаты прямо в файл.
Как бы я написал это прямо в файл? Извините за нуба в этом.
РЕДАКТИРОВАТЬ — изменен код для записи совпадений напрямую в 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
Спасибо, это сработало отлично! также я предложил пару правок в объявлениях, чтобы избежать ошибок компиляции
Также у меня есть один и тот же скрипт, работающий для нескольких выражений регулярных выражений. мы можем распечатать их как свои собственные столбцы?
В разных файлах или как новые столбцы в том же файле?
В том же файле, пожалуйста :)
Я не понимаю, как бы вы организовали файл? Разве разные шаблоны не дадут разное количество попаданий?
Я имел в виду столбец A-шаблон 1, столбец B-шаблон 2 и т. д.
Что бы вы сделали с выходным файлом? Открыть в экселе?
Да, просто эксель использовать.
ОК - см. редактирование выше.
Спасибо, я добавил выражения VB v1.0 и 5.5, но все еще не определяет excel.range как переменную. какие-нибудь советы ?
Смотрите первый комментарий в подписке Tester
Сладкий, да, это прекрасно! Ваше здоровье :)
Когда это не удается, какова ценность
x
? Почему бы не записать каждое значениеres
непосредственно в файл?splits()
особой необходимости нет.