При графическом описании единицы деятельности допускается туннелирование стрелок. Откуда именно пришли такие стрелки или куда уходят, явно не указывается. В отчетах такие состояния стрелок вместо конкретных единиц деятельности обозначают текстом "{Туннель}".
{Туннель} – поставщик или потребитель стрелки. Название не детализируется в случаях однозначного понимания читателями диаграммы.
В отчете формата MS Word по единице деятельности необходимо во всех таблицах, где встречается текст "{Туннель}", сделать его замену на "—". Допускается, что за границами таблиц так же может встречаться этот текст, но его изменять не следует.
Решение описывается с момента, когда существует шаблон отчета по единице деятельности. В шаблоне существуют таблицы (различные привязки), которые содержат информацию по входам и выходам стрелок.
Так как проводить замену текста следует только в таблицах (причем в таблицах разных привязок), то необходимо определиться с признаками таблиц, в которых будет производиться изменение. Таким признаком было выбрано число столбцов в таблицах.
Чтобы сократить время работы макроса, так же определимся сразу с номером столбца, в котором необходимо производить изменения в случае необходимости.
Проходя по всем таблицам документа, будет происходить сравнение количества столбцов выбранной таблицы. Если таблица подходит, то будет проход по каждой ячейке нужной таблицы в поисках текста для замены и, в случае необходимости, будет происходить замена текста.
Количество столбцов нужных нам таблиц – 5. Изменения возможны в 5м столбце таких таблиц.
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) 'Вводная часть columnTableProc = 5 'кол-во столбцов в таблицах с единицами деятельности columnChange = 5 'столбец, в котором необходимо производить изменения tunnelText = "{Туннель}" 'искомый текст для замены newText = "---" 'текст для замены 'Процедурная часть tableCount = ActiveDocument.Tables.Count 'кол-во таблиц в документе For iTable = 1 To tableCount 'проходим по всем таблицам документа 'поочередно обращаемся к каждой таблице Selection.GoTo What:=wdGoToTable, Which:=wdGoToFirst, Count:=iTable, Name:="" If Selection.Tables(1).Columns.Count = columnTableProc Then 'если в таблице по единицам деятельности countRow = Selection.Tables(1).Rows.Count 'кол-во строк в таблице For i = 2 To countRow 'проходим по всем строкам таблицы, кроме заголовка On Error Resume Next 'игнор error 5991, если какие-то ячейки имеют вертикальное объединение CellText = Selection.Tables(1).Cell(i, columnChange).Range.Text 'текст в ячейке нужного столбца CellText = Left$(CellText, (Len(CellText) - 2)) 'удаляем 2 последних символа - чистый текст If Len(CellText) <> 0 Then 'если ячейка непустая If CellText = tunnelText Then 'если это текст для замены 'тогда задаем новое значение для ячейки Selection.Tables(1).Cell(i, columnChange).Range.Text = newText End If End If Next i End If Next iTable End Sub