标题:麻烦各位老师帮我分析这个值班代码错在哪儿?
只看楼主
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
wmf2014版主:系统日期修改到5月28日就提示下标越界!
2018-05-11 17:33
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 11楼 事业男儿
犯低级错误了,把pb函数里  j = Int(Abs(DateDiff("d", d, sdate)) / 7)改成  j = (Int(Abs(DateDiff("d", d, sdate)) / 7)) mod 3就可以了,下一句k=j mod 3可不要。

能编个毛线衣吗?
2018-05-11 18:29
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
回复 10楼 事业男儿
wmf2014版主:以下代码在测试过程中,发现用Date获取系统时间的时候会出错,比日在2018-5-7起始的时候正常显示,把系统时间修改到2018-5-8软件开始自动倒一次班,然后就在2018-5-15以及2018-5-22等有规律的在每周2开始倒班。
程序代码:
Function pb(sdata As String, sdate As Date) As String
   '本函数按照要求输出指定日期排班结果
  'sdata为起始排班数据,格式是“起始日期,早班,中班,晚班",如"2017-5-3,张某,李某,王某"
  'sdate为你指定的任何日期,返回结果为指定日期排班结果,早中晚班用逗号隔开,如"早班:王某,中班:李某,晚班:张某"
  Dim i As Integer, j As Integer, k As Integer, d As String, b() As String, c() As String
   b = Split(sdata, ",")
   c = Split("早班,中班,夜班", ",")
   d = b(0)
   i = Weekday(d)
   While i <> 3
     d = DateAdd("d", -1, d)
     i = Weekday(d)
   Wend
   j = (Int(Abs(DateDiff("d", d, sdate)) / 7)) Mod 3
   i = 0
   b(0) = ""
   While i < 3
     b(0) = b(0) & c(i) & "" & b(j + 1) & ","
     j = j + 1
     If j > 2 Then j = 0
     i = i + 1
   Wend
   pb = b(0)
End Function

Private Sub Command1_Click()
   Dim a As String, b() As String
   a = "2018-5-7,张某,李某,王某"
   b = Split(pb(a, Date), ",")
   Label1.Caption = Date & "" & b(0)
   Label2.Caption = Date & "" & b(1)
   Label3.Caption = Date & "" & b(2)
End Sub

Private Sub Timer1_Timer() '修改系统日期的时候,方便自动测试!
Command1_Click
End Sub


如果用你第一次发的程序,人工修改日期,那就相当准确
程序代码:
Function pb(sdata As String, sdate As Date) As String
   '本函数按照要求输出指定日期排班结果
  'sdata为起始排班数据,格式是“起始日期,早班,中班,晚班",如"2017-5-3,张某,李某,王某"
  'sdate为你指定的任何日期,返回结果为指定日期排班结果,早中晚班用逗号隔开,如"早班:王某,中班:李某,晚班:张某"
  Dim i As Integer, j As Integer, k As Integer, d As String, b() As String, c() As String
   b = Split(sdata, ",")
   c = Split("早班,中班,晚班", ",")
   d = b(0)
   i = Weekday(d)
   While i <> 2
     d = DateAdd("d", -1, d)
     i = Weekday(d)
   Wend
   j = (Int(Abs(DateDiff("d", d, sdate)) / 7)) Mod 3
   i = 0
   b(0) = ""
   While i < 3
     b(0) = b(0) & c(i) & "" & b(j + 1) & ","
     j = j + 1
     If j > 2 Then j = 0
     i = i + 1
   Wend
   pb = b(0)
End Function

Private Sub Command1_Click()
   Dim a As String
   a = "2018-5-21,【张某】,【李某】,【王某】"
   Label1.Caption = pb(a, "2018-5-7") '只要起始数据定了,2018-5-7这个日期可以随便换,都能正确返回该日期所在周的排班结果
End Sub


2018-05-11 22:15
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
我怎么觉得你在第一段代码里就是要星期二倒班呢?5月7号是星期一,那天排的班不应该8号倒班的,“While i <> 3”这句你修改了,原代码是“While i <>2”。

能编个毛线衣吗?
2018-05-12 06:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486836-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013772 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved