| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 609 人关注过本帖, 1 人收藏
标题:麻烦各位老师帮我分析这个值班代码错在哪儿?
只看楼主 加入收藏
事业男儿
Rank: 2
等 级:论坛游民
帖 子:271
专家分:14
注 册:2007-4-25
结帖率:81.97%
  已结贴   问题点数:20  回复次数:13   
麻烦各位老师帮我分析这个值班代码错在哪儿?
问题一
     以下值班顺序如果是以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编辑过]

2018-05-11 13:51
wds1
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:24
帖 子:255
专家分:1404
注 册:2016-3-10
  得分:10 
1、因为2018/5/3是星期四,而程序是以此天为起始天计算的,并且按7天一周。
  为了实现整周变换,起始日期必须设定为周一,这样程序实现简单,都不用周判断。
  否则就需要利用周函数,或者首周判断处理。

2、DateDiff默认以周日开始,此函数可以设置默认开始日期是周一、周二、...周日的任意日开始

  2018年语句改为DateDiff("ww", date0, date1, vbMonday) '2018-1-1是周一'
2018-05-11 14:13
事业男儿
Rank: 2
等 级:论坛游民
帖 子:271
专家分: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
wds1
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:24
帖 子:255
专家分:1404
注 册:2016-3-10
  得分:0 
按这个分析一下,看看是算法问题不
startDate = CDate("2018/5/7")'当天是周1
Enddate = Date'假如是2018/5/7-13,2018/5/14-20
temp = Abs(Enddate - startDate)'2018/5/7-13对应结果为0,1,2,3,4,5,6;2018/5/14-20对应结果为7,8,9,10,11,12,13
bz = (temp / 7) Mod 3  '2018/5/7-13对应结果0;2018/5/14-20对应结果为1
'增加debug.print temp,bz看看数据是否与预测的一致。
select case bz
case 0'第一周 '正常5月7日-11日都应该此流程
case 1'第二周 '正常5月14日-20日都应该此流程
case 2'第三周
end select
2018-05-11 15:23
事业男儿
Rank: 2
等 级:论坛游民
帖 子:271
专家分: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
wds1
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:24
帖 子:255
专家分:1404
注 册:2016-3-10
  得分:0 
case语句错了
debug.pring temp,bz'这条语句是辅助显示的,可以不用
select case bz
case 0
case 1
case 2
end select
2018-05-11 16:04
wmf2014
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:153
帖 子:1706
专家分:9520
注 册:2014-12-6
  得分:10 
需要使用weekday函数将起始日期所在周调整到该周星期一所在日期,给个实例代码你参考
程序代码:
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)
  k = j 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-1,张某,李某,王某"
  MsgBox pb(a, "2018-5-7")  '只要起始数据定了,2018-5-7这个日期可以随便换,都能正确返回该日期所在周的排班结果
End Sub

能编个毛线衣吗?
2018-05-11 16:41
事业男儿
Rank: 2
等 级:论坛游民
帖 子:271
专家分:14
注 册:2007-4-25
  得分:0 
回复 7楼 wmf2014
wmf2014版主:这个代码怎么改成3班倒呢?没有看懂,希望详解!谢谢!
2018-05-11 17:00
wmf2014
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:153
帖 子:1706
专家分:9520
注 册:2014-12-6
  得分:0 
好吧,给个稍微完整的代码及运行效果

程序代码:
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)
  k = j 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-1,张某,李某,王某"
  b = Split(pb(a, Date), ",")
  Label1.Caption = Date & "" & b(0)
  Label2.Caption = Date & "" & b(1)
  Label3.Caption = Date & "" & b(2)  
End Sub
附件: 您没有浏览附件的权限,请 登录注册

能编个毛线衣吗?
2018-05-11 17:13
事业男儿
Rank: 2
等 级:论坛游民
帖 子:271
专家分:14
注 册:2007-4-25
  得分:0 
谢谢wmf2014,测试通过,同时也谢谢wds1版主耐心的讲解。
wmf2014版主再请教你一个问题,关于获取计算当日是今年第几周,按照wds1版主的意思去做了,解决了DateDiff默认的是从周日开始,周六结束,现在改了代码后已经从周一开始周日结束了,但是读到5月(7日-13日)是18周 ,实际是19周。,怎么少一周呢?
2018-05-11 17:25







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

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