我想在vba中创建一个函数,这里是我需要的伪代码和概念。如果有人能给我这方面的帮助,你会得到适当的信用。
因此,我们有一份工作时间表的电子表格,其中第一行的每列中都有这样的时间
400 430 500 530 600等
这些对应于时间4:00a,4:30a等。在A列中我们有员工的姓名,员工每工作半小时我们填写0.5,如果他们从45或15开始我们用0.25填充它。有没有办法在0.5开始和结束时对每个单元格进行功能测试,就像右边和左边的单元格没有任何内容一样。
编辑:以下是Sancho.s的示例案例。
很抱歉,很难看到,右边的描述说“这个人有一半,不应该算作分拆”。列U中的班次显示为:
答案 0 :(得分: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
他们可能会为你工作。
它们给出数据开始/结束的列数(减1,以避免计算包含名称的列)。公式不检查具有数据的单元格的内容。
单元格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的某些限制)。 我的建议是,如果可能的话,那些细胞就会被保留下来。您可以隐藏它们,或者更好地将它们分组:选择列,然后选择数据 - &gt; (概要)小组。您将在顶部看到一个框,可以折叠/展开该组。
我猜你有你需要的一切。