2017-02-03 9 views
0

Я пытаюсь сделать цикл копирования-вставки на листе, а затем применить этот же цикл ко всем другим листам в одной книге.VBA: Nesting for Loop для каждой петли

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

For Loop: Simple Copy-Paste

For-Each Loop: Петля через рабочие листы

Это код:

Sub Code() 

Dim sheet As Worksheet 
Dim nr As Integer 

For Each sheet In Worksheets 

    For nr = 14 To 309 

     Range("C" & nr).Copy 
     Range("C3").PasteSpecial xlPasteValues 

     Range("D" & nr).Copy 
     Range("C4").PasteSpecial xlPasteValues 

     ActiveSheet.Calculate 

     Range("F2").Copy 
     Range("E" & nr).PasteSpecial xlPasteValues 

     Range("I2").Copy 
     Range("F" & nr).PasteSpecial xlPasteValues 

    Next nr 

Next 

End Sub 

Спасибо за вашу помощь!

+0

Просьба указать ваш вопрос перед тем, как обманывать, пресмыкающийся должен идти в конце сообщения только. – awiebe

ответ

0

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

Dim sh as Worksheet, nr as Long 
For Each sh In ThisWorkbook.Worksheets 
    For nr = 14 To 309 
     with sh 
      .Range("C" & nr).Copy 
      .Range("C3").PasteSpecial xlPasteValues 
      .Range("D" & nr).Copy 
      .Range("C4").PasteSpecial xlPasteValues 
      .Calculate 
      .Range("F2").Copy 
      .Range("E" & nr).PasteSpecial xlPasteValues 
      .Range("I2").Copy 
      .Range("F" & nr).PasteSpecial xlPasteValues 
     End with 
    Next nr 
Next sh 

Это хорошая практика, чтобы всегда квалифицировать ваши диапазоны. В противном случае они идут на любой лист в настоящее время active.

0

Оба повышение производительности, а не подчеркнуть использование буфера обмена, вы можете избежать Copy & PasteSpecial методы и перейти к прямому Value собственности назначения

Кроме того, вы можете конденсироваться диапазонов с правильным синтаксисом

следующим образом:

Option Explicit 

Sub main() 
    Dim ws As Worksheet, nr As Integer 

    For Each ws In ThisWorkbook.Worksheets 
     For nr = 14 To 309 
      With ws 
       .Range("C3:C4").Value = .Range("C" & nr).Resize(2).Value 
       .Calculate 
       .Range("E" & nr).Resize(, 2).Value = Array(.Range("F2").Value, .Range("I2").Value) 
      End With 
     Next 
    Next 
End Sub