Excel自定义日历中日期的倒序
我正在使用Excel中的自定义日历,用户双击单元格后会激活该日历。问题在于前12天的月份和日期顺序。月份放在第一位,而不是日期(将日期格式更改为dd mmmm yyyy没有帮助),因此宏将2020年5月2日而不是2020年2月5日放在第一位 只有在选择日历中的前12天时,当单击13-31日历将日期设置为正确格式时,才会出现问题,因此2020年2月5日。Excel文件可用。下面是完整的代码:Excel自定义日历中日期的倒序,excel,vba,Excel,Vba,我正在使用Excel中的自定义日历,用户双击单元格后会激活该日历。问题在于前12天的月份和日期顺序。月份放在第一位,而不是日期(将日期格式更改为dd mmmm yyyy没有帮助),因此宏将2020年5月2日而不是2020年2月5日放在第一位 只有在选择日历中的前12天时,当单击13-31日历将日期设置为正确格式时,才会出现问题,因此2020年2月5日。Excel文件可用。下面是完整的代码: Dim Buttons() As New clsCmdButton Sub Show_Cal()
Dim Buttons() As New clsCmdButton
Sub Show_Cal()
'use class module to create commandbutton collection, then show calendar
Dim iCmdBtns As Integer
Dim ctl As Control
iCmdBtns = 0
For Each ctl In frmCalendar.Controls
If TypeName(ctl) = "CommandButton"
Then
If ctl.Name < > "CB_Close"
Then
iCmdBtns = iCmdBtns + 1
ReDim Preserve Buttons(1 To iCmdBtns)
Set Buttons(iCmdBtns).CmdBtnGroup = ctl
End If
End If
Next ctl
frmCalendar.Show
End Sub
Private Sub CB_Close_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
Dim i As Long
Dim lYearsAdd As Long
Dim lYearStart As Long
lYearStart = Year(Date) - 10
lYearsAdd = Year(Date) + 10
With Me
For i = 1 To 12
.CB_Mth.AddItem Format(DateSerial(Year(Date), i, 1), "mmmm")
Next
For i = lYearStart To lYearsAdd
.CB_Yr.AddItem Format(DateSerial(i, 1, 1), "yyyy")
Next
.Tag = "Calendar"
.CB_Mth.ListIndex = Month(Date) - 1
.CB_Yr.ListIndex = Year(Date) - lYearStart
.Tag = ""
End With
Call Build_Calendar
End Sub
Private Sub CB_Mth_Change()
If Not Me.Tag = "Calendar"
Then Build_Calendar
End Sub
Private Sub CB_Yr_Change()
If Not Me.Tag = "Calendar"
Then Build_Calendar
End Sub
Sub Build_Calendar()
Dim i As Integer
Dim dTemp As Date
Dim dTemp2 As Date
Dim iFirstDay As Integer
With Me
.Caption = " " & .CB_Mth.Value & " " & .CB_Yr.Value
dTemp = CDate("01/" & .CB_Mth.Value & "/" & .CB_Yr.Value)
iFirstDay = WeekDay(dTemp, vbSunday)
.Controls("D" & iFirstDay).SetFocus
For i = 1 To 42
With.Controls("D" & i)
dTemp2 = DateAdd("d", (i - iFirstDay), dTemp)
.Caption = Format(dTemp2, "d")
.Tag = dTemp2
.ControlTipText = Format(dTemp2, "dd/mm/yyyy")
'add dates to the buttons
If Format(dTemp2, "mmmm") = CB_Mth.Value Then
If.BackColor < > & H80000016 Then.BackColor = & H80000018
If Format(Date, "dd mmmm yyyy") = Format(Date, "dd/mm/yyyy") Then.SetFocus
.Font.Bold = True
Else
If.BackColor < > & H80000016 Then.BackColor = & H8000000F
.Font.Bold = False
End If
'format the buttons
End With
Next
End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("DateEntry")) Is Nothing Then Exit Sub
If Target.Value < > ""
Then Exit Sub
Set rngAC = Target
g_bForm = True
frmCalendar.Show_Cal
rngAC.NumberFormat = "dd mmmm yyyy"
rngAC.Value = g_sDate
rngAC.EntireColumn.AutoFit
End Sub
Dim Buttons()作为新的clsCmdButton
子秀_Cal()
'使用类模块创建commandbutton集合,然后显示日历
Dim iCmdBtns作为整数
Dim-ctl作为对照
iCmdBtns=0
对于frmCalendar.Controls中的每个ctl
如果TypeName(ctl)=“CommandButton”
然后
如果控制名称<>“断路器关闭”
然后
iCmdBtns=iCmdBtns+1
重拨保留按钮(1至iCmdBtns)
设置按钮(iCmdBtns)。CmdBtnGroup=ctl
如果结束
如果结束
下一个ctl
frmCalendar.Show
端接头
专用子CB_关闭_单击()
卸下我
端接头
私有子用户表单_初始化()
我想我会坚持多久
朦胧的睡意和你的一样长久
暗淡的睡意开始时一样长
lYearStart=年份(日期)-10
lYearsAdd=年份(日期)+10
和我一起
对于i=1到12
.CB_Mth.AddItem格式(日期序列(年(日期),i,1),“mmmm”)
下一个
对于i=lYearStart到lyearsad
.CB_Yr.AddItem格式(日期序列(i,1,1),“yyyy”)
下一个
.Tag=“日历”
.CB_Mth.ListIndex=月份(日期)-1
.CB_Yr.ListIndex=年份(日期)-lYearStart
.Tag=“”
以
调用生成日历
端接头
私有子CB_Mth_变更()
如果不是我。Tag=“日历”
然后构建日历
端接头
私人分公司CB_Yr_变更()
如果不是我。Tag=“日历”
然后构建日历
端接头
子构建_日历()
作为整数的Dim i
Dim dTemp作为日期
Dim dTemp2作为日期
Dim iFirstDay为整数
和我一起
.Caption=“”&.CB_Mth.Value&“&.CB_Yr.Value
dTemp=CDate(“01/”和.CB_月值和“/”和.CB_年值)
iFirstDay=工作日(dTemp、vbSunday)
.Controls(“D”和iFirstDay).SetFocus
对于i=1到42
带有.控件(“D”和i)
dTemp2=DateAdd(“d”,(i-iFirstDay),dTemp)
.Caption=格式(dTemp2,“d”)
.Tag=dTemp2
.ControlTipText=格式(dTemp2,“dd/mm/yyyy”)
'将日期添加到按钮
如果格式(dTemp2,“mmmm”)=CB_Mth.Value,则
如果.BackColor<>&H8000016,则.BackColor=&H8000018
如果格式(日期,“dd-mmmm-yyyy”)=格式(日期,“dd/mm/yyyy”),则.SetFocus
.Font.Bold=True
其他的
如果.BackColor<>&H8000016,则.BackColor=&H800000F
.Font.Bold=False
如果结束
'设置按钮的格式
以
下一个
以
端接头
专用子工作表\u选择更改(ByVal目标作为范围)
如果Target.Cells.Count>1,则退出Sub
如果Intersect(目标、范围(“日期输入”)为空,则退出Sub
如果目标值<>“”
然后退出Sub
设置rngAC=目标
g_bForm=真
frmCalendar.Show\u Cal
rngAC.NumberFormat=“dd-mmmm-yyyy”
rngAC.Value=g_sDate
rngAC.EntireColumn.AutoFit
端接头
我无法重现您的问题。但这听起来像是由于生成的日期与windows区域数据设置不匹配造成的
尝试将您的声明更改为:
Public g_sDate As Date
尝试使用
dateserial