Перейти к основному контенту
Поддержка
Войдите с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Выберите другую учетную запись.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой нужно войти.

Содержимое здесь может применяться к Northwind 2.0 Developer Edition и Starter Edition. 

VBA (Visual Basic для приложений) — это язык программирования, используемый во всех продуктах Office. Обучение VBA позволяет работать со всеми продуктами Office (а не только с Access).
При поиске инструкций обязательно найдите примеры для Access и включите в поиск Microsoft Access. Часто решения для других продуктов Office будут работать, но нет никакой гарантии. Microsoft Access — это зрелый продукт; это означает, что есть много примеров; который отлично подходит для вас! 

Это также означает, что старые книги по программированию Access по-прежнему жизнеспособны для вас. Многие из старых книг по-прежнему доступны на используемых книжных сайтах за небольшую часть их первоначальной стоимости. Проверьте веб-сайт Майкрософт, чтобы определить, какие версии Access по-прежнему поддерживаются, и идти вместе с этими.

Прекращение поддержки ресурсов для Office — развертывание Office | Microsoft Learn  

Ниже приведены некоторые ссылки на документацию по Access в Корпорации Майкрософт.

Файлы Microsoft Access — это файлы Office. Файлы Office должны находиться в "надежном расположении" или содержать "содержимое". Эти элементы считаются "безопасными", так как вы создали их или они были получены из надежного источника. Проверка наличия надежных расположений происходит каждый раз, когда вы открываете любой файл office. Здесь мы будем называть это доверенным или включенным. ПРИМЕЧАНИЕ. Если новая версия приложения выпущена и открыта из ненадежного расположения, процесс включения содержимого будет повторяться.

Дополнительные сведения о надежных расположениях: 

Макросы, функции и дочерние компоненты — это способ реализации бизнес-логики в базе данных Access. Перед началом важно понять область действия и видимость .


События (например, щелчок элемента управления) в элементах управления в форме (например, кнопки, текстовые поля, метки и т. д.) активируют другие процессы, такие как добавление, удаление записей или открытие форм. Эти процессы можно реализовать с помощью макросов или VBA. Northwind Starter Edition использует в основном макросы и некоторые VBA, где макросы не могут выполнять необходимые функции. Northwind Developer Edition использует в основном VBA. 

Некоторые типы элементов управления имеют встроенные мастера для автоматического создания макроса. Например, при добавлении кнопки команды в форму открывается мастер, который предлагает несколько возможностей для кнопки. При добавлении поля со списком откроется мастер, который можно настроить для поиска определенной записи в форме. 

Область навигации — это main способ просмотра и доступа ко всем объектам базы данных, который по умолчанию отображается в левой части окна Access. 
Область навигации по Северному ветру настроена. Мы создали пользовательскую категорию с именем Northwind Starter 2.0. Это позволяет упорядочить объекты по функциональной области.

Иногда переменная должна существовать после того, как созданный объект выходит из область. См. раздел Область и видимость выше. Это можно сделать тремя основными способами: Общедоступные переменные, TempVars и Хранение значений в локальной таблице. Многие разработчики используют их сочетание. У каждого есть свои плюсы и минусы.  Дополнительные сведения о каждом из них здесь: 

Общедоступная переменная модуля VBA: 

TempVars: 

Хранение значений в локальной таблице

  • Общедоступные переменные и TempVars существуют для текущего сеанса и выходят из область при закрытии приложения. Но что делать, если вы хотите сохранить пользовательские переменные в сеансах? Эти типы значений можно хранить в локальной таблице. В Northwind 2.0 одна из таких переменных сохраняется в таблице, которая называется SystemSettings. Значение в таблице — ShowWelcome. Это значение указывает Access, если вы хотите видеть экран приветствия каждый раз при входе в систему.

Разработчикам часто требуется передавать параметры из одной формы в другую или из формы в отчет. Эти параметры передают важную информацию, которую вызываемая функция затем будет использовать для настройки самой себя. Существует несколько способов получения сведений из первой формы или отчета во второй форме. Вот несколько таких способов: 

  1. Вторая форма может "вернуться" к первой форме, чтобы получить некоторые значения, возможно, в видимом или невидимом элементе управления.  Например:
    lngCustomerID = Forms!FirstForm!cboCustomerID 

  2. Первая форма может сохранять значения в глобальных переменных или в TempVars. Например:
    g_lngUserID = Me.cboUserID 
    TempVars.Add "UserID", Me.cboUserID 

Метод, который часто используется в Northwind Developer Edition, а также в нашей профессиональной жизни, использует аргумент OpenArgs DoCmd.OpenForm или OpenReport. Например,

DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)

Здесь мы объединяем два метода: (1) использование OpenArgs для передачи VendorID и VendorType и (2) использование функции StringFormat() для создания, например, следующей строки: 

CompanyID=5&CompanyTypeID=2 

Эта строка очень похожа на строку запроса, так как используется в браузере. Он содержит одну или несколько пар "имя-значение", разделенных символом амперсанда: 

name1=value1&name2=value2


Преимущество такой строки заключается в том, что каждое значение имеет имя. Сравните этот подход с более простым подходом, в котором для OpenArgs следует задать только значение "5,2".  В этом случае потребуется много усилий, чтобы выяснить, что означает каждое значение. При именовании каждого значения строка запроса "самоописывается", что является хорошей практикой программирования.

На принимающей стороне DoCmd.OpenForm мы обычно находимся в событии Form_Open или Form_Load и хотим проанализировать строку OpenArgs в ее компоненты.

В Northwind это можно сделать с помощью функции StringToDictionary . Он принимает функцию, подобную запросу, и анализирует ее в ее компоненты. Затем эти компоненты хранятся в объекте Scripting.Dictionary . Обратите внимание, что для этого необходимо использовать Средства > ссылки и задать ссылку на среду выполнения сценариев (scrrun.dll ).

К функциям и преимуществам объекта Dictionary относятся следующие:  

  • Порядок элементов не важен

  • Простые функции для добавления и удаления элементов коллекции

  • Функции для циклического перебора коллекции, чтобы вы могли узнать, что в ней находится

  • Функция Существует , чтобы проверить, доступен ли определенный элемент.

Использование объекта словаря отображается в Northwind. Например, событие Form_Load в frmGenericDialog.

Макросы, созданные с помощью мастеров управления в Access, редко включают обработку ошибок вообще; VBA, созданный с помощью мастеров управления, может быть ограничен универсальным msgBox Err.Description.

В Northwind 2.0 мы покажем, как это сделать лучше при использовании кода VBA. Мы реализовали так называемый глобальный обработчик ошибок. Ошибки, происходящие в любой процедуре, вызывают функцию на глобальном уровне, чтобы отобразить ошибку. Большое преимущество заключается в том, что обработка ошибок является согласованной. И если сообщение необходимо изменить (например, чтобы дополнительно отобразить номер ошибки или записать ошибку в файл), это необходимо сделать только в одном месте. 

clsErrorHandler — это модуль класса, реализующий код обработки ошибок. Модуль класса хранит все свои main и вспомогательные функции в одном блоке, инкапсулируя код.

Макрос AutoExec вызывает функцию Startup в modStartup. В Starter Edition функция создает экземпляр clsErrorHandler и сохраняет его в виде глобальной переменной, доступной для использования во всем приложении. В выпуске Dev используется статический класс — см. комментарии в верхней части модуля класса.

На самом деле код обработки ошибок в процедурах настолько согласован, что мы смогли создать все его менее чем за пять минут, используя конкретный код VBA, который оснастил каждую процедуру соответствующим обработчиком ошибок. (Код не включен в шаблон). Оба выпуска шаблонов Northwind 2.0 Starter и Developer изначально были оснащены этим подходом к обработке ошибок. 
'

УЛУЧШЕНА ОБРАБОТКА ОШИБОК

Начиная с версии 2.2 Для разработчиков Northwind обработчик ошибок был улучшен благодаря отзывам сообщества Access. Начальный выпуск не изменился. 

По сути, обработчик ошибок в предыдущей версии (2.0, выпущенной в апреле 2023 г.) является следующим:

Public Sub HandleError(…)
    MsgBox Err.Description
End Sub


В версии 2.2 он обновлен до:

Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)
    If Not IsEventProcedure Then
        Err.Raise lngError, strErrSource
    End If
    MsgBox Err.Description
End Sub


Чтобы понять, почему это изменение было внесено, давайте сначала поймем, что заставляет выполнять код:

  • Макрос AutoExec вызывает процедуру Запуска, которая выполняет некоторые инициализации перед открытием первой формы.

  • Пользователь взаимодействует с приложением, например открывает форму или нажимает кнопку, что приводит к срабатыванию процедур событий, таких как Form_Load и cmdPrintInvoice_Click.
    '

Помимо процедур событий, приложения имеют подпрограммы и функции( в основном в модулях), и этот код вызывается из процедур событий. Они называются "стандартными" процедурами.

В версии 2.0 Northwind стандартные процедуры обрабатывали собственные ошибки с помощью сообщений, но не уведомляли процедуру вызывающего события о том, что произошла ошибка. Это может быть плохо, если процедура события имеет последующий код, который должен выполняться независимо от предыдущей ошибки, обработанной вызываемой процедурой. Конечно, можно заменить подпрограмму функцией, которая возвращает успех или сбой, и закодировать процедуру события соответствующим образом, но это не всегда вариант.

В Northwind версии 2.2 стандартные процедуры не обрабатывают сообщения об ошибках, а с помощью Err.Raise передают их обратно в процедуру вызывающего события. Затем процедура вызывающего события отображает возникную ошибку и возобновляется на Exit_Handler. Это лучше, так как позволяет вызывающей процедуре правильно завершить работу.

Чтобы использовать код Northwind версии 2.2, процедуры событий должны передать в HandleError третий аргумент, указывающий, что вызывающий объект является процедурой события. Для этого была обновлена версия Northwind Dev Edition.

Еще более мощный модуль обработчика ошибок будет иметь поддержку процедур "pushing и popping" в "стеке" (массиве). Первым элементом всегда будет процедура события, поэтому дополнительный аргумент не требуется. Эта реализация выходит за рамки задач Northwind Dev Edition.

MRU или Самые последние использованные — это список недавно использовавшихся заказов и заказов на покупку. Вы можете часто возвращаться к ним, чтобы поместить их в следующее состояние. Списки MRU часто рассматриваются в продуктах Office как список недавно использовавшихся файлов, которые может потребоваться повторно открыть.

В выпуске Northwind Dev для реализации функции MRU (которая не существует в выпуске Starter), необходимо сначала установить следующие элементы: 

  1. Таблица для хранения сведений MRU.

  2. Код для обновления таблицы при открытии заказа или заказа на покупку (PO).

  3. Код для обновления раскрывающегося списка MRU на ленте.

  4. Код для загрузки элемента при выборе элемента MRU на ленте.

Давайте рассмотрим каждый из них более подробно. 


1. Таблица для хранения сведений MRU.

Стоит рассмотреть структуру таблицы MRU, особенно ее индексы. Обратите внимание, что существует повторяющийся индекс SortIdx для быстрой сортировки элементов MRU в раскрывающемся списке ленты, а также уникальный индекс для применения бизнес-правила, согласно которому для каждого пользователя элемент может выполняться только один раз. Например, дваждые открытие одного и того же порядка не приводит к созданию двух записей в таблице MRU.


Таблица использует тот факт, что все связанные с MRU поля PK (первичного ключа) в базе данных имеют значение AutoNumber, поэтому тип данных Long Integer можно использовать для PKValue.

2. Код для обновления таблицы при открытии заказа или P.O.

В NW2 мы решили добавлять в список MRU только при создании новой записи, а не при повторном обновлении существующей. Мы, конечно, могли бы перенести вызов AddToMRU с Form_AfterInsert на Form_AfterUpdate для поддержки этого.

Процедуры AddToMRU и DeleteFromMRU реализованы в modGlobal, который представляет собой стандартный модуль, открытые процедуры которого видны из любой формы.

AddToMRU (как следует из названия) добавляет новый элемент в таблицу MRU, а затем при необходимости обрезает его, удалив старую запись, если она превышает максимальный размер (MAX_MRU_COUNT). Последний шаг, вероятно, является наименее известным разработчикам Access: раскрывающийся список ленты должен быть обновлен, и это выполняется путем вызова InvalidateControl. Это сигнал для ленты для повторного запуска процесса инициализации. 

3. Код для обновления раскрывающегося списка MRU на ленте. 

Во время запуска и после вызова InvalidateControl выполняется сложный набор функций для заполнения ленты.  Эти процедуры вызываются xml-файлом ленты в таблице uSysRibbons, в которой отчасти говорится:

<group id="gCurrentStatus" label="MRU">
    <box id="bxMRU" boxStyle="vertical">
        <dropDown id="ddMRU"
                  getItemCount="ddMRU_GetItemCount"
                  getItemLabel="ddMRU_GetItemLabel"
                  getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
                  getItemID="ddMRU_GetItemID"
                  onAction="ddMRU_OnAction"
                  screentip="Most Recently Used Objects">
        </dropDown>
    </box>
</group>

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

Если раскомментируйте строки Debug.Print в modRibbonCallback и перезапустите приложение, в окне Интерпретация появится следующая последовательность: 

ddMRU_GetItemCount    ddMRU    6 
ddMRU_GetItemLabel    ddMRU    0      Order 60, Proseware, Inc.
ddMRU_GetItemID       ddMRU    0       2 
ddMRU_GetItemLabel    ddMRU    1      Order 62, Best For You Organics Company
ddMRU_GetItemID       ddMRU    1       4 
ddMRU_GetItemLabel    ddMRU    2      Order 63, Wide World Importers
ddMRU_GetItemID       ddMRU    2       5 
ddMRU_GetItemLabel    ddMRU    3      Order 66, Proseware, Inc.
ddMRU_GetItemID       ddMRU    3       8 
ddMRU_GetItemLabel    ddMRU    4      Order 67, Best For You Organics Company
ddMRU_GetItemID       ddMRU    4       9 
ddMRU_GetItemLabel    ddMRU    5      Order 68, Adatum Corporation
ddMRU_GetItemID       ddMRU    5       10 
ddMRU_GetSelectedItemIndex  ddMRU    0


Здесь мы видим, что Access сначала вызывает процедуру, которая возвращает количество элементов для загрузки в аргументе ByRef ddMRU_GetItemCount. Это также время, когда мы открываем запрос к таблице MRU и кэшируем его, так как он будет использоваться несколько раз. 

Затем лента неоднократно вызывает две процедуры для получения значений идентификатора и метки для раскрывающегося списка с двумя столбцами. 

Наконец, он вызывает процедуру для отмены выбора элемента. (В нашем случае это первый.) 

4. Код для загрузки элемента при выборе элемента MRU на ленте.

Как и любой другой элемент ленты, свойство OnAction в XML-коде ленты указывает функцию обратного вызова, которая будет использоваться для выполнения действия:

onAction="ddMRU_OnAction"

Эта процедура реализована в modRibbonCallback. Он повторно использует уже открытый набор записей для поиска записи с выбранным элементом, а затем, в зависимости от требуемого значения TableName, открывает соответствующую форму, передавая значение PK для загрузки.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?
После нажатия кнопки "Отправить" ваш отзыв будет использован для улучшения продуктов и служб Майкрософт. Эти данные будут доступны для сбора ИТ-администратору. Заявление о конфиденциальности.

Спасибо за ваш отзыв!

×