Загрузка данных
Да, вот макрос на VBA, который сам создаст 4 макроса, три подменю и главное меню с кнопками. Я не мог запустить его в Access, поэтому он не проверен: если будет ошибка, пришлите её текст.
## Что сделать перед запуском
1. В базе уже должны быть **4 запроса на выборку, 4 формы и 4 отчёта**.
2. Нажмите **Alt+F11**, затем **Insert → Module** и вставьте код ниже.
3. В блоке «НАСТРОЙКА» в начале кода впишите **точные имена** ваших запросов, форм и отчётов.
4. Сохраните модуль (Ctrl+S) под именем `modMenu`. Не называйте его `OpenF`, `OpenR` и так далее, имя не должно совпадать с функциями.
5. Поставьте курсор внутрь `BuildAllMenus` и нажмите **F5**.
## Код
```vba
Option Compare Database
Option Explicit
' ===== НАСТРОЙКА: впишите точные имена ваших объектов =====
Private Function GetQueries() As Variant
GetQueries = Array("Запрос_Студенты", "Запрос_1курс", "Запрос_СреднийБалл", "Запрос_КолвоСтудентов")
End Function
Private Function GetForms() As Variant
GetForms = Array("Форма_1", "Форма_2", "Форма_3", "Форма_4")
End Function
Private Function GetReports() As Variant
GetReports = Array("Отчет_1", "Отчет_2", "Отчет_3", "Отчет_4")
End Function
' ==========================================================
Public Sub BuildAllMenus()
Dim q, f, r, i As Long
Dim capsQ(4) As String, actsQ(4) As String
Dim capsF(4) As String, actsF(4) As String
Dim capsR(4) As String, actsR(4) As String
Dim capsM(4) As String, actsM(4) As String
Dim back As String
q = GetQueries(): f = GetForms(): r = GetReports()
back = "=OpenF(""Главное меню"")"
' 1.1 Четыре макроса
On Error GoTo MacroErr
For i = 0 To 3
MakeMacro "Макрос_Запрос" & (i + 1), CStr(q(i))
Next i
On Error GoTo 0
' 1.2 Меню запросов (через макросы)
For i = 0 To 3
capsQ(i) = CStr(q(i))
actsQ(i) = "Макрос_Запрос" & (i + 1)
Next i
capsQ(4) = "В главное меню": actsQ(4) = back
MakeMenu "Меню запросов", capsQ, actsQ
' 1.3 Меню форм
For i = 0 To 3
capsF(i) = CStr(f(i))
actsF(i) = "=OpenF(""" & f(i) & """)"
Next i
capsF(4) = "В главное меню": actsF(4) = back
MakeMenu "Меню форм", capsF, actsF
' 1.4 Меню отчётов
For i = 0 To 3
capsR(i) = CStr(r(i))
actsR(i) = "=OpenR(""" & r(i) & """)"
Next i
capsR(4) = "В главное меню": actsR(4) = back
MakeMenu "Меню отчётов", capsR, actsR
' 1.5 Главное меню
capsM(0) = "Меню запросов": actsM(0) = "=OpenF(""Меню запросов"")"
capsM(1) = "Меню форм": actsM(1) = "=OpenF(""Меню форм"")"
capsM(2) = "Меню отчётов": actsM(2) = "=OpenF(""Меню отчётов"")"
capsM(3) = "Выход в окно БД": actsM(3) = "=CloseMe()"
capsM(4) = "Выход из Access": actsM(4) = "=QuitApp()"
MakeMenu "Главное меню", capsM, actsM
MsgBox "Готово! Откройте форму ""Главное меню"" и проверьте кнопки.", vbInformation
Exit Sub
MacroErr:
MsgBox "Не удалось создать макросы автоматически: " & Err.Description & vbCrLf & _
"Создайте 4 макроса вручную (действие ОткрытьЗапрос) с именами " & _
"Макрос_Запрос1 ... Макрос_Запрос4 и запустите BuildAllMenus заново.", vbExclamation
End Sub
' Создание макроса, открывающего запрос
Private Sub MakeMacro(macroName As String, queryName As String)
Dim fn As String, h As Integer
fn = Environ("TEMP") & "\tmpmacro.txt"
h = FreeFile
Open fn For Output As #h
Print #h, "Version =196611"
Print #h, "ColumnsShown =8"
Print #h, "Begin"
Print #h, " Action =""OpenQuery"""
Print #h, " Argument =""" & queryName & """"
Print #h, " Argument =""Datasheet"""
Print #h, " Argument =""Edit"""
Print #h, "End"
Close #h
On Error Resume Next
DoCmd.DeleteObject acMacro, macroName
On Error GoTo 0
Application.LoadFromText acMacro, macroName, fn
Kill fn
End Sub
' Создание формы-меню с заголовком и кнопками
Private Sub MakeMenu(menuName As String, caps As Variant, acts As Variant)
Dim frm As Form, ctl As Control, i As Long, n As String
On Error Resume Next
DoCmd.Close acForm, menuName
DoCmd.DeleteObject acForm, menuName
On Error GoTo 0
Set frm = CreateForm
n = frm.Name
frm.Caption = menuName
frm.NavigationButtons = False
frm.RecordSelectors = False
frm.DividingLines = False
frm.AutoCenter = True
Set ctl = CreateControl(n, acLabel, acDetail, , , 600, 300, 6000, 550)
ctl.Caption = menuName
ctl.FontSize = 20
ctl.FontBold = True
For i = 0 To UBound(caps)
Set ctl = CreateControl(n, acCommandButton, acDetail, , , 600, 1200 + i * 700, 6000, 550)
ctl.Name = "btn" & i
ctl.Caption = caps(i)
ctl.OnClick = acts(i)
Next i
DoCmd.Close acForm, n, acSaveYes
DoCmd.Rename menuName, acForm, n
End Sub
' ===== Функции, которые вызывают кнопки =====
Public Function OpenF(n As String)
DoCmd.OpenForm n
End Function
Public Function OpenR(n As String)
DoCmd.OpenReport n, acViewPreview
End Function
Public Function CloseMe()
DoCmd.Close acForm, Screen.ActiveForm.Name
End Function
Public Function QuitApp()
DoCmd.Quit
End Function
```
## Что получится
- **Макрос_Запрос1-4**: каждый открывает свой запрос (п. 1.1).
- **Меню запросов** с кнопками на макросы, **Меню форм** и **Меню отчётов** с кнопками на ваши формы и отчёты. В каждом подменю есть кнопка «В главное меню» (пп. 1.2-1.4).
- **Главное меню** с тремя кнопками на подменю, кнопкой «Выход в окно БД» (закрывает форму, остаётся окно базы) и «Выход из Access» (п. 1.5).
- Названия есть на всех меню, как требуют методические указания.
## Если что-то пошло не так
- Если выдаёт ошибку на этапе макросов, скрипт подскажет сделать 4 макроса вручную: **Создание → Макрос → ОткрытьЗапрос**, имена `Макрос_Запрос1-4`. Затем запустите `BuildAllMenus` снова, остальное создастся само.
- Если кнопка пишет «не найден объект», в блоке настройки опечатка в имени запроса, формы или отчёта.
- Если Access блокирует код, нажмите «Включить содержимое» в жёлтой полосе вверху.
Макросы из Access не откроются, пока файл не в доверенном расположении или не включено содержимое. Чтобы главное меню открывалось при запуске базы: **Файл → Параметры → Текущая база данных → Форма просмотра → Главное меню**.
Скриншоты для отчёта придётся сделать самому. Описание пунктов 1.1-1.5 и выводы по занятию могу написать, если нужно.