※ 엑셀 인터페이스에서 쓰는 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)
IfNot lastCell IsNothingThen
MsgBox "B행의 마지막 데이터는 " & lastCell.Address & "에 있습니다."Else
MsgBox "B행에 데이터가 없습니다."EndIfEndSub
Find의 사용법은 위 코드를 보면 알 수 있고 각 매개변수에 대해서 설명하겠습니다.
What : 찾을 값으로 * 을 사용하였음으로 "모든 값"을 검색합니다.
After : 검색을 시작할 위치입니다. 여기서 부터라고 보면 됩니다.
LookIn : 검색할 기준입니다. 이 경우에는 수식으로 검색하는 것이 좋습니다. - xlFormulas : 수식을 기준으로 검색하는데 수식의 결과가 아닌, 수식 자체를 검색합니다. - xlValues : 값을 검색합니다. 이 경우에는 수식의 결과를 기준으로 검색합니다. - xlComments : 셀에 추가된 주석을 검색합니다. - xlCommentsThreaded : Threaded Comments라는 Office365 버전부터 추가된 새로운 주석을 검색합니다.
LookAt : (xlPart : 부분일치), (xlWhole : 전체일치)중 하나를 선택합니다.
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)
IfNot lastCell IsNothingThen
MsgBox "워크시트의 마지막 데이터는 " & lastCell.Address & "에 있습니다."Else
MsgBox "워크시트에 데이터가 없습니다."EndIfEndSub
처음나온 코드에서 범위를 행으로 제한했던 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.SelectIfNot firstCell IsNothingThen
MsgBox "선택된 범위는 " & dataRange.Address
Else
MsgBox "워크시트에 데이터가 없습니다."EndIfEndSub
엑셀에서는 그럴 때 사용하도록 Ctrl + 방향키(←,→,↑,↓)를 눌러서 끝에서 끝까지 이동할 수 있습니다.
무슨 게임하는 것 같아서 처음에는 익숙해지지 않았을 때는 마우스에 많이 의존하지만,
일단 적응되면 손에서 놓을 수가 없습니다.
1. 끝으로 이동하기
Ctrl + 방향키로 움직이기
VBA에서도 이 기능을 수행하는 명령어가 있습니다.
xlDown : 시작 위치에서 아래방향으로 데이터가 끝나는 셀로 바로 이동합니다.
xlUp : 시작 위치에서 위 방향으로 데이터가 끝나는 셀로 바로 이동합니다.
xltoRight : 시작 위치에서 오른쪽 방향으로 데이터가 끝나는 셀로 바로 이동합니다.
xltoLeft : 시작 위치에서 왼쪽 방향으로 데이터가 끝나는 셀로 바로 이동합니다.
시작 위치가 데이터가 없는 빈 셀일 경우에는 반대로 처음 데이터가 있는 셀로 이동합니다.
빈 셀인 경우 그 방향에 데이터가 하나도 없으면 끝까지 이동합니다.
사용하는 방법은 아래와 같습니다.
간단함으로 모두 묶어서 하나의 소스에 담아서 설명하겠습니다.
Sub MoveCell()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Range("B28").End(xlDown).Select'아래 방향으로
ws.Range("B28").End(xlUp).Select'위 방향으로
ws.Range("B28").End(xltoRight).Select'오른쪽 방향
ws.Range("B28").End(xltoLeft).Select'왼쪽 방향으로EndSub
보시면 이해될 것이라고 생각합니다.
셀 B28 에서 아래, 위, 오른쪽, 왼쪽으로 이동하는 소스입니다.
2. 끝까지 선택하기
위에 처럼 이동하는 것으로도 편리하지만 전체 선택하기라는 편리한 기능도 있습니다.
일반 엑셀 인터페이스에서는 Ctrl + Shift + 방향키(←,→,↑,↓) 입니다.
이 기능을 수행하는 코드도 설명 드리겠습니다.
범위 선택하기
소스로 따지면 약간 길어지는 합니다.
하지만 어렵지는 않으니 사용해 보면 바로 알 수 있을 것 같습니다.
Sub SelectRange()
Dim ws As Worksheet
Dim dataRange As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
' A1부터 아래 방향으로 데이터가 있는 마지막 셀까지 범위 선택Set dataRange = ws.Range("A1", ws.Range("A1").End(xlDown))
dataRange.Select' A1부터 오른쪽 방향으로 데이터가 있는 마지막 셀까지 범위 선택Set dataRange = ws.Range("A1", ws.Range("A1").End(xlToRight))
dataRange.Select' A1에서 시작해 데이터가 있는 끝까지 범위를 설정Set dataRange = ws.Range("A1", ws.Range("A1").End(xlToRight).End(xlDown))
dataRange.SelectEndSub
굉장히 자주 사용하는 코드로 사용자가 입력해서 계속 길어지는 엑셀에 VBA를 적용할 때 사용하기도 합니다.