RowSourceType 屬性 (程式代碼自變數值) 用戶定義函數
您建立的 Visual Basic 函式必須接受五個自變數。 第一個引數必須宣告成一個控制項然後其餘的引數需宣告成 Variant 。 此函數本身必須傳回 Variant 。
Functionfunctionname (fldAs Control, idAs Variant, rowAs Variant, colAs Variant, codeAs Variant) As Variant
Function 程序有五個必須的引數。
論點 | 描述 |
---|---|
fld | 這是參照被填入的清單方塊或下拉式方塊的控制項變數。 |
id | 識別要填入之控件的唯一值。 當您想要針對多個清單框或下拉式方塊使用相同的使用者定義函式,而且必須區分它們時,這會很有用。 (範例會將此變數設定為 Timer function.) |
排 | 填入資料的列 (以 0 為基礎)。 |
山坳 | 填入資料的欄 (以 0 為基礎)。 |
code | 指定被要求此種資訊類型的內部常數。 |
注意事項
[!注意事項] 因為 Microsoft Access 多次呼叫使用者定義函數於清單輸入項目,通常您必須於每一次的呼叫之間保存資訊。 最好的解決方法是使用 Static 變數。
Microsoft Access 在 code 引數中利用不同的值來反覆呼叫使用者定義函數,以指定它所需的資訊。 code 引數可以使用下列的內部常數。
常數 | 意義 | 函數傳回 |
---|---|---|
acLBInitialize | 初始化 | 如果函數能填入清單則為非零,否則為 False (0) 或 Null。 |
acLBOpen | 開啟 | 如果函數能填入清單則為非零 ID 值,否則為 False 或 Null。 |
acLBGetRowCount | 列數 | 清單 (中的數據列數目可以是零) ;如果未知,則為 -1。 |
acLBGetColumnCount | 欄數 | 清單中的欄數 (不能為零),必須符合屬性表值。 |
acLBGetColumnWidth | 欄寬 | 寬度 (以 twip 為單位,) col 自變數所指定的數據行;-1 以使用預設寬度。 |
acLBGetValue | 清單輸入項 | row 及 col 引數所指定並被顯示於列與欄的清單輸入項。 |
acLBGetFormat | 格式字串 | 格式化字串,用來格式化數據列和 col 自變數所指定之數據列和數據行中顯示的清單專案;-1 使用預設格式。 |
acLBEnd | 結束(使用者定義函數的最後呼叫總是用到這個值)。 | 不執行任何動作。 |
acLBClose | (未使用) | 未使用。 |
Access 會針對 acLBInitialize、 acLBOpen、 acLBGetRowCount 和 acLBGetColumnCount 呼叫您的使用者定義函式一次。 它會設定使用者定義函數的初始值、開啟詢問、並決定欄與列的數目。
Access 會針對 acLBGetColumnWidth 呼叫您的使用者定義函式兩次—一次用來判斷清單框或下拉式方塊的總寬度,第二次則是設定數據行寬度。
對 acLBGetValue 和 acLBGetFormat 呼叫您的使用者定義函數以得到清單項目及格式化字串的次數是根據項目的次數、使用者的捲動及其他因素而不同。
當表單關閉或每次查詢清單框或下拉式方塊時,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 支援與意見反應。