Как написать функцию, которая вычитает два значения, только если строки видны?

У меня есть два столбца данных:

Member Time A 1 B 1 B 2 A 2 A 3 A 4 A 5 B 3 B 4 

Скажите, что эти данные начинаются от A1 до B11 .

Если я хочу вычесть последовательные значения времени после того, как значения столбцов были отсортированы в порядке возрастания, мне нужна только эта формула:

=B3-B2

Формула отлично работает, чтобы понять, в чем разница. Однако, если я фильтрую, чтобы получить разницу только для члена A, формула также рассматривает скрытые строки, поэтому дает неверный вывод.

Я новичок в VBA. Основываясь на ответе, представленном на другом веб-сайте , я попытался написать функцию следующим образом:

 Function MyDiff (MyRange As Range) As Integer Dim c As Range For Each c In MyRange If (c.Value = 1) And (c.EntireRow.Hidden = False) Then Worksheets("Sheet1").Range("B2").value - Range("B1").value End If Next c End Function 

Эта функция не обеспечивает ожидаемый выход. Должен ли я использовать другой подход или есть что-то принципиально неправильное с моим кодом?

Пытаться

 MyDiff = MyDiff + IIF(c.Column = 1, 1, -1) * c.value 

вместо

 Worksheets("Sheet1").Range("B2").value - Range("B1").value 

(не испытано)

Мое понимание заключается в том, что вам нужно вычесть текущую строку против последнего появления нефильтрованного списка, что несколько сложно, но ниже просто проверено и работает:

 Sub MyDiffsub() Dim FirstOcc As Boolean Dim PreviousRng As Range Dim c As Range Set MyRange = Range("A2:A11") For Each c In MyRange If c.EntireRow.Hidden = False Then RowNumber = c.Row If FirstOcc = False Then FirstOcc = True Else c.Offset(0, 2).Value = c.Offset(0, 1).Value - PreviousRng.Offset(0, 1).Value End If Set PreviousRng = c End If Next c End Sub 

вам нужно будет изменить MyRange на любой диапазон, который вам нужен, но он должен быть первым столбцом набора данных. Также имейте в виду, что это Function Sub а не Function поэтому ее необходимо запустить после того, как вы фильтруете набор данных в соответствии с требованием.

Используйте этот код VBA для определения вашей функции:

 Function GetVisibleValue(ByVal rngData As Range) As Variant Dim i As Long If rngData.Areas.Count > 1 Then 'Invalid range reference was provided, return #REF! error GetVisibleValue = xlErrRef Exit Function End If For i = rngData.Cells.Count To 1 Step -1 If rngData.Cells(i).EntireRow.Hidden = False Then GetVisibleValue = rngData.Cells(i).Value Exit For End If Next i End Function 

Затем в листе Excel в ячейке B2 и скопируйте эту формулу:

 =B2-N(GetVisibleValue(B$1:B1)) 

Вот изображения результатов до и после фильтрации:

Пример тиграватара (до)

Пример тиграватара (после)

Давайте будем гением компьютера.