#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