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


Private Sub UserForm_Initialize()
    ' Заголовок формы
    Me.Caption = "Список студентов"
    Me.Width = 500
    Me.Height = 350
    
    ' Создаем элементы управления вручную
    CreateControls
    LoadCourses
    LoadStudents
End Sub

Sub CreateControls()
    ' --- Метки ---
    With Me.Controls.Add("Forms.Label.1")
        .Caption = "Фамилия"
        .Left = 10
        .Top = 10
        .Width = 70
    End With
    
    With Me.Controls.Add("Forms.Label.1")
        .Caption = "Имя"
        .Left = 10
        .Top = 40
        .Width = 70
    End With
    
    With Me.Controls.Add("Forms.Label.1")
        .Caption = "Специальность"
        .Left = 10
        .Top = 70
        .Width = 70
    End With
    
    ' --- Поля ввода ---
    With Me.Controls.Add("Forms.TextBox.1", "txtFam")
        .Left = 90
        .Top = 8
        .Width = 120
    End With
    
    With Me.Controls.Add("Forms.TextBox.1", "txtName")
        .Left = 90
        .Top = 38
        .Width = 120
    End With
    
    With Me.Controls.Add("Forms.ComboBox.1", "cboSpec")
        .Left = 90
        .Top = 68
        .Width = 120
        .Style = fmStyleDropDownList
    End With
    
    ' --- Список студентов ---
    With Me.Controls.Add("Forms.ListBox.1", "lstFam")
        .Left = 230
        .Top = 8
        .Width = 150
        .Height = 120
    End With
    
    ' --- Кнопки ---
    With Me.Controls.Add("Forms.CommandButton.1", "btnAdd")
        .Caption = "Добавить"
        .Left = 10
        .Top = 110
        .Width = 80
    End With
    
    With Me.Controls.Add("Forms.CommandButton.1", "btnSave")
        .Caption = "Записать"
        .Left = 100
        .Top = 110
        .Width = 80
    End With
    
    With Me.Controls.Add("Forms.CommandButton.1", "btnDelete")
        .Caption = "Удалить"
        .Left = 190
        .Top = 110
        .Width = 80
    End With
    
    With Me.Controls.Add("Forms.CommandButton.1", "btnExit")
        .Caption = "Выход"
        .Left = 280
        .Top = 110
        .Width = 80
    End With
    
    With Me.Controls.Add("Forms.CommandButton.1", "btnSortAsc")
        .Caption = "Сортировка ↑"
        .Left = 10
        .Top = 150
        .Width = 120
    End With
    
    With Me.Controls.Add("Forms.CommandButton.1", "btnSortDesc")
        .Caption = "Сортировка ↓"
        .Left = 140
        .Top = 150
        .Width = 120
    End With
End Sub

Sub LoadCourses()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Курсы")
    Dim cbo As Object
    Set cbo = Me.Controls("cboSpec")
    
    cbo.Clear
    Dim i As Integer
    For i = 1 To 4
        If ws.Cells(i, 1) <> "" Then cbo.AddItem ws.Cells(i, 1)
    Next
End Sub

Sub LoadStudents()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Список")
    Dim lst As Object
    Set lst = Me.Controls("lstFam")
    
    lst.Clear
    Dim i As Integer
    i = 2
    Do While ws.Cells(i, 1) <> ""
        lst.AddItem ws.Cells(i, 1)
        i = i + 1
    Loop
End Sub

Private Sub btnAdd_Click()
    Me.Controls("txtFam").Text = ""
    Me.Controls("txtName").Text = ""
    Me.Controls("cboSpec").Value = ""
    Me.Controls("txtFam").SetFocus
End Sub

Private Sub btnSave_Click()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Список")
    
    Dim fam As String, name As String, spec As String
    fam = Me.Controls("txtFam").Text
    name = Me.Controls("txtName").Text
    spec = Me.Controls("cboSpec").Value
    
    If fam = "" Or name = "" Or spec = "" Then
        MsgBox "Заполните все поля!"
        Exit Sub
    End If
    
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    
    ws.Cells(lastRow, 1) = fam
    ws.Cells(lastRow, 2) = name
    ws.Cells(lastRow, 3) = spec
    
    LoadStudents
    btnAdd_Click
    MsgBox "Добавлено!"
End Sub

Private Sub btnDelete_Click()
    Dim lst As Object
    Set lst = Me.Controls("lstFam")
    
    If lst.ListIndex = -1 Then
        MsgBox "Выберите студента!"
        Exit Sub
    End If
    
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Список")
    Dim fam As String
    fam = lst.Value
    
    Dim i As Integer
    i = 2
    Do While ws.Cells(i, 1) <> ""
        If ws.Cells(i, 1) = fam Then
            ws.Rows(i).Delete
            LoadStudents
            MsgBox "Удалено!"
            Exit Sub
        End If
        i = i + 1
    Loop
End Sub

Private Sub btnSortAsc_Click()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Список")
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    
    If lastRow > 1 Then
        ws.Range("A1:C" & lastRow).Sort Key1:=ws.Range("A1"), Order1:=xlAscending, Header:=xlYes
        LoadStudents
        MsgBox "Отсортировано ↑"
    End If
End Sub

Private Sub btnSortDesc_Click()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Список")
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    
    If lastRow > 1 Then
        ws.Range("A1:C" & lastRow).Sort Key1:=ws.Range("A1"), Order1:=xlDescending, Header:=xlYes
        LoadStudents
        MsgBox "Отсортировано ↓"
    End If
End Sub

Private Sub btnExit_Click()
    Unload Me
End Sub

Private Sub lstFam_Click()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Список")
    Dim lst As Object
    Set lst = Me.Controls("lstFam")
    
    If lst.ListIndex = -1 Then Exit Sub
    
    Dim i As Integer
    i = 2
    Do While ws.Cells(i, 1) <> ""
        If ws.Cells(i, 1) = lst.Value Then
            Me.Controls("txtFam").Text = ws.Cells(i, 1)
            Me.Controls("txtName").Text = ws.Cells(i, 2)
            Me.Controls("cboSpec").Value = ws.Cells(i, 3)
            Exit Sub
        End If
        i = i + 1
    Loop
End Sub