2017-12-19 1 views
0

私がしようとしているのは、2つの異なるシートを見て、国民保険番号を比較することです。2枚のシートを比較し、行の特定の列をコピーする場合は、VBAを使用してください。

シート1は1つのシステムからのデータのセットであり、シート2は別のシステムからの別のデータのセットです。私がしたいのは、最初に、各シートのcolumn1のエントリが同じで、これが同じ人物になると、その人に固有のidを含む両方のシートのカラム1を比較します。次に

私がしたいことは、シート1の列1の右側に17列、シート2の右側に23列(両方が国家保険番号である)に格納されている値を比較することです。

異なる場合にのみ、シート1(番号、名および姓)からの行の最初の3つの列と、両方のシート(国民保険番号)のコピーをコピーしたいとします(Sheet1(0,17)Sheet2 、23)to Sheet3。

これは私がしようとしているのは、論理が全部行をコピーするようにしようとしています。私が望むセルだけをコピーするように変更することはできますが、 .....

Sub compareData() 
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet 
    Dim i As Long, j As Long 
    Dim newSheetPos As Integer 

    Set ws1 = ActiveWorkbook.Sheets("Sheet1") 
    Set ws2 = ActiveWorkbook.Sheets("Sheet2") 
    Set ws3 = ActiveWorkbook.Sheets("Sheet3") 

    newSheetPos = ws3.Cells(ws3.Rows.Count, 2).End(xlUp).Row 

    For i = 1 To ws1.Cells(ws1.Rows.Count, 2).End(xlUp).Row 
     For j = 1 To ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row 
      If ws1.Cells(i, 1).Value = ws2.Cells(j, 1).Value Then 
       If ws1.Cells(i, 17).Value <> ws2.Cells(j, 23).Value Then 
        ws1.Cells(j, 1).EntireRow.Copy ws3.Cells(newSheetPos, 1) 
        newSheetPos = newSheetPos + 1 
       Else 
       End If 
      Else 
      End If 
     Next j 
    Next i 
End Sub 
+0

は、両方のシートは保存あなたは確認しています下記参照してください、私は1によって相殺された基準をインクリメントしなければならなかった1及びません0から始まることに気づきました同じフォーマットのNI番号?これにより、IF文が常に偽となり、ほとんどの行がコピーされる可能性があります。 – Xabier

+0

はい、同じフォーマットの2xUpperCase 6 Numbersと1 UpperCaseです。これが私の望むものです。 両方のシートの列1の一致を見つけ、行17列のシート1,2,3を横切って見てください。セルが一致しない場合は、シート1の不一致行の最初の3列と国民保険両方から。 。それはこのようになります Col1(ID)、Col2(名)、Col3(姓)、Col4(NINO)、Col5(NINO2)最初の4列はSheet1からで、5列目はSheet2からです – Leighholling

+0

あなたのコードは大丈夫だと思われるので、ここでプレイしてください。すべての比較のフォーマットが同じであることをもう一度確認してください。セルに表示される方法を意味するのではなく、そのセルのフォーマット。テキスト、一般、カスタム...いくつかのサンプルデータを共有できますか?いくつかのダミーデータを使って簡単なテストをしましたが、期待どおりに動作します。 – Xabier

答えて

0

が同様の問題に実行したので、私はTrim(), UCase().Value2を使用していることを発見しましたプロパティは、書式設定やテキストの大文字小文字の違いによって生じる多くの不一致を排除します。 Trim()と.Value2を使用すると、コードはこのようになります。

If Trim(ws1.Cells(i, 1).Value2) = Trim(ws2.Cells(j, 1).Value2) Then 
    If Trim(ws1.Cells(i, 17).Value2) <> Trim(ws2.Cells(j, 23).Value2) Then 
     ws1.Cells(j, 1).EntireRow.Copy ws3.Cells(newSheetPos, 1) 
     newSheetPos = newSheetPos + 1 
    Else 
    End If 
End If 

セルに格納された値が.Text.Value又は.Value2で参照することができます。 Value2は、書式設定なしで基本値を提供します。 TEXT vs VALUE vs VALUE2は優れた説明を提供する記事へのリンクです。

+0

私はこれを実行しますが、すべてのセルは一般的な形式になります – Leighholling

+0

何もコピーしていないかのいずれかが動作しません – Leighholling

0

こんにちは、私は今、これをソートしている、私はオフセットとしては

Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet 
    Dim i As Long, j As Long 
    Dim newSheetPos As Integer 

    Set ws1 = ActiveWorkbook.Sheets("Sheet1") 
    Set ws2 = ActiveWorkbook.Sheets("Sheet2") 
    Set ws3 = ActiveWorkbook.Sheets("NINO Differences") 

    newSheetPos = ws3.Cells(ws3.Rows.Count, 2).End(xlUp).Row 

    For i = 1 To ws1.Cells(ws1.Rows.Count, 2).End(xlUp).Row 
     For j = 1 To ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row 

      If Trim(ws1.Cells(i, 1).Value2) = Trim(ws2.Cells(j, 1).Value2) Then 

       If Trim(ws1.Cells(i, 17).Value2) <> Trim(ws2.Cells(j, 24).Value2) Then 
        ws1.Cells(j, 1).EntireRow.Copy ws3.Cells(newSheetPos, 1) 
        newSheetPos = newSheetPos + 1 
       Else 
       End If 
      Else 
      End If 

     Next j 
    Next i 
+0

誰かがこのループをスピードアップする方法を考えることができます.Imは条件を変更してこれを18回実行して別のシートを設定する必要がありますか?おそらくRAMに解析する? – Leighholling

関連する問題