2017-03-15 3 views
0

는 아래의 코드는 열 머리글과 셀 값에 따라 여러 행을 제거엑셀 VBA

  1. 에 수정 될 수 있을까 열 머리글을 바탕으로 전체 행을 삭제하는 매크로 및
  2. 여러 열이 작업을 수행 행 조합?

예 : 열 "상태"값 "완료" 주기의 모든 시트를 통해 상태와 상태가있는 전체가 모든 행을 삭제 말합니다 어떤 헤더를 찾아?

Sub Delete_Rows_Based_On_Header_and_Value() 
' 
' Delete_Rows_Based_On_Header_and_Value Macro 
' 
' Declaration 
Dim a as long 
Dim w as long 
Dim vDELCOLs as variant 
Dim vCOLNDX as variant 
Dim vDELROWs as variant 
Dim vROWNDX as variant 

vDELCOLs = array("status","Status Name","Status Processes") 
vDELROWs = array("Complete","Completed","Done") 

with Activeworkbook 
    for w=1 to .worksheets.count 
     with worksheets(w) 
' I know this part is to delete columns based on the column name and I am not sure how to modify it to just check column name then delete row based on the value on that column only. 
      for a=lbound(vdelcols) to ubound(vdelcols) 
       vcolndx=application.match(vdelcols(a), .rows(1), 0) 
       if not iserror(vcolndx) then 
        .columns(vcolndx).entirecolumn.delete 
       end if 
      next a 
     end with 
    next w 
end with 
+1

을 반복하는 것보다 효율적이다, 당신은 결정해야합니다 또는 상태 이름 열에 "완료 됨"이 포함되어 있거나 상태 프로세스 열에 "완료"가 포함되어 있거나 상태 열에 "완료"가 포함되어 있고 상태 이름 열에 "완료 됨"이 있고 상태 프로세스 열에 "완료"가 있습니다. – YowE3K

+0

그래서 1 개의 컬럼 이름과 1 개의 셀 값에 대해 이렇게하는 것이 더 쉬울 것입니다 : Status와 Status Name을위한 다른 라인을 완성하고 완료하고 세 번째 라인을 status process로 완료하고 올바르게 했습니까? 그래서 코드와 프로세스를 단순화 할 수 있을까요? –

+0

하나의 값에 대해 ** 약간 더 간단하게 ** 모든 값을 일치시킬 것인지 또는 일치시킬 값을 원하는지 생각하지 않아도됩니다. 그러나 그 값에 대해 하나의 열을 확인하고자한다면 ** ** ** ** 값이 일치하면 행을 삭제하기로 결정했습니다. – YowE3K

답변

1

다음 코드 vDELROWS 같은 배열의 배열을 취할 것이며, 임의의 값이 대응하는 컬럼에있는 것과 일치하는 경우 행을 삭제한다. (가) 상태 열이 "완료"를 포함하는 경우 행을 삭제하려면

Sub Delete_Rows_Based_On_Header_and_Value() 
    ' 
    ' Delete_Rows_Based_On_Header_and_Value Macro 
    ' 
    ' Declaration 
    Dim a As Long 
    Dim w As Long 
    Dim vDELCOLs As Variant 
    Dim vCOLNDX As Variant 
    Dim vDELROWs As Variant 
    Dim vROWNDX As Variant 
    Dim r As Long 
    Dim v As Long 

    vDELCOLs = Array("status", "Status Name", "Status Processes") 
    vDELROWs = Array(Array("Complete", "Pending"), Array("Completed", "Pending"), Array("Done")) 

    With ActiveWorkbook 
     For w = 1 To .Worksheets.Count 
      With Worksheets(w) 
       For a = LBound(vDELCOLs) To UBound(vDELCOLs) 
        vCOLNDX = Application.Match(vDELCOLs(a), .Rows(1), 0) 
        If Not IsError(vCOLNDX) Then 
         For r = .Cells(.Rows.Count, vCOLNDX).End(xlUp).Row To 1 Step -1 
          For v = LBound(vDELROWs(a)) To UBound(vDELROWs(a)) 
           If .Cells(r, vCOLNDX).Value = vDELROWs(a)(v) Then 
            .Rows(r).EntireRow.Delete 
            Exit For 
           End If 
          Next 
         Next 
        End If 
       Next a 
      End With 
     Next w 
    End With 
End Sub 
+0

안녕하세요, 지금 당장은 제게 위의 내용을 잘 이해하고 있는지 확인하십시오. "상태 - 완료 됨"상태 - 보류 중 상태 - 완료 됨 "상태 - 완료 됨 "상태 이름 - 완료 됨" "상태 이름 - 완료 됨" "상태 - 완료 됨"AND "상태 프로세스 - 완료 됨" "상태 프로세스 - 보류 중" "상태 프로세스 - 완료 됨" "상태 프로세스 - 완료 됨" 그게 맞습니까? –

+0

아니요, "상태"열을 먼저 처리하고 "전체"또는 "보류 중"(배열 ("완료", "보류 중") 때문에) 행을 삭제 한 다음 " Status Name "열을 제거하고"Completed "또는"Pending "(Array ("Completed ","Pending ") 때문에)을 포함하는 행을 삭제하면"Status Processes "열로 이동하여 done ('Array ("Done") 때문에). 그래서'vDELROWS' 배열 내의 각각의'Array (...) '는'vDELCOLS' 배열의 같은 열에 해당합니다. – YowE3K

+0

이 맞습니다! 그리고 그것은 완벽합니다. –

0

자동 필터는 더 이상 코드를 작성하기 전에

Sub DeleteRows() 
    Sheet1.Range("a1:c35").AutoFilter Field:=2, Criteria1:="Completed" 
    Sheet1.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete 
Sheet1.UsedRange.AutoFilter 
'repeat for each value 
End Sub