Подскажите пожалуйста. Написал я плагин, который открывает ворд, считывает информацию и только переделённую информацию вставляет в определенные столбы экселя. В чем проблема. В ворде лежит текст: 16500-13-SD-104 16500-13-PFE-004 16500-13-RR-001-01A 16500-13-RR-002-01B.
В первый столбец, ок все четко вставляет 16500-13-RR-001-01A и 16500-13-RR-002-01B. А вот во второй, кроме: 16500-13-SD-104 16500-13-PFE-004, он видит, что 16500-13-RR-001-01A. 16500-13-RR-002-01B начинаются так-же и запихивает их первую часть.
Я пробовал дать ему четкую информацию, поменяв выражение на ^(\d{5}-\d{2}-[A-Z]{2}-\d{3}|\d{5}-\d{2}-[A-Z]{3}-\d{3})$, добавив ^( и )$, но при таком раскладе, он вообще перестает что-либо вставлять во 2 столбец.
Подскажите как решить данную проблему. Код ниже.
< Sub ForWord_Woter() Dim wdApp As Object Dim wdDoc As Object Dim clipboardText As String Dim regex1 As Object Dim regex2 As Object Dim regex3 As Object Dim regex4 As Object Dim matches1 As Object Dim matches2 As Object Dim matches3 As Object Dim matches4 As Object Dim match As Object Dim ws As Worksheet Dim rng As Range Dim rowA As Long Dim rowB As Long Dim rowC As Long Dim paragraph As Object
' Установите ссылку на текущий лист Excel Set ws = ThisWorkbook.Sheets(1) ' Укажите номер или имя вашего листа Set rng = ws.Range("A2:D10000") ' Диапазон очистки rng.ClearContents ' Очистка
rowA = 2 ' Начальная строка для столбца A rowB = 2 ' Начальная строка для столбца B rowC = 2 ' Начальная строка для столбца C rowD = 2 ' Начальная строка для столбца D
' Создаем экземпляр Word и открываем документ Set wdApp = CreateObject("Word.Application") wdApp.Visible = True ' Сделайте Word видимым для пользователя Set wdDoc = wdApp.Documents.Open("C:\Users\..........docx") ' Укажите путь к вашему документу
' Создаем регулярные выражения для поиска Set regex1 = CreateObject("VBScript.RegExp") regex1.Global = True regex1.Pattern = "\b\d{5}-\d{2}-[A-Z]{2}-\d{3}-\d{2}[A-Z]|\d{5}-\d{2}-[A-Z]{3}-\d{3}-\d{2}[A-Z]\b" ' Шаблон для Кабелей
Set regex2 = CreateObject("VBScript.RegExp") regex2.Global = True regex2.Pattern = "\b\d{5}-\d{2}-[A-Z]{2}-\d{3}\b|\b\d{5}-\d{2}-[A-Z]{3}-\d{3}\b" ' Шаблон для оборудования
Set regex3 = CreateObject("VBScript.RegExp") regex3.Global = True regex3.Pattern = "\b[A-Z]{3}-[A-Z]{3}-[A-Z]{3}-\d{5}-\d{2}-\d{4}-[A-Z]{3}\d{1}-[A-Z]{3}-\d{5}-\d{2}\.\w{3}|[A-Z]{3}-[A-Z]{3}-[A-Z]{3}-\d{5}-\d{2}-\d{4}-[A-Z]{3}-[A-Z]{3}-\d{5}-\d{2}\.\w{3}\b" ' Шаблон для документа GCC-IST-DDD-16500-13-0000-SSA-SHM-00001-03.dwg
' Проходите по каждому абзацу документа For Each paragraph In wdDoc.Paragraphs clipboardText = Trim(paragraph.Range.text) ' Получаем текст из абзаца
' Ищем совпадения для первого шаблона Set matches1 = regex1.Execute(clipboardText) If matches1.Count > 0 Then For Each match In matches1 ws.Cells(rowA, 1).Value = match.Value ' Вставляем в столбец A rowA = rowA + 1 Next match End If
' Ищем совпадения для 2 шаблона Set matches2 = regex2.Execute(clipboardText) If matches2.Count > 0 Then For Each match In matches2 ws.Cells(rowB, 2).Value = match.Value ' Вставляем в столбец B rowB = rowB + 1 Next match Else Debug.Print "Совпадений не найдено." End If
' Ищем совпадения для 3 шаблона Set matches3 = regex3.Execute(clipboardText) If matches3.Count > 0 Then For Each match In matches3 ws.Cells(rowC, 3).Value = match.Value ' Вставляем в столбец С rowC = rowC + 1 Next match End If
' Ищем совпадения для 4 шаблона 'Set matches4 = regex4.Execute(clipboardText) 'If matches4.Count > 0 Then ' For Each match In matches4 ' ws.Cells(rowC, 4).Value = match.Value ' Вставляем в столбец D ' rowD = rowD + 1 ' Next match ' End If Next paragraph
' Закрываем документ Word wdDoc.Close SaveChanges:=False wdApp.Quit End Sub >
DimShar, в регулярках граница слова определяетяс по символам из множества \w поэтому - для них уже не относится к слову Попробуйте \b\d{5}-\d{2}-[A-Z]{2,3}-\d{3}$
Можно так, поправил немного regex2.Pattern и учел пожелание трудящихся.
Скрытый текст
Код
Sub ForWord_Woter()
Dim wdApp As Object
Dim wdDoc As Object
Dim clipboardText As String
Dim regex1 As Object
Dim regex2 As Object
Dim regex3 As Object
Dim regex4 As Object
Dim matches1 As Object
Dim matches2 As Object
Dim matches3 As Object
Dim matches4 As Object
Dim match As Object
Dim ws As Worksheet
Dim rng As Range
Dim rowA As Long
Dim rowB As Long
Dim rowC As Long
Dim paragraph As Object
' Установите ссылку на текущий лист Excel
Set ws = ThisWorkbook.Sheets(1) ' Укажите номер или имя вашего листа
Set rng = ws.Range("A2:D10000") ' Диапазон очистки
rng.ClearContents ' Очистка
rowA = 2 ' Начальная строка для столбца A
rowB = 2 ' Начальная строка для столбца B
rowC = 2 ' Начальная строка для столбца C
rowD = 2 ' Начальная строка для столбца D
' Создаем экземпляр Word и открываем документ
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True ' Сделайте Word видимым для пользователя
Set wdDoc = wdApp.Documents.Open("C:\Users\....docx") ' Укажите путь к вашему документу
' Создаем регулярные выражения для поиска
Set regex1 = CreateObject("VBScript.RegExp")
regex1.Global = True
regex1.Pattern = "\b\d{5}-\d{2}-[A-Z]{2}-\d{3}-\d{2}[A-Z]|\d{5}-\d{2}-[A-Z]{3}-\d{3}-\d{2}[A-Z]\b" ' Шаблон для Кабелей
Set regex2 = CreateObject("VBScript.RegExp")
regex2.Global = True
regex2.Pattern = "\b(\d{5}-\d{2}-[A-Z]{2}-\d{3}|\d{5}-\d{2}-[A-Z]{3}-\d{3})\r" ' Шаблон для оборудования
Set regex3 = CreateObject("VBScript.RegExp")
regex3.Global = True
regex3.Pattern = "\b[A-Z]{3}-[A-Z]{3}-[A-Z]{3}-\d{5}-\d{2}-\d{4}-[A-Z]{3}\d{1}-[A-Z]{3}-\d{5}-\d{2}\.\w{3}|[A-Z]{3}-[A-Z]{3}-[A-Z]{3}-\d{5}-\d{2}-\d{4}-[A-Z]{3}-[A-Z]{3}-\d{5}-\d{2}\.\w{3}\b" ' Шаблон для документа GCC-IST-DDD-16500-13-0000-SSA-SHM-00001-03.dwg
'Set regex4 = CreateObject("VBScript.RegExp")
'regex4.Global = True
'regex4.Pattern = "\b 00|01|02|03|04|05|06|07|08|09\b" ' Шаблон для Ревизии
' Проходите по каждому абзацу документа
' For Each paragraph In wdDoc.Paragraphs
clipboardText = wdDoc.Content ' Trim(paragraph.Range.Text) ' Получаем текст из абзаца
'
' Debug.Print clipboardText
' Ищем совпадения для первого шаблона
Set matches1 = regex1.Execute(clipboardText)
If matches1.Count > 0 Then
For Each match In matches1
ws.Cells(rowA, 1).Value = match.Value ' Вставляем в столбец A
rowA = rowA + 1
Next match
End If
' Ищем совпадения для 2 шаблона
Set matches2 = regex2.Execute(clipboardText)
If matches2.Count > 0 Then
For Each match In matches2
ws.Cells(rowB, 2).Value = match.SubMatches(0) ' Вставляем в столбец B
rowB = rowB + 1
Next match
Else
Debug.Print "Совпадений не найдено."
End If
' Ищем совпадения для 3 шаблона
Set matches3 = regex3.Execute(clipboardText)
If matches3.Count > 0 Then
For Each match In matches3
ws.Cells(rowC, 3).Value = match.Value ' Вставляем в столбец С
rowC = rowC + 1
Next match
End If
' Ищем совпадения для 4 шаблона
'Set matches4 = regex4.Execute(clipboardText)
'If matches4.Count > 0 Then
' For Each match In matches4
' ws.Cells(rowC, 4).Value = match.Value ' Вставляем в столбец D
' rowD = rowD + 1
' Next match
' End If
'Next paragraph
' Закрываем документ Word
wdDoc.Close SaveChanges:=False
wdApp.Quit
End Sub