Загрузка данных


Да, вот макрос на 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 и выводы по занятию могу написать, если нужно.