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()

我正在使用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()
    '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