나는 귀하의 요구 사항을 오해하지 않았 음을 희망하므로 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
희망 사항이 도움이됩니다.
어떤 종류의 워크 시트입니까? [CSV] (http://en.wikipedia.org/wiki/Comma-separated_values) 또는 스프레드 시트? – Wilf
감사합니다. 이것은 스프레드 시트입니다. – user3353004