У меня есть таблица Excel: от A2 до A11 - это имена классов Class_1, Class_2, ..., Class_10. От B1 до K1 - имя студента 1,2,3, ..., 10

Для каждого ученика в своем классе мне нужно будет заполнить его оценку

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

Я мог бы представить поле ввода или пользовательскую форму следующим образом: Class: Class_1 'эквивалентен строке ячейки, которая в данном случае строка 2 Student: 1' эквивалентна столбцу ячейки, который в данном случае столбец B Grade: A 'эквивалентен значение ячейки, которая в данном случае "А"

Поэтому, если я заполню Class_1,1, A, то VBA выберет ячейку B2 и заполнит значение "A" для этой ячейки.

1 ответ1

0

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

Sub getGrades()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") 'change this to your grade sheet

    Dim intRow As Integer
    Dim intColumn As Integer
    Dim intClassCount As Integer
    Dim intStudentCount As Integer
    Dim strResponse As String

    'get the last row in which a class is present and the last column in which a student is present
    intClassCount = ws.Range("A65000").End(xlUp).Row
    intStudentCount = ws.Range("IV1").End(xlToLeft).Column

    'run through all of the class/student combinations
    For intRow = 2 To intClassCount
        For intColumn = 2 To intStudentCount

            'Get the response
            strResponse = InputBox("Please enter grade for" & vbCrLf & vbCrLf & "Class: " & ws.Cells(intRow, 1) & vbCrLf & "Student: " & ws.Cells(1, intColumn), "Enter Grade")

            'May want to do some checking here to make sure strResponse is A,B,C,D, or F or whatever...
            ws.Cells(intRow, intColumn).Value = strResponse

        Next intColumn
    Next intRow

End Sub

Добавление не VBA метода, который, вероятно, является лучшим способом решения этой проблемы. По мере того, как я думаю об этом вопросе глубже, я представляю, что мне нужно вводить оценки для десятков учеников, разбросанных по многим классам, каждый из которых я хотел бы:

  1. Создайте новую вкладку листа, в которой перечислены все учащиеся в одном столбце и их соответствующие классы во втором столбце Этот список будет иметь длину <#OfStudents> x <#OfClasses>. Вы можете создать это быстро, скопировав и вставив или отредактировав VBA выше, просто вставив комбинацию класс / ученик в свои собственные строки на новом листе.

  2. В третьем столбце на новом листе (столбец C) вы можете указать их оценку. Имея его в этом формате, новый лист позволит вам отсортировать и Ctrl+F (найти) и Автофильтр, чтобы ориентироваться только на студентов, которые вам интересны.

  3. Вернувшись к исходному листу в ячейке A3, вы можете использовать следующую формулу, чтобы получить оценку учащихся с нового листа (я назову новый лист "NewSheet") в формуле:

=INDIRECT("NewSheet!C" & SUMPRODUCT((B$1=NewSheet!$A$1:$A$2000)*($A2=NewSheet!$B$1:$B$2000)*ROW(NewSheet!$A$1:$A$2000)))

Сумасшедшая формула sumproduct будет возвращать строку, в которой находится комбинация Student/Class в NewSheet, а Indirect будет получать оценку из этой конкретной строки.

Пройдя по этому маршруту, вы получите несколько преимуществ. Во-первых, нет VBA. Не то, чтобы VBA - плохая вещь, просто она не так широко понята, как формула листа. Во-вторых, вы получаете очень удобную пользовательскую форму / интерфейс для ввода оценок с помощью NewSheet, автофильтрации и сортировки, а также всех других приятных мелочей. В-третьих, вы можете уменьшить это до миллиона комбинаций ученик / класс без использования кода. Просто скопируйте и вставьте формулу в свою постоянно расширяющуюся матрицу Классов и Студентов, и все будет хорошо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .