0

我想在 vba 中创建一个函数,这是我需要的伪代码和概念。如果有人可以在这方面给我帮助,您将获得适当的荣誉。

所以我们有一个工作时间表的电子表格,第一行的每一列都有时间,就像这样

400 430 500 530 600 等

这些对应于时间 4:00a、4:30a 等,在 A 列中,我们有员工的姓名,员工工作的每半小时,我们填写 0.5,如果他们从 45 或 15 开始,我们填写0.25。有没有一种方法可以在 0.5 开始和结束时对每个单元格进行功能测试,就像右侧和左侧的单元格没有任何内容一样。

编辑:这是 Sancho.s 的示例案例

成品样品

抱歉很难看,右边的描述说“这个人有一半,不应该算作分班”。U 列中显示的班次是:

  1. 下午 5:15-12:30
  2. 6:30-8:30p/10-12p
  3. 5:45-9a
  4. 5:45-11p
4

1 回答 1

1

下面的公式(以及它们产生的结果)参考了这张图片。每个步骤(每个公式)执行的操作可能是不言自明的。

在此处输入图像描述 在此处输入图像描述

Cell $V$4 : =MATCH(TRUE,INDEX(($B4:$T4<>0),0),0) -> 3
Cell $W$4 : =SUMPRODUCT(MAX(($B4:$T4<>"")*(COLUMN($B4:$T4))))-COLUMN($B4)+1 -> 17
Cell $X$4 : =OFFSET($B4,0,V4-1) -> 0.25
Cell $Y$4 : =OFFSET($B4,0,W4-1) -> 0.5
Cell $Z$4 : =OFFSET($B$3,0,V4-1) -> 5:00
Cell $AA$4 : =OFFSET($B$3,0,W4) -> 12:30
Cell $AB$4 : =IF(X4=0.5,TEXT(Z4,IF(MOD(V4,2)=1,"h","h:mm")),TEXT(Z4+TIME(0,15,0),"h:mm")) -> 5:15
Cell $AC$4 : =IF(Y4=0.5,TEXT(AA4,IF(MOD(W4,2)=0,"h","h:mm")),TEXT(AA4-TIME(0,15,0),"h:mm")) -> 12:30
Cell $AD$4 : =W4-V4+1-COUNT($B4:$T4) -> 0
Cell $AE$4 : =AD4>0 -> FALSE
Cell $AF$4 : =MATCH(TRUE,INDEX(ISBLANK(OFFSET($B4,0,V4-1):OFFSET($B4,0,W4-1)),0),0)+V4-2 -> #N/A
Cell $AG$4 : =AF4+AD4+1 -> #N/A
Cell $AH$4 : =OFFSET($B4,0,AF4-1) -> #N/A
Cell $AI$4 : =OFFSET($B4,0,AG4-1) -> #N/A
Cell $AJ$4 : =OFFSET($B$3,0,AF4) -> #N/A
Cell $AK$4 : =OFFSET($B$3,0,AG4-1) -> #N/A
Cell $AL$4 : =IF(AH4=0.5,TEXT(AJ4,IF(MOD(AF4,2)=0,"h","h:mm")),TEXT(AJ4-TIME(0,15,0),"h:mm")) -> #N/A
Cell $AM$4 : =IF(AI4=0.5,TEXT(AK4,IF(MOD(AG4,2)=1,"h","h:mm")),TEXT(AK4+TIME(0,15,0),"h:mm")) -> #N/A
Cell $AN$4 : =AB4&"-"&IF(AD4>1,AL4&"/"&AM4&"-","")&AC4 -> 5:15-12:30

他们可能会为你工作。

它们给出数据开始/结束的列号(减一,以避免计算包含名称的列)。公式不检查具有数据的单元格的内容。

单元格 B3(作为第 3 行的示例)包含=TIME(INT(B1/100),INT(MOD(B1,100)),0),并且格式为自定义(不同于 C3)。无论如何,第 3 行仅供公式使用,可以隐藏。第 1 行只是为了更清楚地看到相对列号。

然后你将与最后一个公式连接。

对于添加a/p,您只能使用类似IF(<time> < TIME(12,0,0), "a","p")(<time>应该替换为对包含您想要的开始/结束时间的单元格的引用 - 整体或拆分 -)。然后,如上所示连接。

您可以保留此处使用的所有单元格(它更容易工作/调试),或者通过组合其他公式来完全创建一个公式。但它会非常长(我什至不确定它是否会超过 Excel 的某个限制)。我的建议是,如果可能的话,保留这些单元格。您可以隐藏它们,或者更好地对它们进行分组:选择列,然后选择 Data -> (Outline) Group。您将在顶部看到一个框,可让您折叠/展开组。

我想你有你需要的一切。

于 2013-11-11T20:12:59.617 回答