#excel #vba
#excel #vba
Вопрос:
Мой вопрос заключается в следующем, следующий «Выбор регистра», диапазон находится между A1: A100. После того, как я попробую следующий код, я получу только один результат для 100 результатов прогресса, которые мне нужны. Код, приведенный ниже:
Private Sub CommandButton1_Click()
Dim score As Integer, result As String
score = Range("A1").Value
Select Case score
Case Is >= 80
result = "very good"
Case Is >= 70
result = "good"
Case Is >= 60
result = "sufficient"
Case Else
result = "insufficient"
End Select
Range("B1").Value = result
End Sub
Комментарии:
1. Вы никогда не присваиваете другое значение
score
.2. Вам нужно будет исследовать циклы
3. Вам нужно выполнить цикл по 100 ячейкам. Прямо сейчас ваш код просматривает только A1 и отвечает в B1. Кстати, зачем вообще vba, когда простой ИНДЕКС (MATCH()) сделает это без необходимости в коде.
Ответ №1:
Если вы укажете, что хотите выполнять одну и ту же функцию для каждой ячейки в заданном вами диапазоне, вы можете выполнить FOR EACH
цикл следующим образом:
Private Sub CommandButton1_Click()
Dim score As range, result As String
set score = Range("A1:a100")
for each c in score.cells
Select Case c.value
Case Is >= 80
result = "very good"
Case Is >= 70
result = "good"
Case Is >= 60
result = "sufficient"
Case Else
result = "insufficient"
End Select
c.offset(0,1) = result 'specifies the cell 1 column to the right of the current cell
next c
End Sub
Комментарии:
1. Идеально! Сработало потрясающе. Спасибо!
Ответ №2:
Это то, что я бы сделал. Довольно просто использовать For ... Next
цикл для циклического перебора ячеек в указанном диапазоне столбца A, а затем поместить значение из Select Case
инструкции в ячейку, смежную со столбцом B
Private Sub CommandButton1_Click()
Dim score As Integer
Dim result As String
Dim xlCell As Range
For Each xlCell In Range("A1:A100")
score = xlCell
Select Case score
Case Is >= 80
result = "very good"
Case 70 To 79
result = "good"
Case 60 To 69
result = "sufficient"
Case Is < 60
result = "insufficient"
End Select
xlCell.Offset(0, 1) = result
Next xlCell
End Sub
Комментарии:
1. Сработало идеально. Спасибо, очень ценю помощь.
Ответ №3:
Лично я бы не стал использовать цикл здесь, это намного быстрее сделать таким образом, чем зацикливать ячейку за раз:
Sub CommandButton1_Click()
With Range("B1:B100")
.Formula = "=IF(A1>79,""very good"",IF(A1>69,""good"",IF(A1>59,""sufficient"",""insufficient"")))"
.Calculate
.Copy
.PasteSpecial xlPasteValues
End With
End Sub
Он вводит формулу для вычисления результатов, затем принудительно вычисляет (требуется, только если для вычисления задано значение вручную, иначе вы можете удалить эту строку), затем копирует и вставляет обратно в виде значений.
Если это для школьного задания, и вам сказали использовать инструкцию loop или case, то да, используйте инструкции, которые вам сказали, но в противном случае я бы посоветовал избегать зацикливания, когда это возможно.
Комментарии:
1. Понял. Спасибо!