Sheets("sheet1").Range("B3:E7").Value < 35
в этой строке вы пытаетесь сравнить весь диапазон, что не совсем так.
Даже если вы пройдете эту строку, либо пропуск, либо неудача будут заполнять все данныедиапазон с их соответствующим значением.
Как и другие предлагали, цикл необходим, если вы хотите сделать это в VBA
, хотя некоторые формулы могли бы выполнить аналогичную работу, или условное форматирование, если вы просто хотелисм. отображаемые результаты.
См. больше комментариев в коде, надеюсь, это поможет:
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Set ws = ActiveWorkbook.Sheets("Sheet5") 'declare and allocate the sheet to a variable
Dim lRow As Long
lRow = ws.Cells(Rows.Count, "A").End(xlUp).Row 'get last row at column A, assuming student names there
Dim arrData As Variant
arrData = ws.Range("B1:E" & lRow) 'declare and allocate your data to an array
Dim R As Long, C As Long
For R = LBound(arrData) + 2 To UBound(arrData) 'for each row in your data, starting at row 3
For C = LBound(arrData, 2) To UBound(arrData, 2) 'for each column in your data
If arrData(R, C) <> "" And IsNumeric(arrData(R, C)) Then 'only want a fail/pass for an actual number
If arrData(R, C) < 34 Then
arrData(R, C) = "Fail"
ElseIf arrData(R, C) >= 35 Then
arrData(R, C) = "Pass"
End If
End If
Next C
Next R
ws.Range("B1:E" & lRow) = arrData 'allocate the data back to the sheet
End Sub
При условии, что для этих конкретных потребностей у вас нет большого количества данных, и для каждой ячейки будетвсе в порядке, но если у вас много данных ... это гораздо лучший подход, чем циклическое прохождение каждой ячейки.
По сути, чем меньше вы взаимодействуете с листом, тем лучше.В приведенном выше примере доступ к листу возможен только дважды: один раз для чтения данных и один раз для их записи, а все остальное выполняется в памяти.