Как вырезать / вставить строки из одного листа Excel в 1-ую пустую строку другого листа - PullRequest
1 голос
/ 23 мая 2019

Мне нужна любая строка в Sheet1, в которой есть слово «Done» в столбце E, которая будет вырезана и вставлена ​​в следующую пустую строку Sheet2. Моя проблема в том, что я не знаю, как найти следующую пустую строку в Sheet2 и начать вставлять значения в следующую пустую строку.

Это базовая рабочая тетрадь с двумя листами. В Sheet1 есть все задачи сотрудника, а в Sheet2 отображаются только те задачи, которые выполнены. Каждый раз, когда сотрудник завершает задачу и вводит «Готово» в ячейку в столбце E Листа 1, всю эту строку необходимо вырезать и вставить в следующую пустую строку Листа 2. Я создал командную кнопку ActiveX в Sheet1 со следующим кодом. Код находит любую ячейку в Sheet1 с надписью «Done» и вырезает / вставляет ее в Sheet2, но она всегда начинает вставляться с начала Sheet2, и мне нужно, чтобы она начала вставлять со следующей пустой строки Sheet2.

Private Sub CommandButton1_Click()
Dim c As Range
Dim j As Integer
Dim Source As Worksheet
Dim Target As Worksheet

' Change worksheet designations as needed
Set Source = ActiveWorkbook.Worksheets("Sheet1")
Set Target = ActiveWorkbook.Worksheets("Sheet2")

j = 1     ' Start copying to row 1 in target sheet
For Each c In Source.Range("E1:E1000")   ' Do 1000 rows
    If c = "Done" Then
       Source.Rows(c.Row).Cut Target.Rows(j)
       j = j + 1
    End If
Next c
End Sub

Моя проблема в том, что он продолжает перезаписывать все, что уже есть в Sheet2, потому что я не знаю, чем заменить код переменной 'j'. Мне нужно, чтобы найти следующую пустую строку в Sheet2 и начать вставлять оттуда.

1 Ответ

0 голосов
/ 23 мая 2019

Попробуй:

Private Sub CommandButton1_Click()
Dim Source As Worksheet
Dim Target As Worksheet

Dim lRowSrc As Long, lRowDst As Long, lColSrc As Long, R As Long

' Change worksheet designations as needed
Set Source = ActiveWorkbook.Worksheets("Sheet1")
Set Target = ActiveWorkbook.Worksheets("Sheet2")

With Source
    lRowSrc = .Cells(.Rows.Count, 1).End(xlUp).row
    lColSrc = .Cells(1, .Columns.Count).End(xlToLeft).Column

    For R = lRowSrc To 1 Step -1
        If .Cells(R, 5) = "Done" Then
            lRowDst = Target.Cells(Target.Rows.Count, 1).End(xlUp).row

            Target.Range(Target.Cells(lRowDst + 1, 1), Target.Cells(lRowDst + 1, lColSrc)).Value = .Range(.Cells(R, 1), .Cells(R, lColSrc)).Value
            .Cells(R, 5).EntireRow.Delete   'get rid of the row
        End If
    Next R
End With

End Sub

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

РЕДАКТИРОВАТЬ: использовал переменную последней строки вместо текущей строки для копирования значений. Исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...