2016-07-11 1 views
1

Я создал книгу, которая будет использоваться для планирования моей команды для разных функций работы еженедельно. Заголовки строк - это имя каждого человека, а заголовки столбцов - промежутки времени (однако некоторые столбцы находятся на полчаса, а некоторые - на полный час. Пример: 8:30 | 9:30 | 10:00 | 11:00). Каждая ячейка имеет выпадающее меню около 15 функций.Excel: динамический счетчик для качественных данных

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

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

=0.5*COUNTIF([@[8:30am]],"coffee")+0.5*COUNTIF([@[9:00am]],"coffee")+0.5*COUNTIF([@[9:30am]],"coffee")+COUNTIF([@[10:00am]],"coffee")+COUNTIF([@[11:00am]],"coffee")+COUNTIF([@[12:00pm]],"coffee")+COUNTIF([@[1:00pm]],"coffee")+COUNTIF([@[2:00pm]],"coffee")+COUNTIF([@[3:00pm]],"coffee")+0.5*COUNTIF([@[4:00pm]],"coffee") 

И эта формула должна была бы быть еще больше, потому что я хочу ячейку подсчитать, сколько раз «кофе» приходит на Person А в течение всей недели. Таблица имеет 5 разделов строк для каждого дня недели.

НО, мне действительно нужен какой-то способ сделать этот счетчик динамическим. Расписание меняется каждую неделю .... Как я могу заставить счетчик продолжать добавлять значения в новую неделю, когда я очистил данные старой недели? Или есть способ связать таблицу с другим листом в книге (сделав отдельную таблицу главной), которая подсчитывает числа, найденные в исходной таблице счетчиков каждую неделю?

приветствую любые предложения или помощь! Заранее спасибо

enter image description here

+0

Если бы вы смогли разместить изображение с образцами данных, результаты ввода и результаты были бы замечательными. – Sgdva

+0

Привет @sgdva Я добавил скриншот к своему оригинальному сообщению – SRag

+0

Кроме того, если мне нужно использовать другую платформу для этого требования (например, Access), я могу это сделать. Я просто не знаю, что делать – SRag

ответ

1

Этот вопрос можно легко сделать с изменением к исходному рабочему листу в вашем вопросе, если вы сделаете каждый столбец стоит часа или полчаса, то вы можно легко подсчитать их через простой код -

Sub Timesheet() 
Dim wrk As Range 
Dim i As Range 
Dim Coffee As Range 
Dim PaperWork As Range 

    Set wrk = Sheets("Sheet1").Range("B2:I6") 

    For Each i In wrk 

    Set Coffee = Range("K" & i.Row) 
    Set PaperWork = Range("L" & i.Row) 

     If i = "Coffee" Then 
      Coffee.Value = Coffee.Value + 1 
     ElseIf i.Value = "PaperWork" Then 
      PaperWork.Value = PaperWork.Value + 1 
     Else 

     End If 

    Next 
End Sub 

Они могут быть легко изменены, чтобы соответствовать вашему примеру, вам нужно будет просто изменить, если секции («Кофе» и «Делопроизводство») равные " кофе "или" Paperwor k "и т. д., значение диапазона wrk необходимо будет изменить на площадь времени понедельника, то есть E10: V27

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

Надеюсь, что это поможет

+0

Hi @lewisthegruffalo, спасибо за ваше предложение! Однако я действительно хочу избежать изменения каждого столбца на то же значение (например, 1 час или 1/2 часа). Мой конечный пользователь нуждается в столбцах, которые будут отображаться как 6:30 утра | 7am | 7:30 | 8am | 8:30 | 9am | 10 утра | 11:00 | 12pm | 1pm | 2pm | 3 часа | 15:30 | 4pm | 16:30 | 17:00 | 17:30 | 18:00 | 6:30 вечера. Любой способ реализовать свое решение, зная это? – SRag

+0

hmm, возможно, включая вложенный оператор if, говорящий «Если i.column> = 5 и i.column <= 11 Then Coffee.Value = Coffee.Value = 0.5' (это означает, что если столбец находится в пределах EK, вы могли бы приспособиться к этому оператору if с помощью команды 'ElseIf', чтобы делать другие времена. Надейтесь, что это поможет! я, чтобы адаптировать свой первоначальный ответ, но я занят, так что может потребоваться некоторое время! – lewisthegruffalo

+0

Привет, @lewisthegruffalo, спасибо за это решение. У меня был следующий вопрос: у меня есть таблица, поэтому вы можете выбрать более одного элемента из выпадающего списка возможных функций за раз, разделенных запятой (так что ячейка может выглядеть так: «кофе, документы»). Будет ли это решение работать, или есть способ заставить его работать так, чтобы и кофе, и документы в этом случае получите +1? – SRag

0

Я думаю, что этот вид делает трюк, он должен направить вас на правильный путь, если необходимо несколько дополнительных «рюшечки». код в VBA:

Function PersonSchedule(RangeTime As Range, RangeToCountIn As Range, ActivityToAnalyze As String) As Double 
'if ranges are not the same that's an error 
'Err01PersonSchedule: Range for time should be the same size as elements within it!" 
If RangeTime.Columns.Count <> RangeToCountIn.Columns.Count Or RangeTime.Rows.Count > 1 Or RangeToCountIn.Rows.Count > 1 Then PersonSchedule = CVErr(xlErrRef): Exit Function 
Dim TimeDifference As Double 
Dim CounterColumnsInRange As Long 
Dim TotalColumnsInRange As Long: TotalColumnsInRange = RangeToCountIn.Column + RangeToCountIn.Columns.Count - 1 
For CounterColumnsInRange = RangeToCountIn.Column To TotalColumnsInRange 
'the "If" statement is to handle the "0.5" when to multiply the time specified or not 
'I can see this is when there is no "30" minutes in the middle, I don't fully understand 
'the logic behind it, but, if it works for you, it's ok 
'Ideally, time stamps are per column in the RangeTime 
If CounterColumnsInRange < TotalColumnsInRange - 1 Then ' 1. If CounterColumnsInRange < TotalColumnsInRange 
On Error GoTo xErr02PersonSchedule 
'make sure time is time (I know it's silly, but this is if the headers are  not "time") 
TimeDifference = DateDiff("n", Cells(RangeTime.Row, CounterColumnsInRange).Value, Cells(RangeTime.Row, CounterColumnsInRange + 1).Value)/60 
Else ' 1. If CounterColumnsInRange < TotalColumnsInRange 
TimeDifference = 1 
End If ' 1. If CounterColumnsInRange < TotalColumnsInRange 
'seems like if there's one hour difference just sum up "normal" 
If TimeDifference <> 1 And Cells(RangeToCountIn.Row, CounterColumnsInRange).Value = ActivityToAnalyze Then ' 2. If TimeDifference <> 1 And Cells(RangeToCountIn.Row, CounterColumnsInRange).Value = ActivityToAnalyze 
PersonSchedule = TimeDifference + PersonSchedule 
ElseIf Cells(RangeToCountIn.Row, CounterColumnsInRange).Value = ActivityToAnalyze Then: PersonSchedule = 1 + PersonSchedule ' 2. If TimeDifference <> 1 And Cells(RangeToCountIn.Row, CounterColumnsInRange).Value = ActivityToAnalyze 
End If ' 2. If TimeDifference <> 1 And Cells(RangeToCountIn.Row, CounterColumnsInRange).Value = ActivityToAnalyze 
Next CounterColumnsInRange 
If 1 = 2 Then '99. If error 
xErr02PersonSchedule: 
PersonSchedule = CVErr(xlErrValue) 
End If '99. If error 
End Function 

enter image description here

Смежные вопросы