Как скопировать одну строку в несколько строк?

#excel #vba #copy-paste

#excel #vba #копировать-вставить

Вопрос:

Мне нужно создать список, объединяющий процессы и страны.

У меня 114 процессов и 55 стран.

Я должен построить список следующим образом:

  • Первый процесс 55 раз (55 стран)
  • Второй процесс 55 раз (55 стран)
  • … и т.д.

Пример:
изображение

Я думаю об этом коде:

 Sub Copydata()
    
    Dim i As Long
    Dim y As Long
    Dim sht As Worksheet
    Dim lastrow As Long
    
    Set sht = ThisWorkbook.Sheets("Sheet2")
    lastrow = sht.Cells(sht.Rows.Count, "A").End(x1Up).Row
    
    Worksheets("Sheet2").Activate
    Dim A
    
    For i = 1 To lastrow
        For y = 1 To 55
            Sheet3.Cells(y, 1) = Sheet2.Cells(i, 1)
        Next y
    Next i
    
End Sub
 

Это должно добавить к листу 3, 55 раз обработать 1, затем перейти к процессу 2 и т. Д. (Впоследствии я могу обработать часть страны.)

Я получаю

ошибка времени выполнения 1004

Комментарии:

1. xlUp — это буква l , а не число 1 . Обратите внимание, что вы можете использовать Resize here вместо вашего внутреннего цикла.

Ответ №1:

В вашем коде есть несколько проблем. Причиной вашей ошибки во время выполнения является опечатка vba const xlUp , которая у вас есть как x1Up (число 1 вместо буквы l).

Кроме того, вы можете немного навести порядок, используя свои переменные более последовательно. Захватывайте ссылки на свои листы либо через Рабочую книгу, либо через кодовые имена листов. В вашем коде вы делаете и то, и другое. Мне также нравится видеть более явное присвоение значений объектам Cells. Вместо того, чтобы устанавливать ячейки равными друг другу, установите Cell.Value . Вот небольшие изменения, которые я предлагаю:

РЕДАКТИРОВАТЬ: я обновил код, чтобы сделать то, что вы описываете в своем комментарии.

 Sub Copydata()

    Dim i As Long
    Dim y As Long
    Dim sht2 As Worksheet
    Dim sht3 As Worksheet
    Dim lastrow As Long
    
    Set sht2 = ThisWorkbook.Sheets("Sheet2")
    Set sht3 = ThisWorkbook.Sheets("Sheet3")
    lastrow = sht2.Cells(sht2.Rows.Count, "A").End(xlUp).Row
    
    y = 1
    
    For i = 1 To lastrow
        For y = y To y   54
            sht3.Cells(y, 1).Value = sht2.Cells(i, 1).Value
        Next y
    Next i

End Sub
 

Комментарии:

1. спасибо за код, после замены числа на букву код работал, а также ваш код работал. проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, что код перезаписывает строки снова и снова вместо добавления ниже. Я предполагаю, что в коде нужно использовать 3-ю букву, чтобы добавить процесс 2 после первых 55 строк process1 и process3 после этого и так далее, пока я не получу 6270 строк

2. @TudorDobre итак, вы хотите, чтобы для листа 3 было установлено значение 55 строк, равное значению первой строки листа 2? И затем для всех строк 56-110 установлено значение второй строки листа 2? и так далее? Я обновил ответ, чтобы сделать то, что, как я думаю, вы описываете. Вы просто не перезапускаете y до 1 каждого цикла.