RowSourceType 屬性 (程式碼引數值) 使用者定義函數

您建立的 Visual Basic 函式必須接受五個引數。 第一個引數必須宣告成一個控制項然後其餘的引數需宣告成 Variant 。 此函數本身必須傳回 Variant

Functionfunctionname (fldAs ControlidAs VariantrowAs VariantcolAs VariantcodeAs Variant) As Variant

Function 程序有五個必須的引數。

參數 描述
Fld 這是參照被填入的清單方塊或下拉式方塊的控制項變數。
id 識別要填入之控制項的唯一值。 當您想要針對多個清單方塊或下拉式方塊使用相同的使用者定義函式,而且必須區分它們時,這會很有用。 (範例會將此變數設定為 Timer function.)
填入資料的列 (以 0 為基礎)。
col 填入資料的欄 (以 0 為基礎)。
code 指定被要求此種資訊類型的內部常數。

注意事項

[!注意事項] 因為 Microsoft Access 多次呼叫使用者定義函數於清單輸入項目,通常您必須於每一次的呼叫之間保存資訊。 最好的解決方法是使用 Static 變數。

Microsoft Access 在 code 引數中利用不同的值來反覆呼叫使用者定義函數,以指定它所需的資訊。 code 引數可以使用下列的內部常數。

常數 意義 函數傳回
acLBInitialize 初始化 如果函數能填入清單則為非零,否則為 False (0) 或 Null
acLBOpen 開啟 如果函數能填入清單則為非零 ID 值,否則為 FalseNull
acLBGetRowCount 列數 清單 (中的資料列數目可以是零) ;如果未知,則為 -1。
acLBGetColumnCount 欄數 清單中的欄數 (不能為零),必須符合屬性表值。
acLBGetColumnWidth 欄寬 寬度 (以 twip 為單位,) col 引數所指定的資料行;-1 以使用預設寬度。
acLBGetValue 清單輸入項 rowcol 引數所指定並被顯示於列與欄的清單輸入項。
acLBGetFormat 格式字串 格式化字串,用來格式化資料列和col引數所指定之資料列和資料行中顯示的清單專案;-1 使用預設格式。
acLBEnd 結束(使用者定義函數的最後呼叫總是用到這個值)。 不執行任何動作。
acLBClose (未使用) 未使用。

Access 會針對 acLBInitializeacLBOpenacLBGetRowCountacLBGetColumnCount呼叫您的使用者定義函式一次。 它會設定使用者定義函數的初始值、開啟詢問、並決定欄與列的數目。

Access 會針對 acLBGetColumnWidth呼叫您的使用者定義函式兩次—一次用來判斷清單方塊或下拉式方塊的總寬度,第二次則是設定資料行寬度。

acLBGetValueacLBGetFormat 呼叫您的使用者定義函數以得到清單項目及格式化字串的次數是根據項目的次數、使用者的捲動及其他因素而不同。

當表單關閉或每次查詢清單方塊或下拉式方塊時,Access 會呼叫 acLBEnd 的使用者定義函數。

每當特定值 (例如需要) 的資料行數目時,傳回 Null 或任何不正確值會導致 Access 停止使用該程式碼呼叫使用者定義函數。

提示

使用範例中的 Select Case 程式碼結構作為您自己的 RowSourceType 屬性使用者定義函式的範本。

範例

下列的使用者定義函數傳回了今天日期之後的四個星期一的清單。 為要從一個清單方塊控制項中呼叫這個函數,輸入 ListMondays 來當作 RowSourceType 屬性設定並讓 RowSource 屬性設定保持空白。

Public Function ListMondays(fld As Control, id As Variant, _
    row As Variant, col As Variant, code As Variant) _ 
    As Variant 

    Dim Offset      As Integer
    Dim WeekdayDate As Date 
 
    Select Case code 
        Case acLBInitialize     ' Initialize. 
            ListMondays = True 
        Case acLBOpen           ' Open. 
            ListMondays = Timer ' Unique ID. 
        Case acLBGetRowCount    ' Get rows. 
            ListMondays = 4 
        Case acLBGetColumnCount ' Get columns. 
            ListMondays = 1 
        Case acLBGetColumnWidth ' Get column width. 
            ListMondays = -1    ' Use default width. 
        Case acLBGetValue       ' Get the data. 
            Offset = Abs((9 - Weekday(Date)) Mod 7) 
            WeekdayDate = DateAdd("d", _
                Offset + 7 * row, Date) 
            ListMondays = Format(WeekdayDate, _
                "mmmm d") 
    End Select 

End Function

下列的範例利用一個靜態陣列來儲存在目前目錄底下的資料庫名稱。 若要呼叫這個函數,輸入 ListMDBs 來當作 RowSourceType 屬性設定值並讓 RowSource 屬性設定值保持空白。

Public Function ListMDBs(fld As Control, id As Variant, _ 
    row As Variant, col As Variant, code As Variant) _
    As Variant 
    
    Static dbs(127) As String
    Static Entries  As Integer 
    Dim ReturnVal   As Variant 

    ReturnVal = Null 
    Select Case code 
        Case acLBInitialize     ' Initialize. 
            Entries = 0 
            dbs(Entries ) = Dir("*.MDB") 
            Do Until dbs(Entries) = "" Or Entries >= 127 
                Entries = Entries + 1 
                dbs(Entries) = Dir 
            Loop 
            ReturnVal = Entries 
        Case acLBOpen           ' Open. 
            ' Generate unique ID for control. 
            ReturnVal = Timer 
        Case acLBGetRowCount    ' Get number of rows. 
            ReturnVal = Entries 
        Case acLBGetColumnCount ' Get number of columns. 
            ReturnVal = 1 
        Case acLBGetColumnWidth ' Column width. 
            ' -1 forces use of default width. 
            ReturnVal = -1 
        Case acLBGetValue       ' Get data. 
            ReturnVal = dbs(row) 
        Case acLBEnd            ' End. 
            Erase dbs 
    End Select 
    ListMDBs = ReturnVal 
    
End Function

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應