Microsoft 日历控件10.0 及更高版本对 FirstDay 属性使用的值不正确

备注

Office 365 ProPlus 正在重命名为适用于企业的 Microsoft 365 应用。 有关此更改的详细信息, 请阅读此博客文章

原始 KB 数:  826761

备注

本文适用于 Microsoft Access 数据库(.mdb)文件或 Microsoft Access 数据库(.accdb)文件。 需要基本的宏、编码和互操作性技能。

症状

在 Microsoft Access 中,日历控件的第一天显示为不正确的一天。 当您将 Microsoft 日历控件10.0 或更高版本插入到表单或报表中,然后 FirstDay 使用 Microsoft Visual Basic For Applications (VBA)固有常量设置 Calendar 控件的属性时,会发生此问题。

例如,将 FirstDay 日历控件的属性设置为VbMondayvbTuesday。 当您将 FirstDay 日历控件的属性设置为vbTuesday时,日历将使用星期三作为一周的第一天。

备注

使用早期版本的日历控件时,可以 FirstDay 正确设置属性。

原因

发生此问题的原因是在 Microsoft Visual Basic 中定义的天数(如vbSundayvbMonday)的固有常量不与正确的日期值相关联。

解决方法

若要解决此问题,请按照下列步骤操作:

  1. 确定各天之间的关联、VBA 固有常量以及与正确的日期值和 VBA 固有常量相关联的数字值。 要实现这一点,请执行下列步骤:

    1. 启动 Access。

    2. 打开 "罗斯文" 示例数据库。

    3. 在数据库窗口中,单击 "对象" 下的 "窗体"。

      备注

      在 Access 2007 中,单击 "创建" 选项卡,然后单击 "窗体" 组中的 "窗体设计"。

    4. 在右侧窗格中,双击 "设计视图" 中的 "创建窗体"。

      备注

      在 Access 2007 中,跳过此步骤。

    5. 在 "插入" 菜单上,单击 " ActiveX 控件"。

    备注

    在 Access 2007 中,单击 "设计" 选项卡,然后单击 "控件" 组中的 "插入 ActiveX 控件"。

    1. 在 "插入 ActiveX 控件" 对话框中,单击以选择 "选择 ActiveX 控件" 列表框中的 "日历控件 10.0 " 或 "更高版本",然后单击 "确定"

    2. 将命令按钮添加到其属性设置如下的窗体中:

      属性
      Name testFD
      Caption 更改第一天
    3. 在“文件”**** 菜单上,单击“保存”****。

      备注

      在 Access 2007 中,单击 " Microsoft Office" 按钮,然后单击 "保存"。

    4. 在 "另存为" 对话框中,在 "窗体名称" 框中键入 Form1,然后单击 "确定" 以保存 Form1 窗体。

    5. 在“视图”**** 菜单上,单击“代码”****。

      备注

      在 Access 2007 中,单击 "设计" 选项卡,然后单击 "工具" 组中的 "查看代码"。

    6. 在 Visual Basic 编辑器中,键入或粘贴以下代码:

      Option Compare Database
      
      Private Sub testFD_Click()
          Calendar0.FirstDay = vbTuesday
      End Sub
      
    7. 在窗体视图中打开 "Form1"。

    8. 单击 "更改第一天" 按钮。

      备注

      如果日历控件的第一列未设置为星期二,请记下第一列中的日期。

    9. 在 Visual Basic 编辑器中,单击 "视图" 菜单上的 "即时窗口"。

    10. 在 "立即" 窗口中,键入 ? vbTuesday,然后按 enter。

      请注意数字值。

    11. 通过将vbTuesday替换为其他 VBA 固有常量(如vbMondayvbWednesday),重复步骤 j 到步骤 o。

      请注意,您将具有下表,以显示各天之间的关联、VBA 固有常量以及与正确的日期值和 VBA 固有常量相关联的数字值。

      星期几 VBA 固有常量 关联的数值
      星期一 vbSunday 1
      星期二 vbMonday 双面
      星期三 vbTuesday 第三章
      星期四 vbWednesday 4
      星期五 vbThursday 5
      星期六 vbFriday 6
      星期日 vbSaturday 7
  2. 创建已正确映射到工作日的全局自定义枚举。 要实现这一点,请执行下列步骤:

    1. 在 "数据库" 窗口中,单击 "对象" 下的 "模块"。

      备注

      在 Access 2007 中,单击 "创建" 选项卡,单击 "其他" 组中的 "" 下的箭头,然后单击 "模块"。

    2. 在“插入”**** 菜单上,单击“模块”****。

      备注

      在 Access 2007 中,跳过此步骤。

    3. 在 Visual Basic 编辑器中键入或粘贴以下代码:

      Option Explicit
      
      Public Enum nwFirstDay
         nwMonday = 1
         nwTuesday = 2
         nwWednesday = 3
         nwThursday = 4
         nwFriday = 5
         nwSaturday = 6
         nwSunday = 7
      End Enum
      

      备注

      创建枚举,如 "Week Day" 列中所述,以及步骤1r 中的表对应的 "数值关联" 列中所述。

    4. 将该模块命名Day_Association并保存它。

    5. 关闭 Visual Basic 编辑器。

  3. 将应用程序中的 VBA 固有常量替换为在步骤2中所述的自定义枚举中的常量。

    例如,如果您的原始代码是

    Calendar0.FirstDay = vbTuesday
    

    修改代码以使用自定义枚举,如下所示:

    Calendar0.FirstDay = nwTuesday
    
  4. 运行应用程序。

更多信息

VBA 固有常量不依赖于系统本地信息。 例如,在采用德语语言的本地化操作系统的计算机上,一周的第一天为星期一。 与计算机上的星期一相关联的数值始终为0。

由于日历控件10.0 或更高版本是一个全球 Microsoft ActiveX 控件,因此您无法根据计算机规范控制与 VBA 固有常量相关联的数字值。 因此,将出现本文 "症状" 一节中提到的问题。

再现问题的步骤

  1. 启动 Access。

  2. 打开 "罗斯文" 示例数据库。

  3. 在数据库窗口中,单击 "对象" 下的 "窗体"。

    备注

    在 Access 2007 中,单击 "创建" 选项卡,然后单击 "窗体" 组中的 "窗体设计"。

  4. 在右侧窗格中,双击 "设计视图" 中的 "创建窗体"。

    备注

    在 Access 2007 中,跳过此步骤。

  5. 在 "插入" 菜单上,单击 " ActiveX 控件"。

    备注

    在 Access 2007 中,单击 "设计" 选项卡,然后单击 "控件" 组中的 "插入 ActiveX 控件"。

  6. 在 "插入 ActiveX 控件" 对话框中,单击以选择 "选择 ActiveX 控件" 列表框中的 "日历控件 10.0 " 或 "更高版本",然后单击 "确定"

  7. 将命令按钮添加到其属性设置如下的窗体中:

    属性
    Name testFD
    Caption 更改第一天
  8. 在“视图”**** 菜单上,单击“代码”****。

    备注

    在 Access 2007 中,单击 "设计" 选项卡,然后单击 "工具" 组中的 "查看代码"。

  9. 在 Visual Basic 编辑器中,键入或粘贴以下代码:

    Option Compare Database
    
    Private Sub testFD_Click()
     Calendar0.FirstDay = vbTuesday
    End Sub
    
  10. 在“文件”**** 菜单上,单击“保存”****。

    备注

    在 Access 2007 中,单击 " Microsoft Office" 按钮,然后单击 "另存为"。

  11. 在 "另存为" 对话框中,在 "窗体名称" 框中键入 Form1in,然后单击 "确定" 以保存 Form1 窗体。

  12. 在窗体视图中打开 "Form1"。

  13. 单击 "更改第一天" 按钮。

    虽然将 FirstDay 日历控件的属性设置为vbTuesday,但日历将选择星期三作为一周的第一天。

引用

有关日历控件和日历控件属性的详细信息,请打开 Mscal.ocx,然后搜索相应的主题。 Mscal.ocx 位于以下文件夹中:

Microsoft Access 2002

安装驱动器\Program Files\Microsoft Office\Office10

Microsoft Office Access 2003

安装驱动器\Program Files\Microsoft Office\Office11

备注

安装驱动器是您的安装驱动器的名称的占位符。