2016-02-17 4 views
1
Sub Reflector() 

Dim i As Integer 
Dim endRow As Integer 
endRow = Cells(Rows.Count, "B").End(xlUp).Row 

Range("G2").Select 

For i = 2 To 40 

Range("G" & i).Select 

    If Range("H" & i).Value = "1" Or Range("H" & i).Value = "-1" Then 

    ActiveCell.Formula = "=ROW(A1)" 

    ActiveCell.AutoFill Destination:=Range(ActiveCell.Address & ":G" & endRow) 

    End If 

Next i 

End Sub 

Я хочу, чтобы макрос проверял значения в столбце H и сохранял подсчет времени, когда он имеет значение НЕ -1 или 1, а затем записывает это в столбце G. Если он попадает значение с 1 или -1 в столбце G, я бы хотел, чтобы он перезапустил счет.Ошибки с автозаполняющими уравнениями VBA

Процесс заключается в том, что я проверю столбцы H и автозаполнение на последнюю строку данных и «отскакивает назад», чтобы проверить следующее значение, а затем снова автозаполнение, если оно соответствует 1 или -1.

Здесь ошибка я получаю:

enter image description here

enter image description here

+0

Почему бы не использовать формулы? '= IF (OR (H2 = 1, H2 = -1), 1, G1 + 1)' –

+0

Эта логика позже будет использоваться для более сложной формулы. Строка (A1) является немного формулой удержания. – AltoidsBenefitsH

+0

_Эта логика будет использоваться для более сложной формулы позже. Идея автоматического заполнения всего диапазона сложной формулой несколько раз в цикле не похожа на хороший подход. Для меня это проблема XY. – BrakNicku

ответ

1

Avoid using Select in and ActiveCell (если это абсолютно необходимо).

Попробуйте этот код:

Sub Reflector() 

Dim ws as Worksheet 
Set ws = WOrksheets("Sheet1") 'change as needed 

Dim i As Integer 
Dim endRow As Integer 
endRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row 

For i = 2 To 40 

    If ws.Range("H" & i).Value = "1" Or ws.Range("H" & i).Value = "-1" Then 

     With ws.Range("G" & i) 
      .Formula = "=ROW(A1)" 
      .AutoFill Destination:=ws.Range(ws.Range("G"&i),ws.Range("G" & endRow)) 
     End With 

    End If 

Next i 

End Sub 

UPDATE

К @ ScottCraner указывают этот бит кода также будет работать и легче для чтения/сохранения.

Dim ws As Worksheet 
Set ws = Worksheets("Sheet1") 'change as needed 

Dim endRow As Long 
endRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row 

With ws.Range("G2:G" & endRow) 
    .FormulaR1C1 = "=IF(OR(RC[1]=1,RC[1]=-1),1,R[-1]C+1)" 
End With 

Скриншот протестированного кода:

enter image description here

+0

Привет, Скотт, спасибо за ответ. Все еще даю мне #REF! для этих клеток минус последний. – AltoidsBenefitsH

+0

посмотри мои результаты. это то, что я получил, когда я запускал код в своем ответе, как есть. –

+0

Я попробовал это на совершенно новой таблице с этими данными в столбцах G и H, но у меня получился другой результат. Ваш код кажется правильным, но я не понимаю, почему я получаю все эти #REF! Результаты. Добавлено обновленное изображение – AltoidsBenefitsH

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