碰巧看到了自己之前的帖子,后来我又做了个日历,不是用的类模块,就是用的普通的方法,反思一下,其实我们利用日历工具的目的,就是1、保证日期的格式正确,2、输入速度快捷,3、2月份28天或29天以及其他月份30天或31天的问题。要快捷还是用面板的形式最好了,尽量把月份和日期都摆在用户面前,尽量少用combobox下拉列表,下拉选择会拖慢速度。我用选项按钮OptionButton,并把月份和日期分别放在两个Frame中,这样就能保证单一选择的问题。
考虑到多场景应用,例如输入起止日期,设置了“单一日期”和“起止日期”的设置按钮,当为起止日期时,会选择两次日期,并保存到相应位置。至于将日期放置在什么地方,是否可以自定义,在窗体中,我是把日期放置在selection中了,而截止日期则放置在selection.offset(0,2),那么在调用userform时,则可以先select,例如:
Public Sub shurudate()
sheet1.range("b1").select'先进行单元格选中,那么窗体中的selection就知道是什么位置了
UserForm400.Show
End Sub
对于28天29天30天31天的问题,我是对每个月份的click()事件进行了赋码,看似比较繁琐,但就是复制粘贴代码,也不麻烦。
Private Sub OptionButton1_Click()
'如果1月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton10_Click()
'如果10月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton11_Click()
'如果11月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = False
End Sub
Private Sub OptionButton12_Click()
'如果12月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton2_Click()
'如果2月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
If ComboBox1.Value Mod 4 = 0 Then
Me.Controls("OptionButton42").Visible = False
Me.Controls("OptionButton43").Visible = False
Else
Me.Controls("OptionButton41").Visible = False
Me.Controls("OptionButton42").Visible = False
Me.Controls("OptionButton43").Visible = False
End If
End Sub
Private Sub OptionButton3_Click()
'如果3月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton4_Click()
'如果4月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = False
End Sub
Private Sub OptionButton5_Click()
'如果5月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton6_Click()
'如果6月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = False
End Sub
Private Sub OptionButton7_Click()
'如果7月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton8_Click()
'如果8月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = True
End Sub
Private Sub OptionButton9_Click()
'如果9月被选择
If VBA.Len(ComboBox1.Value) = 0 Then
MsgBox "没有选择年份"
Exit Sub
End If
Me.Controls("OptionButton41").Visible = True
Me.Controls("OptionButton42").Visible = True
Me.Controls("OptionButton43").Visible = False
End Sub
Private Sub UserForm_Initialize()
Dim n As Long, x As Integer
CommandButton4.Caption = "单一日期"
CommandButton3.Visible = False
CommandButton2.Caption = "OK"
n = VBA.Year(Date)
For x = 1 To 8
ComboBox1.AddItem n - 2 + x
Next
ComboBox1.Value = n
End Sub
我实际用起来确实比较方便,代码不复杂,但是思路还是不错的,不需要花里胡哨的界面,只求效率。

日历文件.rar
(325 Bytes, 下载次数: 0)