Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:examples:without_tunnel [2020/07/03 15:15] 127.0.0.1 внешнее изменение |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Замена в таблицах текста "{Туннель}" ====== | ||
- | |||
- | ===== Текущая ситуация ===== | ||
- | |||
- | При графическом описании бизнес-процесса допускается туннелирование стрелок. Откуда именно пришли такие стрелки или куда уходят, явно не указывается. В отчетах такие состояния стрелок вместо конкретных процессов обозначают текстом "{Туннель}". | ||
- | |||
- | {Туннель} -- поставщик или потребитель стрелки. Название не детализируется в случаях однозначного понимания читателями диаграммы. | ||
- | |||
- | ===== Постановка задачи ===== | ||
- | |||
- | В отчете формата Word по процессу необходимо во всех таблицах, где встречается текст "{Туннель}", сделать его замену на "---". Допускается, что за границами таблиц так же может встречаться этот текст, но его изменять не следует. | ||
- | |||
- | ===== Исходные данные ===== | ||
- | |||
- | Решение описывается с момента, когда существует шаблон отчета по процессу. В шаблоне существуют таблицы (различные привязки), которые содержат информацию по входам и выходам стрелок. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:without_tunnel:lang_tunnel1.png?nolink | Рисунок 1. Вид шаблона отчета с таблицами, которые могут выводить заданный текст }}] | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:without_tunnel:lang_tunnel2.png?nolink |Рисунок 2. Вид выполненного отчета с искомым текстом в некоторых ячейках}}] | ||
- | |||
- | ===== Концепция решения ===== | ||
- | |||
- | Так как проводить замену текста следует только в таблицах (причем в таблицах разных привязок), то необходимо определиться с признаками таблиц, в которых будет производиться изменение. Таким признаком было выбрано число столбцов в таблицах. | ||
- | |||
- | Чтобы сократить время работы макроса, так же определимся сразу с номером столбца, в котором необходимо производить изменения в случае необходимости. | ||
- | |||
- | Проходя по всем таблицам документа, будет происходить сравнение количества столбцов выбранной таблицы. Если таблица подходит, то будет проход по каждой ячейке нужной таблицы в поисках текста для замены и, в случае необходимости, будет происходить замена текста. | ||
- | |||
- | ===== Шаги решения ===== | ||
- | |||
- | Количество столбцов нужных нам таблиц -- 5. Изменения возможны в 5м столбце таких таблиц. | ||
- | |||
- | <code> | ||
- | |||
- | 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 | ||
- | |||
- | </code> | ||
- | |||
- | ===== Результат ===== | ||
- | [{{ ru:creating_user_reports:use_macros_in_reports:without_tunnel:lang_tunnel3.png?nolink |Рисунок 3. Вид сформированного отчета после работы макроса}}] | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | [<contextnavigator>] | ||
- | |||