728x90

목차

 

 

엑셀 VBA를 작성하다보면 이 결과물이 어디에 쓰일지 다 예상 못할 수도 있습니다.

중요한 것은 DATA의 수와 끝을 파악하는 것이고요.

VAB에서 많이 사용하는 내용의 끝을 파악하는 방법에 대해서 알아 보겠습니다.

 

※ 엑셀 인터페이스에서 쓰는 Find 함수와 VBA에서 사용하는 Find 매소드는 별개임을 알려드립니다.

 

 

 

① B 행에서 내용이 있는 마지막 셀 찾기

 

find를 사용할 껀데 먼저 코드를 보도록 하겠습니다.

 

Sub FindLastColumn()

    Dim ws As Worksheet
    Dim lastCell As Range
    
    Set ws = ThisWorkbook.Sheets("Sheet5")
    
    'find를 사용해서 마지막 값을 찾음
    Set lastCell = ws.Columns("B").Find(What:="*", _
                                        After:=ws.Range("B1"), _
                                        LookIn:=xlFormulas, _
                                        LookAt:=xlPart, _
                                        SearchOrder:=xlByRows, _
                                        SearchDirection:=xlPrevious)
    
    If Not lastCell Is Nothing Then
        MsgBox "B행의 마지막 데이터는 " & lastCell.Address & "에 있습니다."
    Else
        MsgBox "B행에 데이터가 없습니다."
    End If
End Sub

 

Find의 사용법은 위 코드를 보면 알 수 있고 각 매개변수에 대해서 설명하겠습니다.

 

  • What : 찾을 값으로 * 을 사용하였음으로 "모든 값"을 검색합니다.
  • After : 검색을 시작할 위치입니다. 여기서 부터라고 보면 됩니다.
  • LookIn : 검색할 기준입니다. 이 경우에는 수식으로 검색하는 것이 좋습니다.
        - xlFormulas : 수식을 기준으로 검색하는데 수식의 결과가 아닌, 수식 자체를 검색합니다. 
        - xlValues : 값을 검색합니다. 이 경우에는 수식의 결과를 기준으로 검색합니다.
        - xlComments : 셀에 추가된 주석을 검색합니다.
        - xlCommentsThreaded : Threaded Comments라는 Office365 버전부터 추가된 새로운 주석을 검색합니다.
  • LookAt : (xlPart : 부분일치), (xlWhole : 전체일치)중 하나를 선택합니다.
  • SearchOrder : 검색하는 영역입니다. (xlByRows : 행 기준), (xlByColumns : 열기준)
  • SearchDirection : 검색하는 방향입니다. (xlNext : 앞에서 뒤로), (xlPrevious : 뒤에서 앞으로)
  • (MatchCase) : 검색할 때 대소문자를 구별할지 선택합니다. 디폴트는 False(구별 안함)입니다.
  • (MatchByte) : 더블 바이트 언어를 설치했을 때 사용합니다.
        - True : 더블 바이트 문자가 정확하게 더블 바이트와 일치할 경우만 검색
        - False : 더블 바이트 문자가 싱글 바이트와 일치해도 검색함
  • (SearchFormat) : 검색 형식입니다.

 

즉 위의 코드는 ws.Columns("B") 로 범위를 제한해서,

B1부터 시작하여 해당 행(xlByRows)에서 뒤에서 앞으로(xlPrevious) 검색하여 처음 만나는 값의 위치를 찾습니다.

 

 

 

 

② 셀에서 마지막 범위 찾기

 

거의 같습니다. 똑같이 Find를 사용합니다.

 

Sub FindLastCell()
    Dim ws As Worksheet
    Dim lastCell As Range
    
    Set ws = ThisWorkbook.Sheets("Sheet5")
    
    ' 마지막 데이터를 찾음
    Set lastCell = ws.Cells.Find(What:="*", _
                                 After:=ws.Cells(1, 1), _
                                 LookIn:=xlFormulas, _
                                 LookAt:=xlPart, _
                                 SearchOrder:=xlByRows, _
                                 SearchDirection:=xlPrevious)
    
    If Not lastCell Is Nothing Then
        MsgBox "워크시트의 마지막 데이터는 " & lastCell.Address & "에 있습니다."
    Else
        MsgBox "워크시트에 데이터가 없습니다."
    End If
End Sub

 

 

처음나온 코드에서 범위를 행으로 제한했던 ws.Columns("B")를 전체 대상의 ws.Cells로 변경한 것입니다.

SearchOrder는 "xlByRows"로 하면 가장 아래 값을 끝으로 "xlByColumns"를 하면 가장 오른쪽에 있는 셀을 선택합니다.

 

 

 

 

③ 처음부터 끝까지 선택하기

 

이제 응용편입니다.

끝의 셀을 선택한다면 처음셀로 찾을 수 있죠.

두 셀을 찾아서 전체 선택을 하는 코드입니다.

이 것 역시 간간히 쓰는데, 그때그때 작성하려니 실수가 많아 오늘 기회로 정리합니다.

 

Sub SelectallContentCell()
    Dim ws As Worksheet
    Dim firstCell As Range
    Dim dataRange As Range
    
    Set ws = ThisWorkbook.Sheets("Sheet5")
    
    ' 처음 셀 찾기
    Set firstCell = ws.Cells.Find(What:="*", _
                                  After:=ws.Cells(1, 1), _
                                  LookIn:=xlFormulas, _
                                  LookAt:=xlPart, _
                                  SearchOrder:=xlByRows, _
                                  SearchDirection:=xlNext)
    
    ' 마지막 셀 찾기
    Set lastCell = ws.Cells.Find(What:="*", _
                                 After:=ws.Cells(1, 1), _
                                 LookIn:=xlFormulas, _
                                 LookAt:=xlPart, _
                                 SearchOrder:=xlByRows, _
                                 SearchDirection:=xlPrevious)
            
        Set dataRange = ws.Range(firstCell, lastCell)
        dataRange.Select
    
    If Not firstCell Is Nothing Then
        MsgBox "선택된 범위는 " & dataRange.Address
    Else
        MsgBox "워크시트에 데이터가 없습니다."
    End If
End Sub

 


결과입니다.

셀도 선택을 잘하고 매세지도 잘 출력됩니다.

 

 

반응형

+ Recent posts