用户应该在文本框、字符串或数字中输入什么?
如果用户输入是一个字符串,那么您应该将月份放在这样的引号中,Case "Feb", "February"
并且month
需要声明为 aString
并直接分配txtmonth.Text
而无需Val
如果用户输入的是一个数字,那么您需要从Case
like中删除所有短月份和长月份名称Feb
,March
并使用这样的数字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 月开始的天数,使用 this
Day(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
或其他名称。
有一个明确定义的代码的一些提示: - 重命名year
为myYear
use camel style: change all labels and text boxes to follow this naming convention. Example: rename
lblday to
lblDay and
txtmonth to
txtMonth
如果你不需要,不要使用变量。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