RowSourceType 用户定义函数 - “code” 参数常量

RowSourceType user-defined function - "code" argument constants

提问人:youarethemusic 提问时间:11/12/2023 最后编辑:June7youarethemusic 更新时间:11/13/2023 访问量:58

问:

我正在研究一些教科书示例,其中一个示例表明,通过从控件的 RowSourceType 属性调用用户定义的函数,可以使用用户定义的函数来填充组合或列表框。

用户定义的函数必须接受特定的输入,因为 Access 在填写列表或组合框时会多次调用该函数。您可以在此处查看常量的名称。

然后,当我打开某个窗体时,该窗体上控件的 RowSourceType 属性将调用以下函数。

Function listEndDates(fld As Control, id As Variant, row As Variant, col As Variant, code As Variant) As Variant
    Debug.Print code 'I inserted this so I could see what constants Access was giving the function
    Dim integerOffset As Integer
    
    Select Case code
        Case acLBInitialize
            listEndDates = True
        Case acLBOpen
            listEndDates = Timer
        Case acLBGetRowCount
            listEndDates = 11
        Case acLBGetColumnCount
            listEndDates = 1
        Case acLBGetColumnWidth
            listEndDates = -1
        Case acLBGetValue
            integerOffset = Abs((8 - Weekday(Now)) Mod 7)
            listEndDates = Format(((Now() + integerOffset) - 35) _
       + 7 * row, "MM/DD/YYYY")
    End Select
    
End Function

这将在即时窗口中生成以下输出,并且我键入了相应的常量名称。但是 MS Access 对常数 2 做了什么?

 0 acLBInitialize

 2
 1 acLBOpen
 4 acLBGetColumnCount
 5 acLBGetColumnWidth
 5 acLBGetColumnWidth
 3 acLBGetRowCount

 6 acLBGetValue
 7 acLBGetFormat

我尝试查看VBA文档,并在对象浏览器中显示隐藏成员。Access.Constants 中没有值为 2 的常量。

VBA MS-访问

评论


答:

2赞 Gustav 11/12/2023 #1

我有同样的问题,答案是,它仅供内部使用 - 正如我的项目 VBA 中引用的那样。本段中 GitHub 的回调:

2.动态格式

显然,没有值 2 在使用中,因此没有常量 值存在。然而,事实并非如此,只有内部值 use only - 检查控件的 RowSource 类型。运行 一些测试会发现,稍后使用 参数 Code “does nothing” 的值为 2。

这将打开一个选项,用于调用函数来执行“其他操作”,而不是 否则它应该这样做,而这个“其他事情”可能是 重新配置回调函数。

为此,引入了一个命名常量,其目的是:

2 acLBOpenAsVariant

补遗

若要返回多列,请使用如下所示的变量:Column

改进的示例

其中第一列返回真实的日期值,第二列返回要显示的格式化日期:

Case acLBGetValue                       ' Get the data for each row.
    DayOfWeek = (FirstDayOfWeek + Row - 1) Mod DaysPerWeek + 1
    If Column = 0 Then
        ' Return weekday value.
        Value = DayOfWeek
    Else
        ' Return friendly name for display.
        Value = StrConv(WeekdayName(DayOfWeek, False, vbSunday), vbProperCase)
    End If

评论

0赞 Shahram Alemzadeh 11/12/2023
是否可以从此用户定义的函数返回多个值以使列表框/组合框成为多列?
1赞 Gustav 11/12/2023
是的,请看扩展答案。