3 枚のシートを含む Excel ワークブックを入手しました。シートにはすべて名前のリストが含まれており、ソースが異なるため、すべてのリストが一部重複しています。
シート1を一意のリストにしようとしています。a.シート 2 とシート 3 に存在しない名前のみが含まれるようにします。
データを使用する方向を指摘されました>重複を削除しましたが、これはシート全体ではありませんでした.vbaマクロを使用してこれを行う方法はありますか?
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 3
array
sheet 1
column A
row 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
警告 これらのループは完全ではないことを強調する必要があります: コーディングの一般的なベスト プラクティスは、そのループ内から同じ配列に対して操作を実行している間は、配列をループしないことです。これで私を助けます。