2015-12-09 6 views
-1

Я пытаюсь написать этот модуль, чтобы вычислить класс письма от% в следующей ячейке и пропустить строки до тех пор, пока строка не станет пустой. Что не так с синтаксисом этого кода? Я получаю сообщение об ошибке: Ошибка времени выполнения 438: Объект оленья кожа поддерживает это свойство или метод в Average = Cells(i, 6).ValveDo Until loop Ошибка синтаксиса vba excel

Sub Grade() 
Dim Average As Double 
Dim i As Integer 

i = 3 

Do Until IsEmpty(Cells(i, 6)) 

Average = Cells(i, 6).Valve 
Average = Average * 100 

If (Average <= 60) Then 
    Cells(i, 7).Valve = ("E") 
End If 
If (Average <= 70) Then 
    Cells(i, 7).Valve = ("D") 
End If 
If (Average <= 80) Then 
    Cells(i, 7).Valve = ("C") 
End If 
If (Average <= 90) Then 
    Cells(i, 7).Valve = ("B") 
End If 
If (Average <= 100) Then 
    Cells(i, 7).Valve = ("A") 
End If 

i = i + 1 
Loop 

End Sub 
+0

вы имеете в виду 'ElseIf'? – bansi

+0

В какой момент вы присваиваете значение 'Average'? – DeanOC

+0

Сделал некоторые изменения. Я получил новую ошибку. Loop without Do – Duraholiday

ответ

0

Просто мысли на @zedfoxus пост

ОДНОЛИНЕЙНАЯ сослагательного наклонения не нужно положить конец, если

Sub Grade() 
Dim Average As Double 
Dim i As Long 

i = 3 

Do Until IsEmpty(Cells(i, 7)) 

    Average = Cells(i, 6).Value 
    Average = Average * 100  
    If (Average < 60) Then Cells(i, 7).Value = ("E") 
    If (Average < 70) Then Cells(i, 7).Value = ("D") 
    If (Average < 80) Then Cells(i, 7).Value = ("C") 
    If (Average < 90) Then Cells(i, 7).Value = ("B") 
    If (Average < 100) Then Cells(i, 7).Value = ("A") 

    i = i + 1 
Loop 

End Sub 

В дополнение к этому, хотя, вот мое взятие на проблема. Я собрал сжатую рутину с использованием 2-мерного массива и воспользовался функцией Vlookup на рабочем листе. Это работает, потому что он будет найти ближайшую вещь (полезно, когда вы используете диапазоны номеров)

Sub Grade() 
Dim Average As Double, i As Long, MyArr As Variant 
MyArr = Array(Array(60, "E"), Array(70, "D"), Array(80, "C"), Array(90, "B"), Array(100, "A")) 
i = 3 
Do Until IsEmpty(Cells(i, 7)) 
    Average = Cells(i, 6).Value * 100 'Why * 100? Anyway just copied what you have done in your code 
    Cells(i, 7).Value = Application.WorksheetFunction.VLookup(Average, MyArr, 2) 
    i = i + 1 
Loop 
End Sub 

И, наконец, потому что Средние переменный используются только один раз, это на самом деле не нужно быть там (в то время как ему можно было бы утверждать то же самое для MyArr, что он будет слишком раздутым, чтобы включить его в Vlookup, это будет трудно читать), вы можете удалить его и просто ссылаться на его состав в Vlookup, чтобы конденсировать код дальше, и, наконец, мы можем удалить i=3 и i=i+1, используя для следующего цикла опроса и до последней строки данных следующим образом:

Sub Grade() 
Dim i as long, MyArr As Variant 
MyArr = Array(Array(60, "E"), Array(70, "D"), Array(80, "C"), Array(90, "B"), Array(100, "A")) 
For i = 3 To Range("G" & Rows.Count).End(xlUp).Row 
    Cells(i, 7).Value = Application.WorksheetFunction.VLookup(Cells(i, 6).Value * 100, MyArr, 2) 
Loop 
End Sub 

I A m не уверен, почему вы умножаетесь на 100, и у меня нет данных теста. Я сделал свои собственные тестовые данные, но пришлось удалить * 100, чтобы заставить его работать, мои данные были в колонке F.

40 
50 
60 E 
65 E 
70 D 
75 D 
80 C 
85 C 
90 B 
95 B 
100 A 

Это код, который я использовал:

Sub Grade2() 
Dim i As Long, MyArr As Variant 
MyArr = Array(Array(60, "E"), Array(70, "D"), Array(80, "C"), Array(90, "B"), Array(100, "A")) 
For i = 3 To Range("F" & Rows.Count).End(xlUp).Row 
    Cells(i, 7).Value = Application.WorksheetFunction.VLookup(Cells(i, 6).Value, MyArr, 2) 
Next 
End Sub 
+0

Да, это работает, но почему не работает Else If? – Duraholiday

+1

Потому что у вас есть .Valve везде, а не. Вам было бы лучше попытаться понять код, который я вам дал, и придерживаться этого, а не пытаться получить раздутый многократный код, если он работает. Рад помочь вам, если вы хотите заставить его работать, но это не так эффективно. В качестве альтернативы используйте множественный код, который я опубликовал, и он также должен работать. –

+0

Возможно, вы захотите отладить «фиксированную» версию кода OPs. Он не только не будет работать, если столбец класса пуст (столбец 7), но если он запускается, он дает всем A –

1

Изменить

Dim Average As Double 
i As Integer 

в

Dim Average As Double 
Dim i As Integer 

or 

Dim Average As Double, i As Integer 

or 

Dim Average As Double, _ 
i As Integer 

Ваш код должен немного больше работы. Используйте что-то вроде этого:

Sub Grade() 
Dim Average As Double 
Dim i As Integer 

i = 3 

Do Until IsEmpty(Cells(i, 7)) 

    Cells(i, 6).Value = Average 
    ' Perhaps the above should be 
    ' Average = Cells(i,6).Value 

    If (Average < 60) Then 
     Cells(i, 7).Valve = ("E") 
    End If 
    If (Average < 70) Then 
     Cells(i, 7).Valve = ("D") 
    End If 
    If (Average < 80) Then 
     Cells(i, 7).Valve = ("C") 
    End If 
    If (Average < 90) Then 
     Cells(i, 7).Valve = ("B") 
    End If 
    If (Average < 100) Then 
     Cells(i, 7).Valve = ("A") 
    End If 

    i = i + 1 
Loop 

End Sub 
0

Интересно, если вы хотите использовать Формулу вместо VBA.

Vlookup может это сделать. Как ниже, надеюсь эта помощь.

enter image description here