2012-08-17 3 views
1

나는 열 A와 열 B에 자녀 이름의 2 열을 가지고 있습니다. 그들은 함께 일한 자녀 쌍을 나타냅니다.Excel VBA를 사용하여 2 개의 열에서 1 개의 조건을 필터링하려면 어떻게합니까?

"Bob"이 다른 아이와 함께 작업 한 모든 행을 필터링하려고합니다. 그래서 하나의 기준 (Bob)이 Column A 또는 Column B 중 하나에 나타나는 모든 행을 필터링하려고합니다.

이 행 또는 키 쌍을 배열에 넣으 려합니다. 어떻게해야합니까?

+0

내 첫번째 제안은 OR 식 열 중 하나의 "밥"을 검사하고 필터링 헬퍼 열을 생성하는 것 그 열. 아니면 내 답장을 이전 게시물에 사용하고 Union의 두 범위를 함께 사용할 수도 있습니다. –

+0

시트와 헬퍼 컬럼을 기준으로 사용하여 원하는 것을 얻는 방법을 알고 있습니다. 하지만 그건 내가하려는 일이 아니야. Excel 시트를 전혀 사용하지 않고 JUST VBA 코드를 사용하는 것을 피하고 싶습니다. 이것이 가능한가? – phan

+0

@Doug Glancy ... Union의 2 가지 범위에 관한 이전 게시물에 대한 링크가 있습니까? 나는 그 소식을 못 찾는다. – phan

답변

3

나는 Union of Ranges에서 Doug의 대답을 보지 못했습니다. 그러나 여기에 예제가 있습니다. 범위를 루핑하는 대신 Autofilter을 사용합니다. 코드를 주석으로 처리하여 문제를 이해하지 않아야합니다.

CODE

Sub Sample() 
    Dim ws As Worksheet 
    Dim rng As Range, rngA As Range, rngB As Range 
    Dim Lrow As Long 

    Set ws = Sheets("Sheet1") 

    With ws 
     '~~> Get last row of Col A 
     Lrow = .Range("A" & .Rows.Count).End(xlUp).Row 

     '~~> Identify the range 
     Set rng = .Range("A1:B" & Lrow) 

     .AutoFilterMode = False 

     '~~> Identify the range in Col A Which has BOB 
     With rng 
      .AutoFilter Field:=1, Criteria1:="Bob" 
      Set rngA = .Offset(1, 0).SpecialCells(xlCellTypeVisible) 
     End With 

     .AutoFilterMode = False 

     '~~> Identify the range in Col B Which has BOB 
     With rng 
      .AutoFilter Field:=2, Criteria1:="Bob" 
      Set rngB = .Offset(1, 0).SpecialCells(xlCellTypeVisible) 
     End With 

     .AutoFilterMode = False 

     '~~> Hide All except the Header row 
     rng.Offset(1, 0).EntireRow.Hidden = True 
     '~~> Unhide the rows which have Bob 
     Union(rngA, rngB).EntireRow.Hidden = False 
    End With 
End Sub 

SCREENSHOT

enter image description here

+0

자세한 도움을 가져 주셔서 감사합니다! – phan

1

다음 코드를 시도해보십시오. 스크래치 패드 시트를 만들고, 두 열에 Bob이있는 행을 복사하고 결과에서 배열을 만든 다음 스크래치 패드를 삭제합니다.

Sub GetBobRows() 
    Dim src As Worksheet 
    Dim tgt As Worksheet 
    Dim rng As Range 
    Dim cell As Range 
    Dim lastRow As Long 
    Dim bobCount As Long 
    Dim bobRow As Long 

    Set src = ActiveSheet 
    Sheets.Add 
    ActiveSheet.Name = "Scratchpad" 
    Set tgt = ActiveSheet 

    ' assumes two columns with Bob data are A and B and start in row 1 
    ' of the activesheet 
    lastRow = src.Range("A" & src.Rows.Count).End(xlUp).Row 

    Set rng = src.Range("A1:A" & lastRow) 
    bobCount = 1 

    For Each cell In rng 
     If cell.Value = "Bob" Or cell.Offset(, 1).Value = "Bob" Then 
      bobRow = cell.Row 
      tgt.Range("A" & bobCount & ":B" & bobCount).Value = _ 
       src.Range("A" & bobRow & ":B" & bobRow).Value 
      bobCount = bobCount + 1 
     End If 
    Next 
    Call CreateBobArray(tgt) 
    DeleteScratchpad 
End Sub 

Sub CreateBobArray(tgt As Worksheet) 
    Dim vaBobs As Variant 
    Dim lRow As Long 

    lRow = tgt.Range("A" & tgt.Rows.Count).End(xlUp).Row 

    'Read the data from the scratch pad into the bob array 
    vaBobs = tgt.Range("A1:B" & lRow).Value 
End Sub 

Sub DeleteScratchpad() 
    Application.DisplayAlerts = False 
     Sheets("Scratchpad").Delete 
    Application.DisplayAlerts = True 
End Sub 
관련 문제