2014-02-25 2 views
0

알았어, 나는 완전히 새로운데, 의심되는 사람을 모욕 한 것에 대해 유감스럽게 생각한다. 그러나 나는 며칠 동안 물건을 수색하고 시도 했으므로 너트를 깨뜨릴 수 없습니다. 나는 원하는 모든 것을 할 수있는 것을 얻을 수없는 것 같습니다.특정 값을 가진 열만 표시하는 방법

여기에 표시됩니다 : 매주 변경되는 값을 가진 워크 시트가 있습니다. 행과 열의 수가 변경됩니다. 그러나 열 A, B 및 C는 항상 날짜, 이름 및 위치 데이터를 가지므로 보존해야합니다. D부터 열의 값에는 숫자 0, 1, 2 또는 3 만 포함됩니다.

두 번째 워크 시트에 열을 복사 한 다음 D 열에서 모든 열을 삭제해야합니다. 2 또는 3을 입력하십시오. 즉, 열 A, B 및 C를 항상 유지해야하며 열에 2 또는 3이 나타나는 경우 열 (및 모든 데이터)을 유지해야합니다.

또는 첫 번째 세 열뿐만 아니라 두 번째 또는 세 번째 열을 선택하여 두 번째 워크 시트에 붙여 넣는 것이 더 빠릅니다. 그러나 나는 Union을 사용하는 것에 대해 읽었습니다. 그것은 이동하는 방법처럼 보이지만 그것은 내 머리 위로가는 길입니다.

미리 감사드립니다.

+0

어떤 종류의 워크 시트입니까? [CSV] (http://en.wikipedia.org/wiki/Comma-separated_values) 또는 스프레드 시트? – Wilf

+0

감사합니다. 이것은 스프레드 시트입니다. – user3353004

답변

0

나는 귀하의 요구 사항을 오해하지 않았 음을 희망하므로 Union의 관련성을 볼 수 없습니다.

첫 번째 작업은 마지막 행과 열을 결정하는 것입니다. 마지막 행이나 열을 찾는 데는 여러 가지 기술이 있습니다. 어느 것도 모든 상황에서 작동하지 않습니다. 이 경우에는 SpecialCells이 가장 적합하다고 생각합니다.

일부 목표를 달성하는 방법이 확실하지 않은 경우 작은 작업으로 나눠서 작업 1을 코딩하고 Debug.Print을 사용하여 진단 정보를 직접 실행 창에 출력합니다. 작업 1이 작동하면 작업 2의 코드를 새로운 진단 정보와 함께 추가합니다. 그래서 내 첫 매크로, Demo1 그냥 마지막 행과 열을 출력합니다. 기존 값 왼쪽이나 아래에 값을 배치하여 매크로가 출력하는 것을 확인하십시오.

참고 : 제가 사용하는 진술에 대해서는 거의 말하지 않습니다. 일반적으로 진술을 찾으면 진술을 쉽게 찾을 수 있습니다. 필요한 경우 질문으로 돌아 오되 먼저 조사를 직접 시도하십시오.

Option Explicit 
Sub Demo1() 

    Dim ColLast As Long 
    Dim RowLast As Long 

    ' Replace "Source" with the name of your worksheet 
    With Worksheets("Source") 

    ColLast = Cells.SpecialCells(xlCellTypeLastCell).Column 
    RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row 

    End With 

    Debug.Print "Last column " & ColLast 
    Debug.Print "Last row " & RowLast 
    ' Note Cells(RowLast, ColLast) does not have to contain a value. 

End Sub 

다음 작업은 삭제할 열을 식별하는 것입니다. 워크 시트 함수 CountIf을 사용하여 열 "D"인 열 4에서 시작하여 각 열의 2와 3의 수를 계산합니다.

Sub Demo2() 

    Dim ColCrnt As Long 
    Dim ColLast As Long 
    Dim Rng As Range 
    Dim RowLast As Long 

    With Worksheets("Source") 

    ColLast = Cells.SpecialCells(xlCellTypeLastCell).Column 
    RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row 

    For ColCrnt = 4 To ColLast 
     Set Rng = .Range(.Cells(1, ColCrnt), .Cells(RowLast, ColCrnt)) 
     Debug.Print ColCrnt; 
     Debug.Print " Num 2s=" & WorksheetFunction.CountIf(Rng, 2); 
     Debug.Print " Num 3s=" & WorksheetFunction.CountIf(Rng, 3) 
    Next 

    End With 

End Sub 

마지막 작업은 2와 3이없는 열을 삭제하는 것입니다. Demo2의 경우 For 루프를 사용했습니다. For-Loop의 문제는 루프 내에서 End Value를 변경할 수 없다는 것이고 우리는 컬럼을 삭제할 때이를 수행해야합니다. 따라서 Demo3의 경우 Do-Loop를 사용해야합니다.

Sub Demo3() 

    Dim ColCrnt As Long 
    Dim ColLast As Long 
    Dim Rng As Range 
    Dim RowLast As Long 

    With Worksheets("Source") 

    ColLast = Cells.SpecialCells(xlCellTypeLastCell).Column 
    RowLast = Cells.SpecialCells(xlCellTypeLastCell).Row 

    ColCrnt = 4 
    Do While ColCrnt <= ColLast 
     Set Rng = .Range(.Cells(1, ColCrnt), .Cells(RowLast, ColCrnt)) 
     If WorksheetFunction.CountIf(Rng, 2) + _ 
     WorksheetFunction.CountIf(Rng, 3) > 0 Then 
     ' This column contains a 2 or a 3. Do not delete column. 
     ' Advance to next column 
     ColCrnt = ColCrnt + 1 
     Else 
     ' This column does not contain a 2 or 3. Delete column. 
     .Columns(ColCrnt).EntireColumn.Delete 
     ' Reduce ColLast to allow for deletion. 
     ColLast = ColLast - 1 
     End If 
    Loop 

    End With 

End Sub 

희망 사항이 도움이됩니다.

+0

안녕하세요, Tony, 코드 주셔서 감사합니다. 완벽하게 작동합니다. 죄송합니다. 응답하는 데 너무 오래 걸렸습니다. – user3353004

관련 문제