我创建了一个工作簿,用于每周为我的团队安排不同的工作职能。行标题是每个人的姓名,列标题是时间间隔(但有些列是半小时,有些列是整整一小时。例如: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人身上。该表每个工作日有5个行部分。
但是,我真正需要的是使计数器变得动态的一些方法。计划每周都会更改....我怎样才能使计数器在新的一周内继续增加值#39;已经清除了旧周的数据?或者有没有办法可以将表格链接到工作簿中的另一个工作表(使单独的表格成为主工作表),这些工作簿总计每周在原始计数器表格中找到的数字?
我欢迎任何建议或帮助!提前致谢
答案 0 :(得分: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
这些可以轻松更改以适合您的示例,您只需更改if部分(" Coffee"" PaperWork")等于"咖啡& #34;或"文书工作"等等,wrk的范围值需要改为星期一的时间区域,即E10:V27
请注意,只有当您将这些更改为每小时等于一小时或半小时(而不是if语句添加1,您添加0.5)时,此方法才有效。
希望这有帮助
答案 1 :(得分:0)
我认为这样做的伎俩,它应该引导你走正确的道路,如果需要一些额外的" 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