728x90
엑셀 VBA 기본기능 정리 - 선택하기/범위조작(2)
- 범위 선택 : Range / CurrentRegion / UsedRange
- 특정 범위 선택
- 일반 선택 : Range("a1:d10").Select
- 전체 표 선택 : Range("시작셀", Cells(Row.Count, "d"),End(xlUp).Select* 이 경우, 마지막칸이 비어있으면 작동하지 않음
- 특정셀 기준 Ctrl+A 구현 : Range("특정셀").CurrentRegion.Select
- 워크시트 내 모든 데이터 선택(빈공간 제외) : Worksheet(1).UsedRange.Select* CurrentRegion 및 UsedRange 멤버는 반드시 특정 워크시트를 기준으로 해야함.(셀/범위 X) ** CurrentRegion 및 UsedRange의 행값, 열값은 각각 Range("특정셀").CurrentRegion.Rows.Count / Columns.Count를 통하여 확인할 수 있다.(Width/Height는 각 셀별 가로/세로 길이임)
- 범위 선택 후 가공
- 설명: 선택영역을 특정 크기로 변경하는 기능들
- 기본형 : 기준개체.resize(행, 열)
- 주요 주의사항 : Resize의 인수가 비어있는 경우에는 0이 아니라 해당되는 CurrentRegion의 최대값이 자동으로 대입된다. 즉, 아래 예시에서 Resize(,2)는 Resize(rng.Rows.Count, 2)와 같다.* 행을 지정하고, 열을 비우고 싶은 경우에는 Resize(2)의 형태로 사용
- 활용예1 : 첫 셀부터 2열만 선택하기
Dim rng As Range
Set rng = Range("a1").CurrentRegion
rng.Resize(0, 2).Select
- 활용예2 : 제목줄을 제외한 나머지 영역 선택하기
Public Sub SelectAndModify()
Dim rng As Range
Set rng = Range("A1").CurrentRegion 'a1 기준 CurrentRegion을 rng에 삽입
Dim uColumn As Long '정수형 변수 uColumn선언
uColumn = Cells(1, Columns.Count).End(xlToLeft).Column '제목줄의 길이를 uColumn에 삽입
rng.Offset(1, 0).Resize(rng.Rows.Count - 1, userColumn).Select '행값-1, 제목줄 길이'로 조정
End Sub
- 범위 합산 : Union
- 기본형 - Union(범위1, 범위2).Select
- 기능 – 기존의 범위와 새로운 범위를 합산하는 기능 (C++의 A += B와 유사한 구조)
- 주의사항 – 특정 Range변수를 선언하고, 실제 셀로 초기화하지 않은 후(nothing초기화 등) Union에 넣을 경우 에러의 원인이 된다. 따라서, 초기값은 별도로 넣어주어야 한다. 아래 예제에서 번거롭게 2번에 걸쳐서 나눠놓은 이유가 이와 같다.
- 활용예 – 특정 조건을 만족하는 셀만 선택
Dim rng As Range '특정 조건을 만족하는 셀 주소를 저장할 범위 rng 선언
For Each c In Range("A1:A10") '반복문 : 변수 c는 A1:A10을 순회한다.
If c = 4 Or c = 6 Then '조건 : 셀값이 4이거나 6인 경우를 제외한 나머지
Else '4, 6이 아닌 값에 대해서는 다음을 따른다.
If rng Is Nothing Then 'r에 담긴값이 없는 경우, rng에 c를 대입(초기값이 됨)
Set rng = c
Else: Set rng = Union(rng, c) 'rng에 값이 이미 있다면, 기존값과 c값을 결합시킨다.
End If
End If
Next
If rng Is Nothing = False Then rng.Select 'rng가 빈값이 아니라면 rng를 선택한다.
- 교집합 범위 선택 : Intersect
- 기본형 - Intersect(범위1, 범위2, ...).Select
- 주의사항 – 교집합이 없는 경우에는 예외가 발생하므로, On Error GoTo exception 및 'exception : '를 같이 사용해야 한다. 혹은 If Not Intersect(범위1, 범위2) Is nothing Then ~을 이용하기도 한다.
- 이동옵션기능 : SpecialCells
- 기본형 – 기준개체.specialCells(옵션)
- 주의사항 – 해당하는 셀의 종류가 없는 경우에는 예외가 발생하므로, On Error Resume Next 및 On Error GoTo 0를 같이 사용해야 한다.
- 활용예
Public Sub SpecialCellsFx()
Dim rng As Range
Set rng = Selection.CurrentRegion '선택지점을 기준으로 CurrentRegion지정
On Error Resume Next '에러발생시 다음순서 진행
rng.SpecialCells(xlCellTypeBlanks) = "*" '빈셀에 * 삽입
rng.SpecialCells(xlCellTypeFormulas, xlErrors) = "" '에러를 찾아 빈칸 삽입
rng.SpecialCells(xlCellTypeFormulas).Select '수식이 있는 셀만 선택
If Err Then MsgBox "이 워크시트엔 수식이 없음" 'Error에 따른 메시지박스 출력
On Error GoTo 0 'Error발생 기록 초기화
End Sub
- 선택영역의 주소 확인 : Areas
- 기능 : Areas프로퍼티는 모든 선택된 범위에 대하여 주소값을 반환하되(Address와 동일), 배열의 형태로 값을 가져올 수 있으며 For문 등으로 인하여 (Address와 차이).
- 기본형 : 기준개체.Areas(선택순서).Address(0, 0)Address만 넣고 뒤의 (0,0)을 넣지 않으면 표현형이 절대참조로 나온다.
- 활용형 1 – 선택범위의 주소 확인하기
Public Sub identifySelection()
Dim c As Range
Dim str As String
str = ""
Dim adr() '동적배열 adr을 선언한다
Dim i As Long
i = 0
For Each c In Selection.Areas '선택범위를 순회한다
ReDim Preserve adr(i) '동적배열 adr을 재정의한다
adr(i) = c.Address(0, 0) 'adr에 선택범위를 순차적으로 대입한다.
str = str & vbLf & adr(i) 'str에 adr을 순차적으로 누적 대입한다.
i = i + 1
Next
MsgBox (str) '누적된 str을 메시지로 출력한다.
End Sub
- 활용형 2 – 빈칸이 있는 열 선택하여 삭제하기
Public Sub deleteBlankline()
Dim rng As Range
Dim a As Range
Set rng = Range("a1", Cells(Rows.Count, "A").End(xlUp)) 'A1셀을 기준으로 행 개수만큼의 범위선정, 저장(rng)
For Each a In rng.SpecialCells(xlCellTypeBlanks).Areas 'rng내 빈칸선택 및 순회
a.EnteireRow.Delete '빈칸이 속한 열 삭제
End If
Next
End Sub '이 방법은 선택-삭제를 무한히 반복하므로 매우 느리다. 가급적 Union으로 한번에 범위 선택, 조정하는 것을 권장
- 셀병합 해제 : Unmerge
Public Sub 셀병합해제_및_빈칸채우기()
Dim rng As Range
Dim c, r
Set rng = Range("a7", Cells(Rows.Count, "a").End(xlUp)) '범위지정
rng.Select
For Each c In rng
If c.MergeCells Then '합쳐진 셀 여부 판정
If c.MergeArea.Cells(1).Address = c.Address Then '합쳐진 셀의 첫 칸 여부 판정
Set r = c.MergeArea '선택범위를 r에 삽입(개별 범위설정 절차를 없애기 위함)
c.MergeArea.UnMerge 'MergeCell 해제
r.FillDown '(현재 첫 칸이므로 첫 값을)Filldown으로 채우기 핸들링
End If
End If
Next
End Sub
반응형
'컴퓨터 & 코딩 공부 > 엑셀 & VBA' 카테고리의 다른 글
엑셀 VBA 기본기능 정리 - 시트 관련 속성 및 메서드 (0) | 2023.07.05 |
---|---|
엑셀 VBA 기본기능 정리 - 정규표현식 활용 (0) | 2023.07.04 |
엑셀 VBA 기본기능 정리 - 선택하기/범위조작(1) (0) | 2023.07.03 |
엑셀 VBA 기본기능 정리 - VBA 함수, 워크시트함수, 메서드 불러오기 (0) | 2023.07.03 |
엑셀 VBA 기본기능 정리 - 변수·자료형·배열·컬렉션 선언 / 반복문 (0) | 2023.07.02 |