Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:examples:plus_one_year [2020/07/03 15:13] 127.0.0.1 внешнее изменение |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Прибавление года к указанной дате ====== | ||
- | |||
- | ===== Постановка задачи ===== | ||
- | В отчете от процесса в таблице со списком статусов процесса необходимо добавить столбец, который будет иметь дату бОльшую на год от даты "Дата изменения статуса" в одноименном столбце. Название этого столбца "Срок деятельности". Формат даты представлен как "дд.мм.гг". | ||
- | |||
- | ===== Исходное состояние ===== | ||
- | Решение описывается с момента, когда в шаблоне отчета создана необходимая привязка типа "Список". | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:plus_one_year:lang_dateplus1.png?nolink |Рисунок 1. Исходный вид привязок в шаблоне отчета}}] | ||
- | |||
- | ===== Концепция решения ===== | ||
- | В шаблоне к необходимой таблице вручную добавляется столбец с заголовком "Срок деятельности". Кодом VBA анализируется дата в каждой ячейке столбца "Дата изменения статуса", и в соседнюю ячейку вставляется дата с увеличенной датой на год. | ||
- | |||
- | ===== Шаги решения ===== | ||
- | |||
- | Дополнительный столбец добавляется в конец таблицы стандартными средствами Word. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:plus_one_year:lang_dateplus2.png?nolink |Рисунок 2. Вид привязки типа "Список" после добавления столбца "Срок действия"}}] | ||
- | |||
- | Кодом VBA реализуется: | ||
- | |||
- | * обращение к необходимой таблице по названию привязки; | ||
- | * чтение дат в каждой ячейке столбца "Дата изменения статуса"; | ||
- | * вставка измененной на год даты в каждой ячейке столбца "Срок действия". | ||
- | |||
- | При работе с датой следует помнить, что она определена как текстовый тип данных. | ||
- | |||
- | Определяем название привязки типа "Список", которая представляет нужную таблицу (см. [[ru/manual/manual]] -> [[ru/manual/report/insert_anchor?&#пример_определения_названия_привязки_типа_список|Пример определения названия привязки типа "Список"]]). | ||
- | |||
- | <code> | ||
- | Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) | ||
- | |||
- | 'Вводная часть | ||
- | |||
- | 'название закладки для привязки типа Список, формирующей нужную таблицу | ||
- | StatusBookmarksName = "Изменения_процесса_e1ded8b0" | ||
- | columnDate = 4 'столбец в таблице, содержащий исходную дату | ||
- | |||
- | |||
- | 'Проверка на корректность названия привязки | ||
- | Dim StatusOk As Boolean 'сначала считаем, что нужной закладки нет | ||
- | |||
- | Dim Bkm As Bookmark 'переменная типа Закладка | ||
- | |||
- | |||
- | 'если искомая закладка есть среди закладок в документе | ||
- | For Each Bkm In ActiveDocument.Bookmarks | ||
- | |||
- | If Bkm.Name = StatusBookmarksName Then | ||
- | |||
- | StatusOk = True 'отмечаем, что закладка есть | ||
- | 'будем работать с таблицей через закладку | ||
- | Set tableStatus = Application.ActiveDocument.Bookmarks(StatusBookmarksName).Range.Tables(1) | ||
- | |||
- | End If | ||
- | |||
- | Next | ||
- | |||
- | 'Процедурная часть | ||
- | |||
- | If StatusOk Then 'если есть необходимая закладка | ||
- | |||
- | |||
- | countTableStatus = tableStatus.Rows.Count 'количество строк таблицы | ||
- | |||
- | |||
- | For i = 2 To countTableStatus 'будем проходить по всем строкам таблицы кроме первой | ||
- | |||
- | |||
- | dateEdit = tableStatus.Cell(i, columnDate).Range.Text 'получаем значение даты из ячейки | ||
- | |||
- | dateEditLen = Len(dateEdit) 'длина текста | ||
- | |||
- | |||
- | If dateEditLen > 1 Then 'если не пусто | ||
- | |||
- | |||
- | dateEdit = Left$(dateEdit, (dateEditLen - 2)) 'удаляем 2 последних символа - чистый текст | ||
- | |||
- | yearValidText = Right$(dateEdit, 2) 'берем 2 последние цифры года | ||
- | yearValidDigit = CInt(yearValidText) + 1 'превращаем текст в целое число + 1 год | ||
- | |||
- | |||
- | If yearValidDigit < 10 Then 'если год до 10 (т.е. не двузначное) | ||
- | |||
- | |||
- | yearValidText = "0" + CStr(yearValidDigit) 'дата текстом = 0 + число | ||
- | |||
- | |||
- | Else | ||
- | |||
- | yearValidText = CStr(yearValidDigit) 'иначе просто дата текстом | ||
- | |||
- | |||
- | End If | ||
- | |||
- | ddmmValid = Left$(dateEdit, (Len(dateEdit) - 2)) 'от исходной даты берем "дд.мм.", без гг | ||
- | |||
- | dateValidText = ddmmValid + yearValidText 'дата проверки = дд.мм. + гг | ||
- | |||
- | tableStatus.Cell(i, columnDate + 1).Range.Text = dateValidText 'заносим текст в ячейку "Срок действия" | ||
- | |||
- | |||
- | End If | ||
- | |||
- | Next i | ||
- | |||
- | End If | ||
- | |||
- | End Sub | ||
- | |||
- | </code> | ||
- | |||
- | ===== Результат ===== | ||
- | [{{ ru:creating_user_reports:use_macros_in_reports:plus_one_year:lang_dateplus3.png?nolink |Рисунок 3. Вид отчета после выполнения}}] | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | [<contextnavigator>] | ||
- | |||