Поделиться через


Значения аргументов кода свойства RowSourceType (определяемая пользователем функция)

Созданная функция Visual Basic должна принимать пять аргументов. Первый аргумент должен быть объявлен как элемент управления, а остальные — как Variants. Сама функция должна возвращать значение Variant.

Functionname (fldAs Control, idAs Variant, rowAs Variant, colAs Variant, codeAs Variant) As Variant

Процедура Function содержит следующие пять обязательных аргументов.

Аргументация Описание
Fld Переменная элемента управления, ссылающаяся на заполняемый список или поле со списком.
id Уникальное значение, определяющее заполняемый элемент управления. Это полезно, если вы хотите использовать одну определяемую пользователем функцию для нескольких списков или полей со списком и должны различать их. (В примере для этой переменной задается значение функции Таймер .)
Строки Заполняемая строка (отсчитывается от нуля).
Col Заполняемый столбец (от нуля).
code Встроенная константа, указывающая тип запрашиваемой информации.

Примечание.

Так как Microsoft Access несколько раз вызывает определяемую пользователем функцию для вставки элементов в список, часто необходимо сохранять информацию от вызова к вызову. Лучший способ сделать это — использовать статические переменные.

Microsoft Access вызывает определяемую пользователем функцию, многократно используя различные значения в аргументе кода для указания необходимых сведений. Аргумент кода может использовать следующие встроенные константы.

Константа Смысл Функция возвращает
acLBInitialize Initialize Ненулевое значение, если функция может заполнить список; Значение false (0) или значение NULL в противном случае.
acLBOpen Открыть Ненулевое значение идентификатора, если функция может заполнить список; В противном случае значение false или null .
acLBGetRowCount Количество строк Количество строк в списке (может быть равно нулю); -1, если неизвестно.
acLBGetColumnCount Число столбцов Количество столбцов в списке (не может быть равным нулю); должно соответствовать значению листа свойств.
acLBGetColumnWidth Ширина столбца Ширина (в твипах) столбца, заданного аргументом col ; -1, чтобы использовать ширину по умолчанию.
acLBGetValue Запись в списке Запись списка, отображаемая в строке и столбце, заданных аргументами row и col .
acLBGetFormat Строка форматирования Форматировать строку, используемую для форматирования записи списка, отображаемой в строке и столбце, указанных аргументами row и col ; -1 для использования формата по умолчанию.
acLBEnd End (последний вызов определяемой пользователем функции всегда использует это значение) Ничего.
acLBClose (Не используется) Не используется.

Access вызывает определяемую пользователем функцию один раз для acLBInitialize, acLBOpen, acLBGetRowCount и acLBGetColumnCount. Он инициализирует определяемую пользователем функцию, открывает запрос и определяет количество строк и столбцов.

Access дважды вызывает определяемую пользователем функцию для acLBGetColumnWidth: один раз для определения общей ширины списка или поля со списком, а второй раз — для задания ширины столбца.

Количество вызовов определяемой пользователем функции для acLBGetValue и acLBGetFormat для получения записей списка и форматирования строк зависит от количества записей, прокрутки пользователя и других факторов.

Access вызывает определяемую пользователем функцию для acLBEnd при закрытии формы или при каждом запросе списка или поля со списком.

Каждый раз, когда требуется определенное значение (например, количество столбцов), возврат значения NULL или любого недопустимого значения приводит к тому, что Access перестает вызывать определяемую пользователем функцию с этим кодом.

Совет

Используйте структуру кода Select Case из примера в качестве шаблона для пользовательских функций, определяемых пользователем свойств RowSourceType .

Пример

Следующая определяемая пользователем функция возвращает список следующих четырех понедельников после сегодняшней даты. Чтобы вызвать эту функцию из элемента управления list box, введите 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

В следующем примере статический массив используется для хранения имен баз данных в текущем каталоге. Чтобы вызвать эту функцию, введите ListMDB в качестве параметра свойства 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 и обратная связь.