Как рассчитать «месяцы клиента» в Excel - PullRequest
0 голосов
/ 26 июня 2018

Каким будет самый простой способ подсчитать количество месяцев клиентов в любой день?

#   start   end
1   01/16   01/17
2   01/16   07/17
3   07/16   01/17

Допустим, начальный месяц включен, а конечный месяц исключен.

Результат, который я хотел бы получить:

<= (start of) 01/16: total customer months = 0
e.g. (start of) 03/16 = 4 (2 customers for each 2 months)
e.g. (start of) 08/16 = 15 (2 customers for each 7 months, 1 customer for 1 month)
>= (start of) 07/17 = 36 (12 + 18 + 6)

1 Ответ

0 голосов
/ 26 июня 2018
  1. Поместите ваши данные в таблицу Excel, где Table1 будет содержать начало и конец членства

    enter image description here

  2. Создайте следующую функцию, чтобы возвратить подсчет истекшего членства клиента

    Private Function get_duration(ByVal checkdate As Range) As Integer
    
    Dim tbl As ListObject: Set tbl = Sheets("Sheet1").ListObjects("Table1")
    Dim duration_check As Integer
    Dim total_duration As Long
    
    total_duration = 0
    
        For Each cell In tbl.ListColumns(1).DataBodyRange
            If (DateDiff("m", cell.Offset(0, 1), checkdate) <= 0) Then
                duration_check = DateDiff("m", cell, checkdate)
                If duration_check < 0 Then
                    duration_check = 0
                End If
    
                total_duration = total_duration + duration_check
            End If
        Next cell
    
    get_duration = total_duration
    
    End Function
    
  3. Введите функцию в определенный диапазон ячеек, который вы хотите проверить. И сделано! Технически, на этот вопрос дан ответ, но проверьте часть ниже, чтобы увидеть, как это можно реализовать


  1. Реализация на практике (реальный пример) . Создайте Table2, который будет содержать все даты, которые вы хотите проверить (я только что включил то, что вы описали в своем примере вопроса)

    enter image description here

  2. Создайте простую процедуру для циклического перебора всех CheckDate значений , которая вызывает нашу get_duration() функцию

    Private Sub loop_through_checkdates()
    
    Dim tbl2 As ListObject: Set tbl2 = Sheets("Sheet1").ListObjects("Table2")
    
    For Each cell In tbl2.ListColumns(1).DataBodyRange
        cell.Offset(0, 1) = get_duration(cell)
    Next cell
    
    End Sub
    
  3. Показывает ожидаемый результат в вашем вопросе

    enter image description here

...