Максимальное значение в расширяющемся диапазоне - PullRequest
0 голосов
/ 25 декабря 2018

Как мне справиться со следующей задачей?В ячейке A2 у меня есть формула, которая повторяет и предоставляет результаты на постоянной основе.С каждой итерацией результаты отображаются в B2, B3 и т. Д.

В то же время в C2, C3 и т. Д. Я фиксирую соответствующие временные метки.По сути, после нескольких итераций у меня есть список результатов в столбце B и список временных меток в столбце C. Мне удалось закодировать эту часть.

Теперь к моей проблеме: поскольку у меня есть временные метки, я буду знатьв один момент, например, в течение 1-й минуты генерируется 6 результатов.Поэтому диапазон результатов, которые мы рассматриваем, составляет B2: B7.

Исходя из этого расширяющегося диапазона, мне нужно зафиксировать максимальный результат в E2, поскольку диапазон изменяется с каждой итерацией, пока не достигнет B7.Поскольку я не знаю, сколько результатов будет сгенерировано в течение 1-й минуты, мне нужно обновлять E2 с каждой итерацией.Как только начинается вторая минута, я хочу сделать то же самое и зафиксировать максимальный результат в E3.Новый диапазон, очевидно, начнется в B8 и расширится в зависимости от того, сколько вычислений сделано в A2.

Если бы я мог сделать это в течение 10 минут, я бы показал 10 максимальных результатов в диапазоне от E2 до E11.

Ниже мой код.Только частично он выполняет то, что я описал выше.Есть идеи, как заставить это работать?Ваша помощь высоко ценится!Спасибо!

По следующей ссылке я визуализировал проблему: img1

Private Sub Worksheet_Calculate()
Dim lastrow As Long

lastrow = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row

With Worksheets(1).Cells(lastrow, 2)
    .Offset(1, 0) = Cells(2, 1).Value
    .Offset(1, 1) = FormatDateTime(Now, vbLongTime)
End With

Call Generator

End Sub

Sub Generator()
Dim icount As Long
Dim rcount As Long

icount = 2
rcount = 2
For tcount = 1 To 10
    Do While DateDiff("s", Cells(2, 3), Cells(icount, 3)) <= tcount * 60 
        Cells(tcount + 1, 5) = WorksheetFunction.Max(Range(Cells(rcount,   2), Cells(icount, 2))) 
        icount = icount + 1
    Loop
rcount = icount
Next tcount

End Sub

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы можете отследить начальную ячейку минутного диапазона и рассчитать разницу во времени.Если разница превышает 60 секунд, настройте ячейку результата.Комментарии в коде объясняют все.Назовите это в своем Worksheet_Calculate.Обратите внимание, что вы можете в равной степени иметь Private переменные как Static.

В стандартном модуле:

Private start_cell As Range
Private end_cell As Range
Private result_cell As Range

Sub UpdateResult()

    Dim r%, diff%
    Dim rng As Range

    With Sheets("Tabelle1")

        '// Calculate last added cell
        Set end_cell = .Cells(.Rows.Count, "C").End(xlUp)

        '// Check whether the last cell is first cell
        If (end_cell.Address(0, 0) = "C2") Then
            '// Experiment just began. Set initial data.
            Set result_cell = .Range("E2")
            Set start_cell = .Range("C2")
        Else
            '// Experiment is in progress.
            '// Calculate seconds diff.
            diff = DateDiff("s", start_cell, end_cell)
            If diff > 60 Then
                '// Shift result cell
                '// and update start_cell
                Set start_cell = end_cell
                Set result_cell = result_cell.Offset(1)
            End If
        End If

        '// After calculating all required cells,
        '// write down values.
        Set rng = Range(start_cell, end_cell)
        result_cell.Value = WorksheetFunction.Max(rng.Offset(, -1))

    End With

End Sub
0 голосов
/ 25 декабря 2018

Один из способов решения этой проблемы - проверить время на каждой итерации и, если минуты разные, заполнить столбец E на ходу.

Примерно так:

Private Sub Worksheet_Calculate()
Dim lastrow As Long

lastrow = Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row

With Worksheets(1).Cells(lastrow, 2)
    .Offset(1, 0) = Cells(2, 1).Value
    .Offset(1, 1) = FormatDateTime(Now, vbLongTime)
    If Minute(.Offset(1, 1).Value) <> Minute(.Offset(0, 1).Value) Then
        .Offset(1, 2) = "Change"
        .Offset(0, 3).End(xlUp).Offset(1, 0) = WorksheetFunction.Max(Range(.Offset(0, 0), .Offset(0, 2).End(xlUp).Offset(0, -2)))
    End If
End With

Вы можетепокончить с функцией Generator.Это не понадобится здесь.В дополнительной строке сравнивается минутное значение недавно добавленной временной метки с предыдущим значением, и, если оно отличается, например, минута изменилась, она отмечает строку, которая помогает при вычислении максимального значения в столбце E.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...