Страницы: 1
RSS
Помогите организовать цикл в цикле, найти мин. и макс. значения по частям таблицы
 
Здравствуйте!
В приложении - шаблон графика строительных работ. Почти готовый и отдалённо похожий на графики, выполненные в MsProject (для того и делается, чтоб быть похожим, чтобы делать графики в Excel при отсутствии MsProject).
Пользователь заполняет ячейки, которые остаются после нажатия кнопки "Очистить". Она, в принципе, не нужна, так как кнопка "Обновить" делает то же самое перед основной работой макроса.
Мне необходимо вычислить минимальную и максимальную даты для каждого раздела в отдельности и вставить в соответствующие ячейки (выделил жёлтым), чтобы черные линии графика начинались с минимальной даты и заканчивались на максимальной. Подчёркиваю - по разделам.
Для этой цели основной цикл перебора строк организован с конца таблицы. Если это неправильно с точки зрения "красоты кода" или чего-то иного - подскажите.
Сам код с комментариями находится по (Alt+F11), на листе1. Проблемный блок кода выделен пунктирными границами.
Прошу помощи: уже несколько вечеров мучаюсь. Пробовал Do-While-Loop, тоже не получилось, где-то "не догоняю". Возможно ли как-то задействовать Array, если это будет проще? Я сам не пробовал - "тёмный лес".
И ещё: подскажите, как вставить SpinButton на лист таким образом, чтобы стрелки были развёрнуты влево-вправо, а не вверх-вниз?
Благодарю всех откликнувшихся за участие в моей проблеме.
 
Цитата
необходимо вычислить минимальную и максимальную даты для каждого раздела в отдельности и вставить в соответствующие ячейки (выделил жёлтым)
Код
Sub MinMaxDate()
Dim Razdel As Range
Dim FRow As Integer
Dim ERow As Integer
Dim FoundCell As Range
Dim FAdr As String
    Set FoundCell = Columns(3).Find("Раздел", , xlValues, xlPart)
     If Not FoundCell Is Nothing Then
        FAdr = FoundCell.Address
      Do
        FRow = FoundCell.Row + 1
        ERow = Cells(FRow, "B").End(xlDown).Row
        Cells(FoundCell.Row, "F") = WorksheetFunction.Min(Range("F" & FRow & ":F" & ERow))
        Cells(FoundCell.Row, "G") = WorksheetFunction.Max(Range("G" & FRow & ":G" & ERow))
          Set FoundCell = Columns(3).Find("Раздел", After:=FoundCell)
      Loop While FoundCell.Address <> FAdr
     End If
End Sub
 
Kuzmich,спасибо, но не работает. И, наверное, по моей вине:
я должен был сообщить, что пользователь вправе добавлять и удалять строки в разделах (добавлять и удалять работы), а также добавлять новые разделы со своими работами.
Проверю ещё раз. Вдруг это я некорректно добавил код в свой макрос.
p.s. и сам раздел тоже - пользователь вправе менять его название, не указывая слово "Раздел". То есть, нужно опираться на наличие/отсутствие заполнения соответствующей ячейки в столбце 3.
Изменено: MrBrown - 22.04.2017 19:55:02
 
Цитата
То есть, нужно опираться на наличие/отсутствие заполнения соответствующей ячейки в столбце 3
Так точно, это должно быть слово, которое есть во всех разделах, у вас это слово Раздел
 
Kuzmich, Ну, я предполагаю, что пользователь может удалить это слово и просто записать название раздела, например, вместо "Раздел2. Земляные работы", запишет только "Земляные работы". Я создаю лишь шаблон, в который можно записать и геодезические работы, и свайные, и армирование, и бетонирование.. Тут, хочешь-не хочешь, а можешь забыть записать обязательное слово "Раздел".
 
Запишите Раздел 1, Раздел 2 и т.д. в столбце С, а название работ в столбце D
 
Kuzmich, нет это не будет универсально - раз. А во-вторых, в столбце D должны записываться только работы. Иначе макрос не будет правильно работать.
Я понимаю так, что работа макроса должна быть такой:
С самого низу до первой пустой ячейки определяется наличие записей в столбце 5 и вычисляется минимум среди значений столбца 6.
После определяется наличие записи в ячейке столбца 3 и в этой строчке, в столбце 6 записывается этот минимум.
Точно так же и с нахождением максимума в столбце 7.
При дальнейшей работе макроса (при движении вверх по строчкам) прежнее значение минимума и максимума сбрасывается и начинается сначала, уже для другого раздела.
Понимать-то понимаю, а оформить кодом не получается. Нужен цикл в цикле.
Изменено: MrBrown - 22.04.2017 20:31:32
 
Сейчас у вас в примере и Раздел , и название работы в столбце С Раздел 1. Подготовительные работы
А я предлагаю разделить. Вы запустили мой макрос?
 
Kuzmich, слово "Раздел" я записал для лишь для понимания на форуме. В графиках, выполняемых в MsProject, просто пишут наименования разделов.
По поводу Вашего макроса: разделил. Запустил.  В ячейке F11 даты вообще нет (остальные даты правильные).
Графика - вообще нет. В первом столбце нумерация включает и строки с разделами, что неприемлемо.
p.s. справедливости ради добавлю: я просто скопировал Ваш код и вставил в макрос.
Изменено: MrBrown - 22.04.2017 20:56:41
 
Я ваш код не разбирал. Я вам показал как найти минимальную и максимальную даты
в определенном диапазоне. Скопируйте мой код в стандартный модуль, очистите желтые ячейки
и запустите макрос. Как встроить мой макрос в ваш код, я не смотрел. Удачи!
 
Kuzmich, большое спасибо! Буду разбираться, как корректно вставить Ваш код в мой макрос.
-----------------------------------------------------------------------
Где-то через час:
Kuzmich, огромное спасибо! Всё получилось! Я проанализировал Ваш код и вставил из него пару строчек (немного переделав) в свой макрос.
Заработало!
Вопрос можно закрыть.
Изменено: MrBrown - 22.04.2017 22:46:30
Страницы: 1
Наверх