Элегантный код и вопрос о читабельности кода
Это мой код, и он отлично работает.
В начале документов Word, которые мне нужно обработать, указан номер контракта и дата, которые мне нужно извлечь и записать в соответствующие ячейки электронной таблицы.
Мой вопрос относится к частям кода, в которых один с оператором / end with заключен в другой с оператором / end with. 3-й и 4-й абзацы кода, где я ищу выражения подстановочных знаков.
Sub ExtractRepertorNmbrUsingWildcards()
Application.ScreenUpdating = False
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Dim excelApp As Excel.Application
Dim rng As Word.Range
Dim kompar As Word.Range
Dim ws As Worksheet
Dim regEx As Object
Dim matches As Collection
Dim match As Variant
Dim repNmbr As String
Dim cesja As Range
Dim startPos As Long
Dim endPos As Long
'Assigning object variables
Set wordApp = GetObject(, "Word.Application")
Set excelApp = GetObject(, "Excel.Application")
Set wordDoc = wordApp.ActiveDocument
Set ws = excelApp.ActiveSheet
Set rng = wordApp.ActiveDocument.Content
Set matches = New Collection
Set cesja = ActiveSheet.Range("A10:J50").Find("cesja /", , xlValues)
Debug.Print cesja.Address
With wordApp.ActiveDocument.Range
With .Find
.Text = "<[0-9 ]{1;7}/[0-9]{4}>" 'contract number
.MatchWildcards = True
.Wrap = wdFindStop
.Forward = True
.Execute
End With
If .Find.Found = True Then matches.Add Replace(.Text, " ", "") 'macro is adding it to the collection
Debug.Print "# of items is"; matches.Count
End With
With wordApp.ActiveDocument.Range
With .Find
.Text = "<[0-9]{2}.[0-9]{2}.[0-9]{4}r." 'date
.MatchWildcards = True
.Wrap = wdFindStop
.Forward = True
.Execute
End With
If .Find.Found = True Then matches.Add .Text 'macro is adding it to the same collection as above on the next free record
Debug.Print "# of items is"; matches.Count
End With
For Each match In matches
Debug.Print match
Next match
Я не понимаю, почему в этой части кода (а также в следующем абзаце кода):
With wordApp.ActiveDocument.Range
With .Find
.Text = "<[0-9 ]{1;7}/[0-9]{4}>" 'contract number
.MatchWildcards = True
.Wrap = wdFindStop
.Forward = True
.Execute
End With
If .Find.Found = True Then matches.Add Replace(.Text, " ", "")
Debug.Print "# of items is"; matches.Count
End With
один оператор with / end with, завернут в другой.
Как должна быть написана эта часть кода, чтобы избежать ненужного обертывания / двойного с / end with оператора. Я спрашиваю, как профессиональный программист мог бы написать его?
Пожалуйста, исправьте этот код, чтобы он был эффективным, красивым, читаемым и коротким.