Найдите последний семестр, используя функцию LastQuarter + 2 - PullRequest
0 голосов
/ 24 апреля 2020

Мне нужен код, который будет подсчитывать, сколько месяцев было активным в прошлом семестре.

У меня есть сводка, и данные обновляются все время, когда обновляется сводка, однако мне нужно вычислить последние 6 месяцев в среднем, но только с использованием месяцев, которые были активны в последнем семестре. например, enter image description here в этом случае я бы взял среднее значение за последние 6 месяцев, будет использовать только 4 месяца (2020 янв., февраль, март и 2019 г. c), потому что это месяцы, когда человек был активен в последнем семестре).

Правило - это начало семестра в том месяце, который мы сейчас (апрель), и оно восходит на 6 месяцев. Apr2020, Mar2020, Feb2020, Jan 2020 и Dec2019, Nov2019 и с этого месяца мы будем брать сумму только за 4 месяца, которые клиент будет активен , как на изображении

можно использовать

Public Function LastQuarter(theDate As Date) As Date + 2 months to get the last semester? 
DateSerial(Year(theDate), 2)+2

Однако я предполагаю, что мне нужно использовать ЕСЛИ , последние 6 месяцев = 6 активных месяцев подряд , затем go до код, который уже сделан

остальное

Но ЕСЛИ последние 6 месяцев составляют <6 активных месяцев подряд <strong>Затем подсчитайте количество активных месяцев в последнем семестре (используя функцию LastQuarter (theDate As Date) в качестве даты + 2 месяца) и общее количество активных месяцев и сделайте среднее значение ценности. ячейки (количество активных месяцев, 3) .value = "Среднее"

ps: я опубликовал аналогичный вопрос на https://www.ozgrid.com/forum/index.php?thread / 1227330-как рассчитать-сколько-месяцев- это-активно-в-семестр / # wcf9

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Try,

Это макрос UDF.

d5 = AverageSemester()

Ниже представлен макрос.

Sub Test()
    Dim Ws As Worksheet
    Dim Semester1 As Variant, Semester2 As Variant
    Dim mySemester As Variant
    Dim Target As Range, rngLast As Range
    Dim s As String
    Dim r As Integer, i As Integer

    Semester1 = Array("May", "Jun", "Jul", "Aug", "Sep", "Oct")
    Semester2 = Array("Nov", "Dec", "Jan", "Feb", "Mar", "Apr")

    Set Ws = Sheets(1)

    With Ws
        r = .Range("c" & Rows.Count).End(xlUp).Row - 1

        Set rngLast = .Range("b" & r).Offset(, 1)
        s = .Range("b" & r)

        If isSemes(s, Semester1) Then
            mySemester = Semester1
        Else
            mySemester = Semester2
        End If
        For i = r To r - 12 Step -1
            s = .Range("b" & i)
            If isSemes(s, mySemester) Then
                Set Target = .Range("b" & i).Offset(, 1)
            Else
                Exit For
            End If
        Next i
        .Range("d5") = WorksheetFunction.Average(.Range(Target, rngLast))
    End With
End Sub
Function isSemes(s As String, vSemester As Variant)
    Dim v As Variant
    For Each v In vSemester
        If v = s Then
            isSemes = True
            Exit Function
        End If
    Next
End Function
Function AverageSemester()
    Dim Ws As Worksheet
    Dim Semester1 As Variant, Semester2 As Variant
    Dim mySemester As Variant
    Dim Target As Range, rngLast As Range
    Dim s As String
    Dim r As Integer, i As Integer

    Application.Volatile
    Semester1 = Array("May", "Jun", "Jul", "Aug", "Sep", "Oct")
    Semester2 = Array("Nov", "Dec", "Jan", "Feb", "Mar", "Apr")

    Set Ws = Sheets(1)

    With Ws
        r = .Range("c" & Rows.Count).End(xlUp).Row - 1

        Set rngLast = .Range("b" & r).Offset(, 1)
        s = .Range("b" & r)

        If isSemes(s, Semester1) Then
            mySemester = Semester1
        Else
            mySemester = Semester2
        End If
        For i = r To r - 12 Step -1
            s = .Range("b" & i)
            If isSemes(s, mySemester) Then
                Set Target = .Range("b" & i).Offset(, 1)
            Else
                Exit For
            End If
        Next i
        AverageSemester = WorksheetFunction.Average(.Range(Target, rngLast))
    End With
End Function

Когда сентябрь - последние данные

Средний диапазон ~~> май, июнь, июль, август, сентябрь

enter image description here

Когда в январе последние данные

Средний диапазон ~~> ноябрь, январь

enter image description here

0 голосов
/ 25 апреля 2020

Вы можете использовать функцию GETPIVOTDATA.

При условии, что у вас в таблице не более одного года данных, учитывая книгу, которую вы скачали на другом веб-сайте, для среднего значения за предыдущий шесть существующих месяцев:

=AVERAGE(IFERROR(GETPIVOTDATA("Amount in USD",A17,"Transaction Date",MONTH(EOMONTH(TODAY(),{-5;-4;-3;-2;-1;0}))),""))

Для несуществующего месяца формула возвращает ошибку. Функция IFERROR преобразует ее в пустую строку, которая будет игнорироваться функцией AVERAGE.

Вы можете внести очевидные изменения в Усреднение столбца Bene Frequency и расширение константы массива для включения 12 месяцев вместо 6

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

=AVERAGE(IFERROR(GETPIVOTDATA("Amount in USD",A17,"Transaction Date",MONTH(EOMONTH(TODAY(),{-5;-4;-3;-2;-1;0})),"Years",YEAR(EOMONTH(TODAY(),{-5;-4;-3;-2;-1;0}))),""))

enter image description here

0 голосов
/ 24 апреля 2020

Вы смотрели в функцию EDATE?

=IF([Date you want to check]<EDATE(now(),-6),TRUE,FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...