Использование операторов «if then» внутри «for» l oop в Microsoft VBA - PullRequest
4 голосов
/ 21 января 2020

Я пытаюсь получить числовые значения оценки и преобразовать их в строку, которая будет представлять оценку, A> 90, B> 80 и т. Д. Я планировал использовать для l oop, чтобы собрать значения из электронной таблицы, а затем, если затем, заявления, чтобы назначить буквенное обозначение. Вот код, который у меня есть.

 For i = 1 To 11
' Pull Grade numerical value
    Grade = Cells(2 + i, 16).Value
' Assign Numerical Value a script Grade
    If Grade > 60 Then
        Letter = "D"
    If Grade > 70 Then
        Letter = "C"
    If Grade > 80 Then
        Letter = "B"
    If Grade > 90 Then
        Letter = "A"
    Else
        Letter = "F"
    Exit
' Print the letter grade
    Cells(2 + i, 17).Text = Letter
    Next i

Я продолжаю получать сообщения об ошибках «Выход» или «Следующий я». Я также пытался использовать операторы "End", но это также не решило проблемы.

Ответы [ 6 ]

7 голосов
/ 21 января 2020

Или просто используйте формулу в столбце Q:

=IF(P:P>=90,"A",IF(P:P>=80,"B",IF(P:P>=70,"C",IF(P:P>=60,"D","F"))))

, чтобы она обновлялась автоматически и вам не нужно было использовать VBA.


В качестве альтернативы вы можете добавить лист с именем GradeList со следующими данными

enter image description here

и используйте

=INDEX(GradeList!B:B,MATCH(P:P,GradeList!A:A,1))

в качестве формулы. Таким образом, вы можете легко редактировать числа / оценки позже, и он автоматически выберет правильные оценки:

enter image description here

6 голосов
/ 21 января 2020

Я бы предпочел Выбрать дело в этой ситуации. И начните L oop с 3, чтобы вам не нужно было добавлять 2:

For i = 3 To 11
  ' Pull Grade numerical value
  Grade = Cells(i, 16).Value
  ' Assign Numerical Value a script Grade
  Select Case Grade
    Case Is >= 90: letter = "A"
    Case Is >= 80: letter = "B"
    Case Is >= 70: letter = "C"
    Case Is >= 60: letter = "D"
    Case Else: letter = "F"
  End Select
  ' Print the letter grade
  Cells(i, 17).Value = letter
 Next i
5 голосов
/ 21 января 2020

Отличные ответы от всех, но удивлен, не увидев здесь Select...Case. Это прекрасный пример, возможно, даже учебник.

Select...Case оценивает переменную в соответствии с рядом критериев, а затем делает все, что написано внутри оператора case.

Итак, ваш код будет выглядеть так:

For i = 3 To 13
' Pull Grade numerical value
    Grade = Worksheets("YourSheetNameHere").Cells(i, 16).Value 'Change that sheet name
    'do our evaluation based on "grade"
    Select Case Grade
        Case >= 90
            Letter = "A"
        Case >= 80
            Letter = "B"
        Case >= 70
            Letter = "C"
        Case >= 60
            Letter = "D"
        Case Else
            Letter = "F"
    End Select

Next i
4 голосов
/ 21 января 2020

У вас тут куча проблем.

Первый exit должен быть end if

Второй Вам необходимо elseif для нескольких условий в одном и том же операторе if.

Наконец, вам нужно изменить порядок своих if , Если у вас 90-й класс, он вернет «D», так как это первое истинное утверждение, с которым он сталкивается.

Вы могли бы просто l oop из 3 - 13 вместо добавления 2 каждый раз, а также , И убедитесь, что вы используете явные ссылки, это в конечном итоге вас укусит.

Я пропустил одну вещь, сделайте все ваши сравнения >= Люди не будут счастливы, если их 90 будет B.

For i = 3 To 13
' Pull Grade numerical value
    Grade = Worksheets("YourSheetNameHere").Cells(i, 16).Value 'Change that sheet name
' Assign Numerical Value a script Grade
    If Grade >= 90 Then
        Letter = "A"
    elseIf Grade >= 80 Then
        Letter = "B"
    elseIf Grade >= 70 Then
        Letter = "C"
    elseIf Grade >= 60 Then
        Letter = "D"
    Else
        Letter = "F"
    End if
' Print the letter grade
    Worksheets("YourSheetNameHere").Cells(i, 17).value = Letter 'Change that sheet name
    Next i
2 голосов
/ 21 января 2020

В качестве альтернативы, используйте INDEX и MATCH как Application.Function:

Sub Test()

Dim Grade As Long: Grade = 55
Dim arr1 As Variant: arr1 = Array("A", "B", "C", "D", "F")
Dim arr2 As Variant: arr2 = Array(100, 89, 79, 69, 59)

With Application
    Debug.Print .Index(arr1, .Match(Grade, arr2, -1))
End With

End Sub

Или удалите функцию INDEX и вызовите массив напрямую:

With Application
    Debug.Print arr1(.Match(Grade, arr2, -1) - 1)
End With

Очевидно, реализовать это в вашем цикле / функции и записать возвращаемое значение в ваши ячейки. Измените переменную Grade, чтобы увидеть различные значения, которые будут возвращены =)

0 голосов
/ 21 января 2020

Я изменил формат кода, чтобы он соответствовал Jclasley, и он отлично работает, вот мой окончательный код:

For i = 1 To 11
' Pull Grade numerical value
    Grade = Cells(2 + i, 16).Value
' Assign Numerical Value a script Grade
    Select Case Grade
        Case Is >= 90
            Letter = "A"
        Case Is >= 80
            Letter = "B"
        Case Is >= 70
            Letter = "C"
        Case Is >= 60
            Letter = "D"
        Case Else
            Letter = "F"
    End Select
    Cells(2 + i, 17).Value = Letter
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...