找到价值 - > 90个细胞的总和 - >下降 - >重复

时间:2014-04-02 15:08:05

标签: excel vba excel-vba

我有这个电子表格我正在研究一段时间。它基本上是出勤件。最终用户跟踪员工,如果他们出现或不等...

我已经厌倦了查找循环,但我无法弄清楚如何做我想做的事情。

我在这个excel中拥有的东西。

A-D:Emp info
E-∞:1-3天/日期; 4-∞smp数据(如果他们错过了一天,那个值)

为了更好地理解,请参阅this

从E5输入到xx的数据,这就是我试图让这个vba工作的地方。

脚本检测到的第一个值是' 1'或者' 2',从那里开始90天(细胞)。 90后,重置为0.从91开始搜索' 1'或者' 2'并做类似的。

请参阅excel文件以便更好地理解。如果它没有意义,就会很乐意简化。

谢谢

1 个答案:

答案 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天的违规行为。