Это довольно простая базовая настройка 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 метода, который, вероятно, является лучшим способом решения этой проблемы. По мере того, как я думаю об этом вопросе глубже, я представляю, что мне нужно вводить оценки для десятков учеников, разбросанных по многим классам, каждый из которых я хотел бы:
Создайте новую вкладку листа, в которой перечислены все учащиеся в одном столбце и их соответствующие классы во втором столбце Этот список будет иметь длину <#OfStudents> x <#OfClasses>. Вы можете создать это быстро, скопировав и вставив или отредактировав VBA выше, просто вставив комбинацию класс / ученик в свои собственные строки на новом листе.
В третьем столбце на новом листе (столбец C) вы можете указать их оценку. Имея его в этом формате, новый лист позволит вам отсортировать и Ctrl+F (найти) и Автофильтр, чтобы ориентироваться только на студентов, которые вам интересны.
Вернувшись к исходному листу в ячейке 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, автофильтрации и сортировки, а также всех других приятных мелочей. В-третьих, вы можете уменьшить это до миллиона комбинаций ученик / класс без использования кода. Просто скопируйте и вставьте формулу в свою постоянно расширяющуюся матрицу Классов и Студентов, и все будет хорошо.