Сравните две колонки в Excel и вставьте новую строку - PullRequest
0 голосов
/ 30 октября 2019

У меня хорошее (плохое) время в Excel vba.

У меня есть два листа в рабочей тетради - лист1 и лист2.

Лист 1

AccountNo   Account Name    
110101      Imprest        
110102      abs        
110104      abs - Call  
110105      abc-MANAGED 
110109      bda - Dollar    
110201      jhk - Dollar    

Лист 2

AccountNo   Account Name    
110101      Imprest        
110102      abs
110103      bas 
110104      abs - Call  
110105      abc-MANAGED 
110109      bda - Dollar    
110201      jhk - Dollar    

Я хочу сравнить строку столбца AccountNo, чтобы узнать новый accountNo, который был добавлен в sheet2, но нев листе 1. Если AccountNO найден, я хочу вставить его в sheet1, и он должен быть вставлен в лучшую позицию на sheet1, потому что номера счетов расположены последовательно. Примером является учетная запись 110103 НЕТ, я хочу вставить всю строку после 110102 № счета в листе 1.

Dim rngCell As Range
Dim matchRow
For Each rngCell In Worksheets("Sheet2").Range("A2:A200")
    If WorksheetFunction.CountIf(Worksheets("Sheet1").Range("A2:A200"), rngCell) = 0 Then
        ' Range("K" & Rows.Count).End(xlUp).Offset(1) = rngCell
        matchRow = rngCell.Row
        Rows(matchRow & ":" & matchRow).Select
        rngCell.EntireRow.Copy
        Range("K" & Rows.Count).PasteSpecial xlPasteValues
    End If
Next

Код, похоже, не помогает. только в состоянии идентифицировать новые учетные записи.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Если номера счетов на обоих листах на самом деле в порядке, вам не нужно использовать CountIf. Вы можете просто перебрать строки Sheet2 и сравнить их номер счета с номерами счетов в Sheet1 в той же позиции. Затем вы вставляете строку в эту позицию, если не нашли совпадения в Sheet1.

Попробуйте что-то вроде этого:

Sub Test()
    Dim sourceCell As Range, targetCell As Range
    Dim i As Integer
    For i = 2 To 200
        Set sourceCell = Worksheets("Sheet2").Range("A" & i)
        Set targetCell = Worksheets("Sheet1").Range("A" & i)
        If targetCell.Value <> sourceCell.Value Then
            sourceCell.EntireRow.Copy
            targetCell.EntireRow.Insert
            targetCell.Offset(-1, 0).EntireRow.PasteSpecial xlPasteValues
        End If
    Next
End Sub

Примечание: Этопредполагается, что вы не хотите перезаписывать существующие значения в Sheet1, в противном случае вы можете просто скопировать все строки Sheet2 и вставить их в Sheet1. Например:

Worksheets("Sheet2").Range("A1:B200").Copy
Worksheets("Sheet1").Range("A1:B200").PasteSpecial xlPasteValues
0 голосов
/ 30 октября 2019

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

Sub match()
Dim rngCell As Range
Dim matchRow As Integer, nextcol As Integer

For Each rngCell In Worksheets("Sheet2").Range("A2:A200")
    If rngCell <> "" Then
        If WorksheetFunction.CountIf(Worksheets("Sheet1").Range("A2:A200"), rngCell) = 0 Then
            Sheet2.Range(Sheet2.Cells(rngCell.Row, 1), Sheet2.Cells(rngCell.Row, Columns.Count).End(xlToLeft)).Copy
            Sheet1.Range("A" & rngCell.Row).Insert
            End If
    End If
Next
End Sub

Примечание. Я добавил счетчик столбцов в количество копий, это не позволяет вамкопирование всей строки, что может ускорить ваш код, если у вас много обращений.

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