我有这个电子表格我正在研究一段时间。它基本上是出勤件。最终用户跟踪员工,如果他们出现或不等...
我已经厌倦了查找循环,但我无法弄清楚如何做我想做的事情。
我在这个excel中拥有的东西。
A-D:Emp info
E-∞:1-3天/日期; 4-∞smp数据(如果他们错过了一天,那个值)
为了更好地理解,请参阅this
从E5输入到xx的数据,这就是我试图让这个vba工作的地方。
脚本检测到的第一个值是' 1'或者' 2',从那里开始90天(细胞)。 90后,重置为0.从91开始搜索' 1'或者' 2'并做类似的。
请参阅excel文件以便更好地理解。如果它没有意义,就会很乐意简化。
谢谢
答案 0 :(得分:1)
处理此问题的最有效和最简洁的方法是使用relational data model的形式,因为它可以在不使用VBA代码的情况下轻松完成。您的电子表格中有两个简单的表,EmployeeInfo和AttendanceRecords。您的员工信息将如下所示
Emp# Name Craft # In 90 Days NumOf2s NumOf1s
1 EMP 1 SM Site Manager 0 0 0
2 EMP 2 SM Site Manager 1 0 1
3 EMP 3 SM Site Manager 0 0 0
4 EMP 4 SM Site Manager 0 0 0
5 EMP 5 SM Site Manager 1 0 1
最后三列是根据AttendanceRecords表计算的。这个表将是可变大小的,但这样你只需要存储重要数据(当员工实际得到分数时)。它看起来像这样。
Emp# Date Days Count
1 12/1/2013 122 1
3 1/1/2014 91 2
2 2/1/2014 60 1
5 2/15/2014 46 1
您可以在同一天和同一员工中拥有多个条目。重要的是我们每次违规只需要一个条目(注意:为了在适当的数据库类型模型中执行此操作,每个出勤记录还应该具有某种递增的完全唯一ID(如员工),但我们可以放弃对于这个应用程序)。
您输入员工编号,日期和计数。然后,“天数”列会使用以下公式自动计算记录的年龄:
=TODAY()-[@Date]
注意:如果[@Date]
表示法看起来不熟悉,这是因为它处理Excel表格。如果不熟悉,我建议您read up on those。
所以现在我们有每个记录的年龄。回到EmployeeInfo表,我们使用以下公式来获取过去90天内适用于Employee x的所有AttendanceRecords
=SUMIFS(AttendanceRecords[Count],AttendanceRecords[Emp'#],[@[Emp'#]],AttendanceRecords[Days],"<=90")
您现在还可以使用一些简单的公式来获取我指出的其他列,包括分数中的2个计数或1个计数违规的数量:
=COUNTIFS(AttendanceRecords[Emp'#],[@[Emp'#]],AttendanceRecords[Days],"<=90",AttendanceRecords[Count],2)
=COUNTIFS(AttendanceRecords[Emp'#],[@[Emp'#]],AttendanceRecords[Days],"<=90",AttendanceRecords[Count],1)
可以收集更多数据,包括最后一次违规的日期,所有时间的违规总数等。如果我使用的任何公式或术语没有意义或需要更多解释,随意问。
编辑:如果您希望在90天后自动删除它们,则编写VBA脚本来执行此操作会相对容易。在Days上对AttendanceRecords表进行排序并删除所有超过特定天数的记录也很容易。但是,除非您看到自己每周添加数百条记录,否则这确实不是必需的。此外,如果您想编写一个Visual Basic表单以输入新的违规行为,这绝对是非常可能的,但另一个讨论。
编辑:为了回应关于查看这些问题何时发生的问题,我将举例说明查看表中数据的方法。 excel表的一个优点是记录的顺序不像正常范围那样绝对,因此我们可以对它们进行排序,重新排列和过滤以查看我们需要的内容。因此,如果您需要查看员工3的所有问题,只需转到AttendanceRecords表中的Emp#列,选择Emp#旁边的小箭头按钮,取消选中“全选”,然后选中'3 ',然后我将在表中看到的唯一值是来自员工3的值。然后,我可以通过单击其小箭头并选择“从最新到最旧排序”对“日期”列进行排序。
归结为您可以查看所需的任何数据,如果您仔细考虑了您真正需要查看的内容,可以设置摘要表(EmployeeInfo)以显示您几乎没有的数据查看AttendanceRecords表。但是如果你需要,你可以很容易地进入那个表并进行手动排序(如上所述)。
编辑:为了帮助我将上面显示的一些功能添加到askers当前的电子表格中,我将显示当前的公式。
=SUMIFS($E5:$BR5,$E$3:$BR$3,">"&(TODAY()-90))
对于EMP 1,此公式使用employees行作为总和范围。然后,它会在第3行的相应列中查看日期字段。如果第3行中的日期为> TODAY()-90
,则我们会将其添加到计数中。这至少只会看看过去90天的违规行为。