2012-10-23 7 views
0

코드를 온라인에서 찾은 다음 편집하려고합니다. 코드는 VBA에 있으며 매크로 코드가 하나가 아닌 여러 행을 삭제하도록합니다. 다음은 코드입니다.한 번에 여러 행을 삭제하는 Excel 매크로 만들기

Sub findDelete() 
    Dim c As String 
    Dim Rng As Range 

    c = InputBox("FIND WHAT?") 

    Set Rng = Nothing 

    Set Rng = Range("A:A").Find(what:=c, _ 
     After:=Range("A1"), _ 
     LookIn:=xlFormulas, _ 
     lookat:=xlPart, _ 
     SearchOrder:=xlByRows, _ 
     SearchDirection:=xlNext, _ 
     MatchCase:=False) 

    Rng.EntireRow.Delete shift:=xlUp 
End Sub 
+0

BTW에서 'Set Rng = Nothing'은 의미가 없지만 'Rng'가 더 이상 필요하지 않은 경우 서브의 끝에 있어야합니다. –

답변

4

대신 찾기를 사용, 찾기 다중 값과에서 InputBox를 Autofilter을 사용하고 VisibleCells

Sub findDelete() 

Dim c As String, Rng As Range, wks as Worksheet 

c = InputBox("FIND WHAT?") 

Set wks = Sheets(1) '-> change to suit your needs 
Set Rng = wks.Range("A:A").Find(c, After:=Range("A1"), LookIn:=xlFormulas, _ 
          lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
          MatchCase:=False) 

If Not Rng Is Nothing Then 

    With wks 

     .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp)).AutoFilter 1, c 
     Set Rng = Intersect(.UsedRange, .UsedRange.Offset(1), .Range("A:A")).SpecialCells(xlCellTypeVisible) 
     Rng.Offset(1).EntireRow.Delete 

    End With 

End If 

End Sub 

편집

교체하려면/삭제 이렇게 삭제 :

Option Explicit 

Sub FindAndDeleteValues() 

Dim strValues() as String 

strValues() = Split("these,are,my,values",",") 

Dim i as Integer 

For i = LBound(strValues()) to UBound(strValues()) 

    Dim c As String, Rng As Range, wks as Worksheet 
    c = strValues(i) 

    '.... then continue with code as above ... 

Next 

End Sub 
+0

이것은 훌륭했습니다. 고맙습니다. 또한 입력 상자가 아닌 여러 값을 입력하여 확인하고 삭제할 수있는 방법이있을 것입니다. – Jeff

+0

@Jeff -> 네, 그렇게 할 수 있습니다. 'Range ("A1 : A3")'를 사용하여 값을 입력 한 다음 찾기 및 삭제할 값을 통해 코드 루프를 반복 할 수 있습니다. 그것을하는 방법에 집착하는 경우 별도의 문제이므로 S0에 다른 질문을 게시하십시오. (이 코멘트 섹션에 해당 질문에 대한 링크를 게시하고 싶으면 쉽게 찾을 수 있고 필요할 경우 도움을받을 수 있습니다.) –

+0

내가 원하는 것은 입력 상자를 찾기 및 삭제할 여러 값으로 바꾸는 것입니다. 내가 어떻게 그럴 수 있니? – Jeff

1

루프를 While 루프로 마무리하면됩니다.

Sub findDelete() 
    Dim c As String 
    Dim Rng As Range 
    c = InputBox("FIND WHAT?") 
    Set Rng = Nothing 
    Do While Not Range("A:A").Find(what:=c) Is Nothing 
     Set Rng = Range("A:A").Find(what:=c, _ 
     After:=Range("A1"), _ 
     LookIn:=xlFormulas, _ 
     lookat:=xlPart, _ 
     SearchOrder:=xlByRows, _ 
     SearchDirection:=xlNext, _ 
     MatchCase:=False) 
     Rng.EntireRow.Delete shift:=xlUp 
    Loop 
End Sub 
+0

해당 데이터가있는 행이 많으면 불필요한 시간이 오래 걸릴 수 있습니다. 'AutoFilter'는 훨씬 빠르고 깨끗합니다. –

0

너 알레 ady가 Rng.EntireRow.Delete shift:=xlUp에있는 행을 삭제하는 코드가 있으면 삭제하려는 행으로 범위를 설정하는 코드가 필요합니다. VBA에서 평소와 같이,이 방법을 많이 수행 할 수 있습니다

'***** By using the Rng object 
Set Rng = Rows("3:5") 

Rng.EntireRow.Delete shift:=xlUp 

Set Rng = Nothing 

'***** Directly 
Rows("3:5").EntireRow.Delete shift:=xlUp 

귀하의 Find 문은 c의 첫 번째 발생을 발견,이 둘 이상의 행을 삭제하지 왜 그건.

관련 문제