Выберите структуру обращения

#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. Понял. Спасибо!