#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 каждого цикла.