MS Access日历开发:标签控件赋值触发Error 91(对象变量未设置)
解决MS Access VBA中「Object variable not set (Error 91)」错误
错误原因
你声明了ctl As Label变量,但未将其关联到窗体上实际存在的标签控件,直接对ctl.Name赋值时,ctl仍是未初始化的空对象,因此触发Error 91。
修正步骤
- 确保控件命名匹配:确认窗体上的标签控件命名规则为
lbl[星期缩写][行号](例如lblMon1、lblTue1、lblSun2等),与代码中拼接的名称一致。 - 初始化控件对象:使用
Me.Controls()方法获取对应名称的标签控件,赋值给ctl变量,而非直接修改ctl.Name。 - 修正代码其他隐患:
- 变量
lastnumday未声明类型,需添加声明语句; - 代码中
SelectedDay应为SelectedDate(属于笔误); - 变量
fdaynum需提前声明。
- 变量
修正后的完整代码
Private Sub DisplayCalendar() Dim FirstDay As String Dim lastnumday As Integer ' 声明变量类型 Dim iDay As Integer Dim ctl As Label Dim DaysArray(6) As String ' 数组下标0-6,无需设为7 Dim fdaynum As Integer ' 新增变量声明 Dim i As Integer, j As Integer ' 循环变量声明 DaysArray(0) = "Mon" DaysArray(1) = "Tue" DaysArray(2) = "Wed" DaysArray(3) = "Thu" DaysArray(4) = "Fri" DaysArray(5) = "Sat" DaysArray(6) = "Sun" ' 修正SelectedDay为SelectedDate,用DateSerial构造当月第一天 FirstDay = Format(DateSerial(Year(SelectedDate), Month(SelectedDate), 1), "ddd") ' 直接用Day函数获取当月最后一天,无需Format转换 lastnumday = Day(DateSerial(Year(SelectedDate), Month(SelectedDate) + 1, 0)) ' 找到当月第一天对应的星期下标 fdaynum = -1 For i = 0 To 6 If DaysArray(i) = FirstDay Then fdaynum = i Exit For End If Next ' 处理fdaynum未找到的情况(避免后续逻辑出错) If fdaynum = -1 Then Exit Sub j = 1 For iDay = 1 To lastnumday ' 获取对应名称的标签控件 Set ctl = Me.Controls("lbl" & DaysArray(fdaynum) & j) ' 设置日期标题 ctl.Caption = iDay ' 更新星期下标和行号 If fdaynum = 6 Then fdaynum = 0 j = j + 1 Else fdaynum = fdaynum + 1 End If Next End Sub
额外说明
- 如果运行时提示“找不到控件”,请检查窗体上的标签名称是否与代码中拼接的完全一致(Access控件名称不区分大小写,但尽量保持统一);
- 新增
fdaynum = -1的初始化和判断,避免当月第一天星期匹配失败时导致后续逻辑出错。
内容的提问来源于stack exchange,提问作者Michael Michaloudis
相关产品推荐
相关产品推荐

