2016-06-20 4 views
0

У меня есть этот VBA первенствовать код макросаDo Хотя ActiveCell <> Range

Sub fillcells() 
    Range("J14").Select 
    Do While ActiveCell <> Range("J902") 
     ActiveCell.Copy 
     ActiveCell.Offset(6, 0).Select 
     ActiveCell.PasteSpecial 
    Loop 
End Sub 

Сначала он работал нормально, но теперь иногда, когда я пытаюсь запустить макрос цикл внезапно останавливается на клетки J242, в другое время является возникающий ошибка «тип несоответствия», а иногда макрос просто выбирает ячейку J14 без выполнения цикла

+2

Не используйте 'select'. – findwindow

+1

(см. [This] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) thread) – BruceWayne

+0

С этим кодом много чего не так. Чего именно вы хотите достичь? Переместить целую колонку вниз на 6 ячеек? – trincot

ответ

3

Не уверен, что вы хотите сделать, но (как указано в комментариях к вашему OP), don't use .Select/.Activate. Следующие должны делать то, что (я думаю) вы хотели:

Sub fillcells() 
Dim i& ' Create a LONG variable to count cells 

For i = 14 To 901 Step 6 
    Cells(i, 10).Offset(6, 0).FormulaR1C1 = Cells(i, 10).FormulaR1C1 
Loop 
End Sub 

Этот цикл будет из ячейки J14 в J901, копировать/вставить * в ячейку 6 строк смещения.

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

+0

Это код вставляет формулы без заполнения серии, мне нужно, например, в ячейке J20 " = G17 + H17 ", ячейка J26" = G23 + H23 " –

+1

@ArturoEsparza - Я отредактировал свой OP. Кроме того, прочитайте [Как спросить] (http: // stackoverflow.com/help/how-to-ask), так как это спасло бы всех, когда вы объяснили немного больше в своем OP, что вы пытаетесь сделать. – BruceWayne

2

Просто дополнение к тому, что @BruceWayne уже сказал: всякий раз, когда у вас есть это типичное явление, что что-то происходит только «иногда» это часто случай с использованием ключевых слов, таких как Active или Current или Selection. Они не являются конкретными, но изменяются каждый раз, когда вы вызываете макрос. Все, что вы выбрали, является отправной точкой. Возможно, вы даже начнете щелкать и, таким образом, измените Selection во время работы макроса. Короче говоря, вы должны явно начать кодирование и не разрешать VBA/Excel принимать/принимать решение для вас.

Начнем с Range("J14").Select. Эта строка кода просит VBA сделать уже два предположения:

  1. Если у вас есть несколько файлов Excel, открывайте их. С какого файла Excel он должен начинаться?
  2. Внутри файла может быть несколько листов. На каком из этих листов следует выбрать J14?

Явное кодирование означает, что вы (надеюсь, всегда) должны быть очень конкретными, о чем вы говорите. Таким образом, вместо того, чтобы просто констатирует Range("J14") вы должны использовать:

ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Range("J14") 

Но указываются, в другом ответе, это даже не нужно в этом случае. Вместо цикл строка, как показано и использование:

ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Cells(i, 10).Offset(6, 0).Formula = ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Cells(i, 10).Offset(i, 10).Formula 

Поскольку это немного длительным вы можете закорачивание его с помощью With заявления:

With ThisWorkbook.Worksheets("SheetNameYouWantToReferTo") 
    .Cells(i, 10).Offset(6, 0).Formula = .Cells(i, 10).Formula 
End With 
Смежные вопросы