Daily Life of BlueRose

컴퓨터 & 코딩 공부/엑셀 & VBA

엑셀 VBA 기본기능 정리 - 선택하기/범위조작(2)

푸른로즈 2023. 7. 3. 22:19
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
반응형