2017-03-20 1 views
0

여러 열 데이터가 포함 된 8 개의 시트가 있습니다.이 7 개의 시트와 시트 8이 필요하며 시트 8의 ID가 시트 7에 있어야하며 나머지 7 개의 시트는 모두 삭제되어야합니다.Vlookup 참조를 사용하는 다중 시트

코드는 내가 가지고있는 것보다 아래에 있지만 proerly로는 여전히 작동하지 않습니다. 일부 ID는 # N/A 데이터와 함께 표시됩니다.

Sub delete() 

    Dim arr(), msg As String 
    Dim c As Range 
    Dim ws_lrow, ws8_lrow, i As Integer 
    Dim ws As Worksheet 

    ws8_lrow = Sheets("Sheet8").Cells(Rows.Count, 1).End(xlUp).Row 

    ReDim arr(ws8_lrow) 

    For i = 2 To ws8_lrow 
     arr(i - 2) = Sheets("Sheet8").Cells(i, 1).Value 
    Next i 

    For Each ws In ActiveWorkbook.Sheets 
     ws_lrow = ws.Cells(Rows.Count, 2).End(xlUp).Row 

     For Each c In ws.Range("B2:B" & ws_lrow) 
      If IsInArray(c, arr()) = 0 Then 
       msg = msg & "User '" & c & "' from: " & ws.Name & vbCrLf 
       c.EntireRow.delete xlShiftUp 
      End If 
     Next c 
    Next ws 

    MsgBox "The following users have been deleted:" & vbCrLf & msg 

End Sub 

Private Function IsInArray(valToBeFound As Variant, arr As Variant) As Boolean 

    Dim element As Variant 
    On Error GoTo IsInArrayError: 'array is empty 
     For Each element In arr 
      If element = valToBeFound Then 
       IsInArray = True 
       Exit Function 
      End If 
     Next element 
    Exit Function 

IsInArrayError: 
    On Error GoTo 0 
    IsInArray = False 

End Function 

답변

1

당신은 행, 위에서 아래의 범위 반복 할 때 고전적인 실수를 comitting, 그 과정을 통해 행을 삭제합니다. 이런 유형의 상황에서 가장 쉽고 올바른 방법은 아래에서 위로까지 을 반복하는 것입니다. 이 루프는 고정해야합니다

'For Each c In ws.Range("B2:B" & ws_lrow) 
' If IsInArray(c, arr()) = 0 Then 
'  msg = msg & "User '" & c & "' from: " & ws.Name & vbCrLf 
'  c.EntireRow.delete 
' End If 
'Next c 

루프 아래에서 위로 같은 :

For i = ws_lrow to 2 step -1 
    If IsInArray(ws.Range("B" & i).value, arr) = 0 Then 
     msg = msg & "User '" & ws.Range("B" & i).value & "' from: " & ws.Name & vbCrLf 
     ws.Rows(i).delete 
    End If 
Next i