标题:麻烦各位老师帮我分析这个值班代码错在哪儿?
取消只看楼主
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
结帖率:81.69%
已结贴  问题点数:20 回复次数:6 
麻烦各位老师帮我分析这个值班代码错在哪儿?
问题一
     以下值班顺序如果是以2018-5-7开始的日期,那么就变成下面的第一周、第二周、第三周的顺序了,不是按照Case 0、Case 1、Case 2来执行的,比你设定的起始日期要提前4天后才一周一周的变化,为了固定住第一周和第二周准时在周一变化,还要想好前面这四天一定要是上周的星期4,这是怎么回事呢?百思不得其解。
Private Sub Command1_Click()
startDate = CDate("2018/5/3")
  Enddate = Date
   temp = Abs(Enddate - startDate)
  bz = (temp / 7) Mod 3
  Select Case bz
   Case 0
     Label1.Caption = Enddate & "夜班:【罗某】"
     Label2.Caption = Enddate & "早班:【何某】"
     Label3.Caption = Enddate & "中班:【黄某】" '第三周(设定值是第一周)
   Case 1
     Label1.Caption = Enddate & "夜班:【何某】"
     Label2.Caption = Enddate & "早班:【黄某】"
     Label3.Caption = Enddate & "中班:【罗某】" '第一周(设定值是第二周)
   Case 2
     Label1.Caption = Enddate & "夜班:【黄某】"
     Label2.Caption = Enddate & "早班:【罗某】"
     Label3.Caption = Enddate & "中班:【何某】" '第二周(设定值是第三周)
   End Select
End Sub

问题二
       以下代码是求某天是今年的第几周,WW的值起始日期是从上周日到本周六呢?为什么不是本周一至本周日呢?
Private Sub Command2_Click()
Dim date0 As Date, date1 As Date
date1 = Date  '或者 date1 = Cdate(Text1.text)
date0 = Year(date1) & "/01/01"    '元旦
ww = DateDiff("ww", date0, date1) + 1
Label7.Caption = "今天是" & Year(date1) & "年第" & ww & "周"
End Sub

[此贴子已经被作者于2018-5-11 14:50编辑过]

搜索更多相关主题的帖子: Case 设定 Sub Date Caption 
2018-05-11 13:51
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
回复 2楼 wds1
谢谢wds1版主,我第二个问题整明白了,谢谢你,第一个还是没有整明白,我把起始日期调整为5月7日星期一,可是我把系统日期改成5月11日的时候就开始发生变化,之后就是上周五到本周四这个阶段变化(7天)求解,谢谢!  第一个问题 开始就从起始日期10天后才开始7天一转,难道我电脑系统有问题,我的WING7系统。

[此贴子已经被作者于2018-5-11 14:48编辑过]

2018-05-11 14:45
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
回复 4楼 wds1
wds1版主  我刚刚测试了一下   顺序到是对了  第一周要是从5月7日开始那么就在5月10日截止,差3天,以后就是从5月11至17日,5.18-24......这样下去,添加一代码Debug.Print temp, bz  之后发生了一些错误提示,如图
Case 0 缺少Select ,就添加完整 Select Case 0  然后就再次提示错误如图2,不知道怎么搞了。
关于计算第几周哪个,倒是从周一开始了周日结束,但是读出来的周是18周  如果从2018-1-1周一 数起下来到2018-5-7这一天应该是19周,软件显示18周。
2018-05-11 16:01
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
回复 7楼 wmf2014
wmf2014版主:这个代码怎么改成3班倒呢?没有看懂,希望详解!谢谢!
2018-05-11 17:00
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
谢谢wmf2014,测试通过,同时也谢谢wds1版主耐心的讲解。
wmf2014版主再请教你一个问题,关于获取计算当日是今年第几周,按照wds1版主的意思去做了,解决了DateDiff默认的是从周日开始,周六结束,现在改了代码后已经从周一开始周日结束了,但是读到5月(7日-13日)是18周 ,实际是19周。,怎么少一周呢?
2018-05-11 17:25
事业男儿
Rank: 2
等 级:论坛游民
帖 子:308
专家分:14
注 册:2007-4-25
得分:0 
wmf2014版主:系统日期修改到5月28日就提示下标越界!
2018-05-11 17:33
事业男儿
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



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




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

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