Как вставить скопированную строку с одного листа на другой - PullRequest
1 голос
/ 23 марта 2011

У меня есть две таблицы Excel: Sheet1 и Sheet2.Sheet2 - это основной список, а Sheet1 - это обновленная рабочая таблица, которую я получаю из системы.Что мне нужно, так это сравнить каждое значение Col A Листа 1 с Листом 2.Если есть совпадение, я хочу скопировать всю совпадающую строку из Sheet1 и вставить значения из этой строки в соответствующую строку значения ColA (Item #) в Sheet2.Пример, показанный ниже:

Рабочий лист 1

ColA                                      ColB

Item#                                     Updated Cost

1234                                      $30

Рабочий лист 2

ColA                                      ColB

Item#                                     Current Cost

1234                                      $45

В моем столбце большефайла, чем показано здесь, поэтому необходимо скопировать всю строку с соответствующей строкой в ​​Sheet2.Я запустил необходимый код Excel VBA, но я застрял на части, чтобы вставить соответствующие значения в Sheet2.Мой код довольно прост и пока не работает, поэтому любая помощь, связанная с кодированием, приветствуется.

Sub Macro1()
'
' Macro1 Macro
'
'   Copies corresponding item# rows from sheet1 worksheet
'   to sheet2 worksheet by comparing item# column

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ColA As String
Dim rng1 As Range
Dim rng2 As Range
Dim RowCounter1 As Integer
Dim RowCounter2 As Integer

ColA = "A"

RowCounter1 = 2
RowCounter2 = 2

Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")

Do While Not IsEmpty(ws1.Range(ColA & RowCounter1).Value)

    Set rng1 = ws1.Range(ColA & RowCounter1)

    RowCounter2 = 1
    Do While Not IsEmpty(ws2.Range(ColA & RowCounter2).Value)

        Set rng2 = ws2.Range(ColA & RowCounter2) 
        If rng1.Value = rng2.Value Then 
             Rows(RowCounter1).EntireRow.Copy                  
             RowCounter2 = RowCounter2 - 1  
        End If
        RowCounter2 = RowCounter2 + 1

    Loop
    RowCounter1 = RowCounter1 + 1
Loop

End Sub

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Вот способ использования метода PasteSpecial и упрощения кода:

Sub Macro1()

'
' Macro1 Macro
'
'   Copies corresponding item# rows from sheet1 worksheet
'   to sheet2 worksheet by comparing item# column

Dim rng1 As Range, rng2 As Range

For Each rng1 In Worksheets("Sheet1").Range("A2").Resize(Worksheets("Sheet1").Range("A2").CurrentRegion.Rows.Count - 1).Rows
  For Each rng2 In Worksheets("Sheet2").Range("A2").Resize(Worksheets("Sheet2").Range("A2").CurrentRegion.Rows.Count - 1).Rows
    If rng2(1).Value = rng1(1).Value Then
      rng1.EntireRow.Copy
      rng2.EntireRow.PasteSpecial (xlPasteValues)
    End If
  Next rng2
Next rng1

End Sub
0 голосов
/ 06 марта 2014

Используйте это:

Sheet2.Select (Sheet1.Rows(index).Copy)     // Index is copy row index in sheet1

Sheet2.Paste (Rows(index))       // Index is Paste row index in sheet2
0 голосов
/ 23 марта 2011

Этот фрагмент может помочь вам (предупреждение: написано без какого-либо тестирования)

Dim RowCollection As New Collection

Dim rgRow1 As Range
For Each rgRow1 In RangeFromSheet1
    ' saves each sheet1 row indexed by the (string) value of the 1st cell
    Call RowCollection.Add(rgRow, CStr(rgRow1.Cells(1, 1).Value))
Next rgRow1

Dim rgRow2 As Range
For Each rgRow2 In RangeFromSheet2
    ' try to find matching row
    On Error Resume Next
    Set rgRow1 = Nothing
    Set rgRow1 = RowCollection(CStr(rgRow2.Cells(1, 1).Value)) ' lookup using sheet2 val
    On Error GoTo 0
    If Not rgRow1 Is Nothing Then
        rgRow2.Value = rgRow1.Value ' found a match, so copy values
    End If
Next rgRow2

note: RowCollection.Add завершится ошибкой при дублировании значений ключа - поэтому, если это возможно, вам нужно будет добавить некоторые дополнительныепроверка

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