2015-12-03 3 views
1

У меня есть сценарий VBA, который петли следующим образом:изменить способ VBA данные сценария пасты

Если значение ячейки 3, то он будет вставлять строки 1 в 3 раза, строка 2 3 раза, и т.д..

Текущий диапазон пасты выглядит следующим образом:

Line 1 
Line 1 
Line 1 

Line 2 
Line 2 
Line 2 

Line 3 
Line 3 
Line 3 

мне было интересно, может ли сценарий VBA вставить данные, так что данные таким образом:

Line 1 
Line 2 
Line 3 

Line 1 
Line 2 
Line 3 

Line 1 
Line 2 
Line 3 

VBA скрипт вождения выше следующим образом:

Sub CopyJournalLines2() 

Dim wsInv As Worksheet 

Dim i As Integer 

Dim j As Integer 
Dim iStartRow As Integer 
Dim iNumCopies As Integer 
Dim iCopyRow As Integer 
Dim CopyRange As Range 
Dim PasteRange As Range 

Set wsInv = ThisWorkbook.Sheets("Invoice Upload") 

With wsInv 
.Rows("17:5000").Cells.Clear 
iStartRow = 17 
iNumCopies = .Range("O12").Value 
For i = 1 To 4 
    Set CopyRange = .Range(.Cells(i, 1), .Cells(i, 17)) 
    iCopyRow = iStartRow + (i - 1) * iNumCopies 
    Set PasteRange = .Range(.Cells(iCopyRow, 1), .Cells(iCopyRow, 17)) 
    PasteRange.Formula = CopyRange.Formula 

    For j = 2 To iNumCopies 
     iCopyRow = iStartRow + j - 1 + (i - 1) * iNumCopies 
     .Range(.Cells(iCopyRow, 1), .Cells(iCopyRow, 17)).FormulaR1C1 = PasteRange.FormulaR1C1 

    Next j 
Next i 
End With 
End Sub 

ответ

1

Код для запроса гораздо проще, фактически, поскольку вы просто pa укусить те же самые 4 линии iNumCopies раз.

Полностью протестирован код:

Sub CopyJournalLines2() 

Dim wsInv As Worksheet 

Dim i As Integer, j As Integer 
Dim iNumCopies As Integer, iCopyRow As Integer, iStartRow As Integer 
Dim CopyRange As Range, PasteRange As Range 

Set wsInv = ThisWorkbook.Sheets("Invoice Upload") 

With wsInv 

    .Rows("17:5000").Cells.Clear 
    iStartRow = 17 
    iNumCopies = .Range("O12").Value 

    j = 0 

    For i = 1 To iNumCopies 

     .Range(.Range("A" & iStartRow).Offset(j), .Range("Q" & iStartRow + j + 3)).FormulaR1C1 = .Range("A1:Q4").FormulaR1C1 

     'to paste formats and values use the following code 
     '.Range("A1:Q4").Copy 
     '.Range(.Range("A" & iStartRow).Offset(j), .Range("Q" & iStartRow + j + 3)).PasteSpecial xlPasteValues 
     '.Range(.Range("A" & iStartRow).Offset(j), .Range("Q" & iStartRow + j + 3)).PasteSpecial xlPasteFormats 

     j = j + 4 

    Next i 


End With 

End Sub 
+0

Спасибо так много Скотта. Не могли бы вы рассказать мне, как изменить переменную, если я меняю ее на 2 вместо 3 (чтобы скопировать количество строк)? –

+0

@YameenSarwar - количество копий получается из 'Range (« O12 »)' как вы в исходном коде, поэтому просто настройте это значение перед запуском макроса. –

+0

Привет Скотт. Еще раз спасибо за быстрый ответ. Вы знаете, есть ли способ сохранить исходное форматирование копируемых строк? Также вы можете рассказать мне, что это значит: Range («A1: Q4»). FormulaR1C1 –