Как использовать цикл с повторяющимися макросами?

#excel #vba

#excel #vba

Вопрос:

У меня есть около 3 длинных и повторяющихся макросов. Кажется, я не могу понять синтаксис цикла, который нужно использовать, чтобы упростить это. Есть идеи?

Макрос 1

 Range("A6:L6").Copy
Range("D3:O3").PasteSpecial Paste:=xlPasteValues

Range("A10:L10").Copy
Range("D4:O4").PasteSpecial Paste:=xlPasteValues

Range("A14:L14").Copy
Range("D5:O5").PasteSpecial Paste:=xlPasteValues

Range("A18:L18").Copy
Range("D6:O6").PasteSpecial Paste:=xlPasteValues
  

Макрос 2

 Range("A7").Copy
Range("A4").PasteSpecial Paste:=xlPasteValues

Range("A11").Copy
Range("A5").PasteSpecial Paste:=xlPasteValues

Range("A15").Copy
Range("A6").PasteSpecial Paste:=xlPasteValues

Range("A19").Copy
Range("A7").PasteSpecial Paste:=xlPasteValues
  

Макрос 3

  Range("B4").Copy
Range("B3").PasteSpecial Paste:=xlPasteValues

 Range("B8").Copy
Range("B4").PasteSpecial Paste:=xlPasteValues

 Range("B12").Copy
Range("B5").PasteSpecial Paste:=xlPasteValues
  

Ответ №1:

Вы могли бы сделать это так:

 Dim rngCopy As Range, rngPaste As Range, n as long

With ActiveSheet
    Set rngCopy = .Range("A6:L6")
    Set rngPaste = .Range("D3") 
End With

For n = 1 to 4
    rngPaste.Resize(rngCopy.Rows.Count, rngCopy.Columns.Count).Value = rngCopy.Value
    
    Set rngCopy = rngCopy.Offset(4, 0)
    Set rngPaste = rngPaste.Offset(1, 0)

Next n
  

Примечание. если вам просто нужно скопировать значения, вы можете назначить их напрямую, без шагов копирования / вставки.

Ответ №2:

Похоже, вы хотите лучше понять, как работают циклы, поэтому я сделал простые для понимания циклы на основе ваших 3 макросов:

 'Macro 1 could be
Dim i As Long
Dim ZZ As Long

ZZ = 3

For i = 6 To 18 Step 4
    Range("D" amp; ZZ amp; ":O" amp; ZZ).Value = Range("A" amp; i amp; ":L" amp; i).Value
    ZZ = ZZ   1
Next i

'MAcro2 could be
Dim i As Long
Dim ZZ As Long

ZZ = 4
For i = 7 To 19 Step 4
    Range("A" amp; ZZ).Value = Range("A" amp; i).Value
    ZZ = ZZ   1
Next i

'Macro3 could be
Dim i As Long
Dim ZZ As Long

ZZ = 3

For i = 4 To 12 Step 4
    Range("B" amp; ZZ amp; ":O" amp; ZZ).Value = Range("B" amp; i amp; ":L" amp; i).Value
    ZZ = ZZ   1
Next i
  

Надеюсь, это проливает некоторый свет. В любом случае, вам лучше проверить циклы For Next и For Each, описанные для VBA и Excel