-1

3 枚のシートを含む Excel ワークブックを入手しました。シートにはすべて名前のリストが含まれており、ソースが異なるため、すべてのリストが一部重複しています。

シート1を一意のリストにしようとしています。a.シート 2 とシート 3 に存在しない名前のみが含まれるようにします。

データを使用する方向を指摘されました>重複を削除しましたが、これはシート全体ではありませんでした.vbaマクロを使用してこれを行う方法はありますか?

4

1 に答える 1

2

Sheet 1シート 2 と 3 に使用するテーブルの横にいくつかの列を配置することができますVLOOKUP。一致が見つかった場合は 1 を返し、それ以外の場合は 0 を返します
。その後、Excel ルーチンはこれらの 2 つの列をスキャンして1 を探します。行が見つかったら、その行を削除します。

これが私が話している式の例です:

ここに画像の説明を入力

column Dとの和になるBと仮定しCます。

マクロは、列 D を実行して、次の値を探します。>0

ループ内からコレクションに対して操作を実行するベスト プラクティスではありませんが、次のようなものはセルをループして行を削除します。

Option Explicit

Sub deleteRows()

Dim i As Integer
i = 2
Do
    If Cells(i, 4) > 0 Then
        Cells(i, 4).EntireRow.Delete xlUp
    Else
        i = i + 1
    End If
Loop Until IsEmpty(Cells(i, 4)) = True

End Sub

別の方法として、すべての名前sheet 2を. 次に戻ってきて、各名前について配列テストを実行し、それがいずれかの値と等しいかどうか、行全体を削除するかどうかをテストします。したがって、配列を使用するには、次のようになります。これは、各リストが入っていて...で始まると仮定していますsheet 3arraysheet 1column Arow 2

Sub Macro1()

    Dim names() As String
    Dim i As Integer
    i = 1

    'add names from sheet 2 into the array
    Do
        ReDim Preserve names(i)
        names(i) = ThisWorkbook.Worksheets("Sheet2").Cells(i + 1, 1)
        i = i + 1
    Loop Until IsEmpty(ThisWorkbook.Worksheets("Sheet2").Cells(i + 1, 1)) = True

    'add names from sheet 3 into the array
    Do
        ReDim Preserve names(i)
        names(i) = ThisWorkbook.Worksheets("Sheet3").Cells(i + 1, 1)
        i = i + 1
    Loop Until IsEmpty(ThisWorkbook.Worksheets("Sheet3").Cells(i + 1, 1)) = True

    'use the names array to test each row in sheet 1
    Dim j As Integer
    j = 2
    Do

        Dim deleteOccured As Boolean
        deleteOccured = False

        Dim x
        For Each x In names
            If x = Cells(j, 1) Then
                Cells(j, 1).EntireRow.Delete xlUp
                deleteOccured = True
            End If
        Next x

        If deleteOccured = False Then
            j = j + 1
        End If
        deleteOccured = False

    Loop Until IsEmpty(Cells(j, 1)) = True

End Sub

警告 これらのループは完全ではないことを強調する必要があります: コーディングの一般的なベスト プラクティスは、そのループ内から同じ配列に対して操作を実行している間は、配列をループしないことです。これで私を助けます。

于 2012-12-22T13:21:18.167 に答える