2015-06-03 3 views
0

Мне нужно скопировать данные, но поскольку объем данных, требующих копирования, будет довольно большим и заполнен вручную, я хотел бы сделать это с помощью макроса.Массив для копирования

Я не могу понять, как работают массивы.

Это дает мне нужное количество копий, но только из последней ячейки, которую мне нужно скопировать.

Sub copyer() 

Dim fromH As Integer 'fromheight 
Dim fromW As Integer 'fromwidth 

Dim toH As Integer  'to height 
Dim toW As Integer  'to width 

Dim counter As Integer 
counter = Worksheets("blad1").Range("D3").Value 'amount of filled-in data lines to copy 

Dim Times As Integer 'number of times to run the loop, depending on the filled in data 
Times = counter + 1 

Dim tostart As Integer 'location where to start placing the data 
         'depending on how much data is already present 
Dim toend As Integer 'location up to where to place 

tostart = Sheets("blad2").Range("L1").Value + 1 '(+2 if theres a header) 
toend = tostart + counter 

Dim Copy As Integer 

For Copy = 1 To Times 
For toH = tostart To toend 
    For toW = 1 To 2 
     For fromH = 12 To 22 Step 2 
      For fromW = 1 To 26 Step 25 
       Sheets("blad2").Cells(toH, toW).Value = _ 
       Sheets("blad1").Cells(fromH, fromW).Value 
      Next fromW 
     Next fromH 
    Next toW 
Next toH 
Next Copy 

'this macro needs to copy the data 

'from blad1 
'from height 12 to 22 (steps of 2)(10 times) 
'from width 1 and 26 (not the cells inbetween) 

'to blad2 
'to height depending on the data present (dim tostart)'till height needed (steps of 1) 
'to width 1 and 2 

'blad1, D3 holds the input-datacounter 
'blad2, L1 holds the output-datacounter 

End Sub 
+0

Это не совсем понятно, что вы пытаетесь делать. Сложно, что у вас будет 5x вложенный цикл 'For'. Вы перешли через код, используя F8, чтобы вручную пройти процесс и посмотреть, где он отличается от ваших ожиданий? Если нет, это должен быть ваш первый шаг в отладке. –

+0

мой ответ [здесь] (http://stackoverflow.com/questions/14035772/how-to-assign-an-excel-range-to-a-2d-array/14060707#14060707) должен помочь вам в копировании диапазона от и до массива. – SeanC

ответ

0

Как упомянуто Земэн, вы действительно слишком усложнили этот! Чтобы скопировать по массиву, вам нужно только столько циклов, сколько есть размеров в массиве. Так что два в этом случае! Я использовал простую арифметику для перевода с одного листа на другой. Это может быть не идеально, но, надеюсь, вы начнете!

Dim intRowLoop As Integer, intColLoop As Integer 

For intRowLoop = tostart To toend 
    For intColLoop = 1 To 2 
     Sheets("blad2").Cells(intRowLoop, intColLoop).Value = _ 
      Sheets("blad1").Cells(12 + ((intRowLoop - tostart) * 2), fromW * 26).Value 
    Next intColLoop 
Next intRowLoop 
0

В конце концов я пошел;

(в sheetnames являются diffrent как один выше был тест, чтобы получить его работу)

(ЮСТ сделал важный бит)

For ToH = tostart To toend Step 2 
For ToW = 2 To 8 Step 6 
     Sheets("factuur2").Cells(ToH, ToW).Value = _ 
     Sheets("multiprijs").Cells(FromH, FromW).Value 
    FromW = 28 
Next ToW 
FromH = FromH + 2 
ToW = 2 
FromW = 5 
Next ToH 

Однако проблема у меня с этим методом является то, что Переменные «width» здесь могут содержать только 2 значения как есть;

Width + something 'or 
Width to something 'at a regular interval 

Что бы я хотел, чтобы это будущее доказало ширину; 1, 3, 5, 19, ничего

для обоих из-и-к ширине

Ty и помог мне получить это право, хотя :)

Смежные вопросы