вернуть количество уникальных дат на другом листе в той же книге - PullRequest
0 голосов
/ 26 апреля 2018

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

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

=SUM(IF(FREQUENCY(B:B,B:B)>0,1))

для расчета количества рабочих дней. Я попытался использовать несколько дополнительных формул, чтобы получить искомое значение, в том числе:

=SUMPRODUCT((TEXT('Data'!$A$1:$A$100, "yyyymm")="201804")*('Data'!B$1:$B$100="John Doe"))

И

=SUMIFS(IF(FREQUENCY('Sono Detail'!$B:$B,'Sono Detail'!$B:$B)>0,1),'Sono Detail'!$E:$E,'(Test) Sono Report Card 1.0'!$B$3)

Ничего из этого не помогло.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Если вы можете использовать макросы VBA, попробуйте следующее:

в ячейке типа L3:

=WorkingDaysCount(B:B,C:C,K3)

Действуйте аналогично для других сотрудников в L4, L5 и L6.

Затем используйте этот код ниже в новом модуле кода

Option Explicit

Public Function WorkingDaysCount(ByRef Dates As Range, ByRef EmployeeRange As Range, ByVal Employee As String) As Integer
    Dim ct As Integer 'counter
    Dim i As Long
    'for looping

    Dim EmployeeDates() As Date 'array to track which dates are already counted
    ReDim EmployeeDates(0)  'create initial

    'loop through all the cells
    For i = 1 To Dates.Count
        If (EmployeeRange(i) = Employee) Then   'if the employee is equal to the employee in that range
            If (Not (IsInArray(Dates(i), EmployeeDates))) Then  'if the date hasn't already been counted
                EmployeeDates(UBound(EmployeeDates)) = Dates(i) 'add the date
                ReDim Preserve EmployeeDates(UBound(EmployeeDates) + 1) 'add another element to the array for the next one
            End If
        End If
    Next i

    WorkingDaysCount = UBound(EmployeeDates)    'since ubound is 0-based this is the total count of dates
End Function

Private Function IsInArray(valToBeFound As Variant, arr As Variant) As Boolean
    'DEVELOPER: Ryan Wells (wellsr.com)
    'DESCRIPTION: Function to check if a value is in an array of values
    'INPUT: Pass the function a value to search for and an array of values of any data type.
    'OUTPUT: True if is in array, false otherwise
    Dim element As Variant
    On Error GoTo IsInArrayError: 'array is empty
        For Each element In arr
            If element = valToBeFound Then
                IsInArray = True
                Exit Function
            End If
        Next element
    Exit Function
IsInArrayError:
    On Error GoTo 0
    IsInArray = False
End Function
0 голосов
/ 26 апреля 2018

Это не решение кода (пока), но я публикую этот ответ, чтобы проиллюстрировать данные, которые вы можете получить из сводной таблицы на основе предоставленного вами образца.

В первом расположении полей вы можете видеть, что сводная таблица показывает, сколько процедур было выполнено в каждый день для каждого сотрудника. Это включает в себя общее общее количество процедур для каждого сотрудника за период времени. Так, «Сотрудник 1» выполнил 14 процедур 1 марта и т. Д.

enter image description here

Если я изменю поле «Значения» сводной диаграммы, я могу показать общее время (в ДНЯХ ), которое каждый сотрудник потратил на выполнение процедур. Таким образом, в приведенной ниже таблице Сотрудник 1 работал 0,15833 дня 1 марта. Это означает 288 минут (или 3,8 часа).

enter image description here

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

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