0

我正在创建一个程序来预测本月的最后一天。我已经设法给月份赋予了价值,但是为了确定它是否是闰年,还需要写下年份。对象:2 个文本框、1 个命令按钮、1 个标签

不幸的是,需要选择案例。

我的代码:

Private Sub Command1_Click()
Dim month, year As String

month = txtmonth.Text
year = txtyear.Text

Select Case month
Case "Feb", "February"
        lblday.Caption = CStr(Day(DateSerial(year, 3, 1) - 1))
Case "Jan", "January", "Mar", "March", "May", "Jul", "July", "Aug", "August", "Oct", "October", Dec, December
        lblday.Caption = "It has" & " " & CStr(Day(DateSerial(year, 3 + 2, 1) - 1)) & " " & "days"
'year/30/month
Case "April", "Jun", "June", "Sept", "September", "Nov", "November"
        lblday.Caption = "It has" & " " & CStr(Day(DateSerial(year, 3 + 1, 1) - 1)) & " " & "days"
'year/31/month
End Select

End Sub
4

2 回答 2

1

用户应该在文本框、字符串或数字中输入什么?

如果用户输入是一个字符串,那么您应该将月份放在这样的引号中,Case "Feb", "February"并且month需要声明为 aString并直接分配txtmonth.Text而无需Val

如果用户输入的是一个数字,那么您需要从Caselike中删除所有短月份和长月份名称FebMarch并使用这样的数字Case 2 ' this is for February

如果您希望优化您的代码(假设您绝对必须有一个Case),而不是询问用户闰年,您可以自己计算:

Case Feb, February
     lblday.Caption = Cstr(day(DateSerial(Year(Now), 3, 1) - 1))

如果你不必Case在那里,你所有的代码都可以优化到这个:

Private Sub Command1_Click()
    lblday.Caption = CStr(Day(DateSerial(Year(Now), Month(DateValue(txtmonth.Text & " 0")) + 1, 1) - 1))
End Sub

使用该代码,您可以输入月份编号、月份全名或月份简称,它将起作用。它将假定年份为当前年份(您没有指定用户是否输入年份)。

编辑:

我拿走了您的代码并修复了以下问题:

  • 重新排列月份,因为有些月份是 30 天的月份,而它们是 31 天的月份,反之亦然
  • 将大小写更改为小写。这样,您可以在任何情况下输入月份名称。例如,之前,只有Oct会起作用。现在一切正常:oct, OCT, oCt, OcT...
  • 改为一致Sept_sep
  • 改变了你计算一个月天数的方式。对于 30 天的月份,您使用 this 获取从 4 月开始的天数,使用 thisDay(DateSerial(year, 3 + 2, 1) - 1)获取从 3 月开始的 31 天月份Day(DateSerial(year, 3 + 1, 1) - 1)。如果将来我们改变三月份的天数会怎样?整个逻辑崩溃了。我意识到这不太可能,但仍有可能。我们绝对没有理由不能像这样单独计算每个月CStr(Day(DateSerial(year, month(DateValue(txtmonth.Text & " 0")) + 1, 1) - 1))
  • 由于我在上面所做的更改,我不得不使用调用的函数,Month但是您已经调用了一个命名错误的变量month,所以这是我必须修复的冲突,因此month完全删除了变量。如果您必须拥有它,请将其重命名为myMonth或其他名称。

有一个明确定义的代码的一些提示: - 重命名yearmyYear use camel style: change all labels and text boxes to follow this naming convention. Example: renamelblday tolblDay andtxtmonth totxtMonth 如果你不需要,不要使用变量。month变量是不必要的。您甚至可以删除year变量,因为您根本不对其进行任何计算。

    Private Sub Command1_Click()
        Dim year As String
        year = txtyear.Text

        Select Case LCase(txtmonth.Text)
            Case "feb", "february"
                lblday.Caption = CStr(Day(DateSerial(year, 3, 1) - 1))
            Case "april", "apr", "jun", "june", "sep", "september", "nov", "november"
                lblday.Caption = "It has" & " " & CStr(Day(DateSerial(year, month(DateValue(txtmonth.Text & " 0")) + 1, 1) - 1)) & " " & "days"
                'year/30/month
            Case "jan", "january", "mar", "march", "may", "jul", "july", "aug", "august", "oct", "october", "dec", "december"
                lblday.Caption = "It has" & " " & CStr(Day(DateSerial(year, month(DateValue(txtmonth.Text & " 0")) + 1, 1) - 1)) & " " & "days"
                'year/31/month
        End Select
    End Sub
于 2013-08-14T18:32:35.687 回答
0
LastDate= DateAdd("m", 1, DateAdd("d", -1 * Day(Date), Date))
于 2020-10-11T02:59:21.347 回答