VBA еще один вопрос для петли - PullRequest
0 голосов
/ 22 июля 2011

Я знаю, что уже есть тонна вопросов о создании зацикленных кодов в vBA, но, надеюсь, это будет быстрый ответ, я не смог найти страницу, посвященную этой проблеме.

Моя цель состоит в том, чтобыпроверьте значения из одного диапазона со значениями в другом диапазоне, и, если это совпадение, он выполнит функцию и отобразит результаты в конце.Однако, если соответствующее значение в диапазоне равно «N / A», я хочу, чтобы результаты отображались немедленно и переходили к следующему проверенному значению.Прямо сейчас я получаю ошибку «нет цикла» для моего кода, и я понимаю, почему.Но я не знаю, как решить эту проблему.Кто-нибудь может помочь?

Sub solubility()

Dim coeff As Range, groups As Range
Dim anion As Range
Dim a As Range
Dim nextrow As Long
Dim j As Range

Worksheets("properties").Select
Range("P7:P2000").Select
Selection.ClearContents

'solubility groups range
groups = Worksheets("Solubility").Range("A2:A33")
'group coefficients range
coeff = Worksheets("Solubility").Range("B2:B33")

anion = Worksheets("properties").Range("AB7:AB887")

For Each a In anion
   For Each j In groups
        If UCase(a.Value) = UCase(groups(j).Value) Then
             If groups(j).Value = "" Or "N/A" Then
                Worksheets("properties").Range("P" & a.Row).Value = "N/A"
                Next a
             Else
                anvalue = coeff(j).Value * Range("AC" & a.Row).Value
             End If
        End If
        If UCase(Range("AD" & a.Row).Value) = UCase(groups(j).Value) Then
            cavalue = coeff(j).Value * Worksheets("properties").Range("AE" & a.Row).Value
        If UCase(Range("AF" & a.Row).Value) = UCase(groups(j).Value) Then
            cb1value = coeff(j).Value * Worksheets("properties").Range("AG" & a.Row).Value
        End If
        If UCase(Range("AH" & a.Row).Value) = UCase(groups(j).Value) Then
            cb2value = coeff(j).Value * Worksheets("properties").Range("AI" & a.Row).Value
        End If
   Next j
        If UCase(Range("AD" & a.Row).Value) = UCase("[MIm]") Then
            cavalue = Range("AE" & a.Row) * Worksheets("solubility").Range("B2").Value + Range("AE" & a.Row) * Worksheets("solubility").Range("B7").Value
        End If
    nextrow = Worksheets("properties").Cells(Rows.Count, 15).End(xlUp).Offset(1, 0).Row
    Worksheets("properties").Range("P" & nextrow).Value = _
        anvalue + cavalue + cb1value + cb2value + Worksheets("solubility").Range("b34").Value
Next a
End Sub

У меня есть строка 'Next a' дважды, и Excel не любит это, но я хочу автоматически перейти к следующему проверенному значению, не выполняя оставшуюся функцию, если я получаю "N / A"значение.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Я знаю, что это вызовет раздражение у некоторых из моих братьев-пуристов, но я бы на самом деле предложил разумное использование GoTo в вашем случае:

    For Each a In anion
       For Each j In groups
            If UCase(a.Value) = UCase(groups(j).Value) Then
                 If groups(j).Value = "" Or "N/A" Then
                    Worksheets("properties").Range("P" & a.Row).Value = "N/A"
                    GoTo NextA
                    ....
                 End If
            End If
            ....
       Next j
       ....
NextA:
    Next a

Чрезмерное использование GoTo быстро повернетваш код в спагетти, но в этом случае я думаю, что это на самом деле самый читаемый вариант, который у вас есть.

0 голосов
/ 22 июля 2011

Вы должны определить ссылку на объект, используя SET:

SET groups = Worksheets("Solubility").Range("A2:A33")

(одинаково для всех диапазонов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...