Excel:定性数据的动态计数器

Excel: Dynamic counter for qualitative data

我创建了一个工作簿,用于每周为我的团队安排不同的工作职能。 headers 行是每个人的名字,headers 列是时间间隔(但是有些列是半小时,有些是整点。例如:8:30 | 9:30 | 10:00 | 11:00)。每个单元格都有大约 15 个工作职能的下拉列表。

我希望为与每个团队成员相关的每个工作职能创建一个计数器,以便计算一个人为某个职能安排的小时数。

我知道如何使用 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")

而且这个公式必须更长,因为我希望单元格计算 A 在整个星期内 "coffee" 出现的次数。 table 每个工作日有 5 行部分。

但是,我真正需要的是使计数器动态化的方法。 时间表每周都会更改....我怎样才能使计数器继续增加值清除旧周数据后的新一周?或者有没有一种方法可以 link 将 table 转换为工作簿中的另一个 sheet(使单独的 table 为主),从而总计原始计数器中找到的数字table每周?

我欢迎任何建议或帮助!提前致谢

我认为这种方法可以解决问题,如果需要一些额外的东西,它应该会引导您走上正确的道路 "thingies"。 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

这个问题可以很容易地通过改变你问题中提供的原始工作表来完成,如果你让每一列都值一个小时或半小时,那么你可以通过一些简单的代码轻松地计算这些 -

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

这些可以轻松更改以适合您的示例,您只需更改 if 部分("Coffee" 和 "PaperWork")等于 "coffee" 或 "Paperwork" 等,wrk 的范围值需要更改为星期一时间的区域,即 E10:V27

请注意,只有当您将这些更改为等于一小时或半小时的每一列(而不是 if 语句加 1,您会加 0.5)时,这才有效。

希望对您有所帮助