Скопируйте и вставьте строку по номеру индекса в макросе Excel

Я пытаюсь скопировать всю строку по номеру индекса и вставить его в другую строку с другим номером индекса, когда выполняется определенное условие (я знаю, что проблема не в условной логике). Я думаю о чем-то вроде этого:

Sub Makro1()

Dim i As Integer

With ActiveSheet
    'for looping
    totalRows = .Cells(.Rows.Count, "A").End(xlUp).Row

    'index of last row even after rows have been added
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

    'data starts at row #3
    For i = 3 To totalRows
        If .Cells(i, 19).Value > 0 Then
            Number = .Cells(i, 19).Value
            Do While Number > 0
                lastRow = lasRow + 1
                'Next line doesnt do anything
                .Rows(lastRow) = .Rows(i).Value
                Number = Number - 1
            Loop
        End If
    Next i
End With
End Sub

Логика работает как положено, но никакие строки не вставляются. Я пошел шаг за шагом и уверен, что проблема не в логике.

 RGA16 июн. 2016 г., 10:25
@Nathan_Sav Он должен начинаться так же, но увеличивается во время цикла OP
 RGA16 июн. 2016 г., 10:20
СделатьTotalRows а такжеLastRow переменные дают вам ожидаемые значения?
 RGA16 июн. 2016 г., 10:21
Кроме того, кажется, что вLastrow = lastRow + 1 линия. Неясно, является ли это причиной ошибки в вашем коде (это не будет видно, если вы не используетеOption Explicit в начале вашего модуля
 Nathan_Sav16 июн. 2016 г., 10:24
Похоже, итоги и lastrow будут в одном ряду ???

Ответы на вопрос(3)

Решение Вопроса

что вы хотите скопироватьRows(i) и вставьте его как значение вRows(lastRow), Итак, вам нужно заменить эту строку

 .Rows(lastRow) = .Rows(i).Value

с этими двумя строками:

.Rows(i).Copy
.Rows(lastRow).PasteSpecial xlPasteValues

Или же

.Rows(lastRow).Copy
.Rows(i).PasteSpecial xlPasteValues

если вы хотите скопироватьRows(lastRow) и вставьте его как значение вRows(i).

Редактировать:

Чтобы вставить все (формулы + значения + форматы), используйте тип вставки какxlPasteAll.

Ссылка:MSDN

так что просто добавьте точку останова на.Rows(lastRow) = .Rows(i).Value оператор, а затем запросить все соответствующие значения переменных в Immediate Window, например:

?lastRow
?.Rows(lastRow).Address
?i
?.Rows(i).Address

в то же время вы могли бы

добавлятьOption Explicit утверждение в самом верху вашего модуля кода

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

DIM переменные для хранения индекса строки сLong введите для обработки строк с индексом выше 32767

избегайте внутреннего цикла, используяResize() метод дальности объекта

очень похоже на следующее:

Option Explicit

Sub Makro1()

    Dim i As Long, totalRows As Long, lastRow As Long, Number As Long

    With ActiveSheet
        'for looping
        totalRows = .Cells(.Rows.Count, "A").End(xlUp).Row

        'index of row to add from
        lastRow = totalRows + 1 '<--| start pasting values one row below the last non empty one in column "A"

        'data starts at row #3
        For i = 3 To totalRows
            If .Cells(i, 19).Value > 0 Then
                Number = .Cells(i, 19).Value
                .Rows(lastRow).Resize(Number).Value = .Rows(i).Value
                lastRow = lastRow + Number
            End If
        Next i
    End With
End Sub
Диапазон копирования и вставки

Диапазон (). Копировать [Назначение]

Квадратные скобки указывают, что Назначение является необязательным параметром. Если вы не назначите диапазон назначения, он скопирует выделенную область в буфер обмена. В противном случае он копирует первый диапазон непосредственно в новое местоположение.

Измените эту строку:

.Rows (lastRow) = .Rows (i) .Value

Для того, чтобы:

.Rows (lastRow) .copy .Rows (i)

Стоит отметить, что

.Rows (lastRow) .copy .Cells (i, 1)

Тоже будет работать. Excel изменит размер целевого диапазона в соответствии с новыми данными.

 Ajeet Shah16 июн. 2016 г., 15:58
@RGADestination:= Звонить необязательно. Обе эти работы, например,.Rows(1).Copy Destination:=.Rows(2) а также.Rows(1).Copy .Rows(2) и делает то же самое.
 RGA16 июн. 2016 г., 10:27
ЭтоDestination:= звонок здесь не требуется?
 RGA16 июн. 2016 г., 16:05
@ Орионы никогда не знали этого. Очень круто

Ваш ответ на вопрос