Выбор широкого диапазона значений в Excel VBA

так вот у меня есть этот код в Excel VBA

Sub GetValue()

Dim rRH, rYear, r1 As Range
Dim RowIndex, ColIndex, yearRow As Integer
Dim rh1 As Integer
Dim rh1Pct As Double
Dim year As String

RowIndex = 30
yearRow = 10

Do While RowIndex < (RowIndex + yearRow)
    Set rRH = ThisWorkbook.Sheets("CF-Apar").Range("M" & CStr(RowIndex))

    If rRH.Value <> "" Then
        rh1 = rRH.Value
        year = ThisWorkbook.Sheets("CF-Apar").Range("A" & CStr(RowIndex)).Value
        Exit Do
    End If

    RowIndex = RowIndex + 1
Loop

RowIndex = 12
rh1Pct = Range("D12").Value

ColIndex = 0
Set rYear = Range("D120")
Do While ColIndex < yearRow

    If CInt(year) > CInt(rYear.Value) Then
        Set r1 = rYear
        r1.Offset(123, 0).Value = "0"
    End If

    If year = rYear.Value Then
        rYear.Offset(123, 0).Value = rh1 * rh1Pct
        Exit Do
    End If

    Set rYear = rYear.Next
    Set r1 = r1.Next
Loop
End Sub

код должен изменять или перемещать значение в текущей ячейке всякий раз, когда значение на листе CF-Apar изменяется, но текущий код охватывает только один диапазон (в данном случае это M в индексе CF-Apar), вопрос , как мне добавить больше ячеек диапазона, например, от M30 до Q40, как это лучше всего сделать?


person Abie Giordano    schedule 01.07.2013    source источник
comment
Вам нужно добавить еще один цикл, который будет «покрывать» Do...Loop, который у вас уже есть. Вы можете попробовать использовать For i=13 to 17, который будет отражать столбцы M to Q. Но чтобы сделать его эффективным, вам нужно изменить внутренние ссылки ваших диапазонов: с .Range("M" & Cstr(rowindex) на .Cells(rowindex, i). Надеюсь, вы справитесь с этим предложением.   -  person Kazimierz Jawor    schedule 01.07.2013
comment
хорошо, я понимаю, что вы имеете в виду, но я бы предпочел сделать несколько циклов (вложенных), есть идеи?   -  person Abie Giordano    schedule 01.07.2013
comment
Я только что предложил вложенный цикл... For i... >> Do while ...>> your loop internal code >> loop >> next i   -  person Kazimierz Jawor    schedule 01.07.2013
comment
хорошо, сэр: D, можете ли вы опубликовать это как ответ, плюс было бы неплохо дополнить его каким-нибудь примером   -  person Abie Giordano    schedule 01.07.2013


Ответы (1)


Как было предложено в комментариях, вам нужно использовать вложенные циклы. Это должно выглядеть следующим образом (предложенный ниже код не тестировался):

'beginning of your sub here

'additional loop
Dim i as Byte
For i=13 to 17 'columns M to Q

'your loop but changed inside
Do While RowIndex < (RowIndex + yearRow)
    Set rRH = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex, i)

    If rRH.Value <> "" Then
        rh1 = rRH.Value
        year = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex, i).Value
        Exit Do
    End If

    RowIndex = RowIndex + 1
Loop

RowIndex = 30
Next i
'rest of your code here

ИЗМЕНИТЬ, чтобы объяснить вопросы из комментариев. Несколько альтернативных вариантов для вас:

A) базовое решение в моем коде

Set rRH = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex,i)
'....
rh1 = rRH.Value   'for column i

B) альтернативное решение для вашего кода

Set rRH = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex, i)
Set rRH1 = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex, "N")
'....
rh1 = rRH.Value   'for column i
rh2 = rRH2.Value  'for column N

C) альтернативное решение для вашего кода

Set rRH = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex, "M")
'....
rh1 = rRH.Value   'for column M
rh2 = rRH2.Offset(0, 1).Value  'for column N

и некоторые другие смешанные варианты доступны.

person Kazimierz Jawor    schedule 01.07.2013
comment
но если я хочу установить rh2, rh3, rh4 и т. д. для следующей переменной, как я могу это сделать? в то время как я получил только rh1 = rRH.Value как я могу назначить rh2, rh3 и так далее? - person Abie Giordano; 01.07.2013
comment
это для следующих столбцов? как rh2 для столбца N, rh3 для столбца O и т. д.? - person Kazimierz Jawor; 01.07.2013
comment
всегда можно сделать так: Set rRH2 = ThisWorkbook.Sheets("CF-Apar").Cells(RowIndex, "N")... и так далее... - person Kazimierz Jawor; 01.07.2013
comment
да, именно так, как вы сказали, rh2 для столбца N, rh3 для столбца O :) - person Abie Giordano; 01.07.2013
comment
Итак, см. редактирование в ответе, некоторые предоставленные варианты и некоторые другие, которые вы могли бы выяснить самостоятельно... - person Kazimierz Jawor; 01.07.2013