Перейти до основного
Підтримка
Вхід
Вхід за допомогою облікового запису Microsoft
Увійдіть або створіть обліковий запис.
Вітаємо,
Виберіть інший обліковий запис.
У вас є кілька облікових записів
Виберіть обліковий запис, за допомогою якого потрібно ввійти.

Вміст, наведений тут, може застосовуватися до Компанії Northwind 2.0 Developer Edition і Starter Edition. 

VBA (Visual Basic for Applications) – це мова програмування, яка використовується в усіх продуктах Office. Навчальний код VBA дає змогу працювати з усіма продуктами Office (а не лише з Access).
Під час пошуку "how-to" обов'язково знайдіть конкретні приклади 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. 

Деякі типи елементів керування мають вбудовані майстри для автоматичного створення макросу. Наприклад, якщо додати кнопку до форми, відкриється майстер, який пропонує кілька варіантів функціональності для цієї кнопки. Якщо додати поле зі списком, відкриється майстер, який можна настроїти на пошук певного запису у формі. 

Область переходів – це основний спосіб перегляду та доступу до всіх об'єктів бази даних, яка за замовчуванням відображається в лівій частині вікна Access. 
Область переходів Компанії Northwind налаштовано. Ми створили спеціальну категорію Northwind Starter 2.0. Це дає змогу впорядковувати об'єкти за функціональною областю.

Іноді потрібно, щоб змінна існувала після того, як створений об'єкт виходить за межі області. Див . вище область і видимість . Це можна зробити трьома основними способами: Загальнодоступні змінні, Тимчасові змінні та Збереження значень у локальній таблиці. Багато розробників використовують поєднання з них. Кожен має свої плюси і мінуси.  Додаткові відомості про кожну з них: 

Загальнодоступна змінна модуля VBA: 

Тимчасові змінні: 

Збереження значень у локальній таблиці

  • Загальнодоступні змінні та тимчасові змінні існують для поточного сеансу та виходять з області, коли програму закрито. Але що робити, якщо потрібно зберігати певні змінні користувача в сеансах? Ці типи значень можна зберігати в локальній таблиці. У 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 . Вона аналізує його в компоненти за допомогою функції querystring. Ці компоненти зберігаються в об'єкті Scripting.Dictionary . Зверніть увагу, що для цього потрібно використовувати засоби > посилання та встановити посилання на середовище виконання сценаріїв Microsoft (scrrun.dll).

Нижче наведено функції та переваги об'єкта Dictionary.  

  • Порядок елементів не важливий

  • Прості функції для додавання та видалення елементів колекції

  • Функції для циклу над колекцією, щоб ви могли знати, що в ній

  • Функція Exists, яка дає змогу перевірити доступність певного елемента

Використання об'єкта словника відображається в компанії Northwind. Наприклад, подія Form_Load у frmGenericDialog.

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

У Northwind 2.0 ми покажемо вам, як це зробити краще під час використання коду VBA. Ми реалізували те, що називається глобальним обробником помилок. Помилки, які виникають під час будь-якої процедури, викликають функцію на глобальному рівні, щоб відобразити помилку. Велика перевага полягає в тому, що обробка помилок узгоджена. Якщо повідомлення потрібно змінити (наприклад, щоб додатково відобразити номер помилки або внести до журналу помилку у файл), його потрібно виконати лише в одному розташуванні. 

clsErrorHandler – це модуль класу, який впроваджує код обробки помилок. Модуль класу зберігає всі свої основні та допоміжні функції в одній одиниці, таким чином інкапсулюючи код.

Макрос AutoExec викликає функцію запуску в modStartup. У Starter Edition функція створює екземпляр clsErrorHandler і зберігає його як глобальну змінну, доступну для використання в усій програмі. У випуску Dev використовується статичний клас – див. коментарі у верхній частині модуля класу.

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

ПОКРАЩЕНА ОБРОБКА ПОМИЛОК

Починаючи з версії 2.2 компанії Northwind Developer Edition, обробник помилок покращено завдяки відгукам спільноти Access. Випуск Starter не змінюється. 

По суті, обробник помилок у попередній версії (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 and popping" на "стеку" (масиві). Перший елемент завжди буде процедурою події, тому додатковий аргумент не потрібен. Це впровадження виходить за рамки цілей Компанії Northwind Dev Edition.

MrU або "Нещодавно використані " – це список нещодавно використаних замовлень і замовлень на придбання. Ви можете повернутися до цих часто, щоб помістити їх у наступний стан. Списки mru часто розглядаються в продуктах Office як список нещодавно використаних файлів, які, можливо, потрібно знову відкрити.

у випуску Northwind Dev, щоб реалізувати функцію MRU (якої немає у випуску Starter), слід спочатку встановити такі елементи: 

  1. Таблиця для зберігання відомостей про mru.

  2. Код для оновлення таблиці під час відкриття замовлення або замовлення на придбання.

  3. Код для оновлення розкривного списку MRU на стрічці.

  4. Код для завантаження елемента, коли на стрічці вибрано елемент MRU.

Давайте розглянемо кожен з них більш детально. 


1. Таблиця для зберігання відомостей про МРТ.

Дизайн таблиці MRU варто перевірити, особливо його індекси. Зверніть увагу, що існує повторюваний індекс SortIdx , який допомагає швидко сортувати елементи MRU в розкривному списку стрічки, а також унікальний індекс для застосування бізнес-правила, яке для кожного користувача може відбуватися лише один раз. Наприклад, якщо двічі відкрити однакове замовлення, у таблиці MRU не буде створено два записи.


У таблиці використовується той факт, що всі поля PK (первинний ключ) у базі даних, пов'язані з MRU, мають значення "Автонумерація", тому тип даних "Довге ціле число" можна використовувати для 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 і перезапустити програму, у вікні immediate з'явиться така послідовність: 

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, яке потрібно завантажити.

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

Спільноти допомагають ставити запитання й відповідати на них, надавати відгуки та дізнаватися думки висококваліфікованих експертів.

Чи ця інформація була корисною?

Наскільки ви задоволені якістю мови?
Що вплинуло на ваші враження?
Натиснувши кнопку "Надіслати", ви надасте свій відгук для покращення продуктів і служб Microsoft. Ваш ІТ-адміністратор зможе збирати ці дані. Декларація про конфіденційність.

Дякуємо за відгук!

×