2013-07-01 2 views
0

так вот я имею этот код в 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, как наилучшим образом сделать это?

+1

Вам нужно добавить еще один цикл, который будет «накрывать» «Do ... Loop», который у вас уже есть. Вы можете попытаться использовать 'For i = 13 до 17', который будет отображать столбцы' M to Q'. Но, чтобы сделать его эффективным, вам нужно изменить внутренние ссылки ваших диапазонов: из '.Range (« M »и Cstr (rowindex)» в '.Cells (rowindex, i)'. Надеюсь, вы справитесь с этим предложением. –

+0

хорошо, я понимаю, что вы имеете в виду, но я бы предпочел сделать несколько циклов (вложенных), любую идею? –

+0

Я только что предложил вложенную петлю ... 'Для i ... >> Do while ... >> ваш внутренний код цикла >> loop >> next i' –

ответ

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 

EDIT объяснить вопросы комментариев. Некоторые альтернативные варианты для Вас:

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 

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

+0

, но предполагается, что я хочу установить rh2, rh3, rh4 и т. д. для следующей переменной, как я могу это сделать, пока я только получил ** rh1 = rRH.Value ** как я могу назначить rh2, rh3 и т. д.? –

+0

это для следующих столбцов? как rh2 для столбца N, rh3 для столбца O и т. д. ... –

+0

вы всегда можете сделать это следующим образом: 'Set rRH2 = ThisWorkbook.Sheets (« CF-Apar »). Ячейки (RowIndex,« N »)' ... и так далее ... –

Смежные вопросы