들어가며
엑셀에서 셀 범위를 선택했을 때
그 범위의 정보에 대해 가지고 오는 코드입니다.
범위는 마우스로 드래그해서 선택하는
연속적인 단 하나의 범위를 말하고,
여러 셀을 독립적으로 선택한 것,
또는 연속되지 않은 여러 범위를 선택한 것은 제외하겠습니다.
선택된 범위 정보 가져오기
현재 엑셀 시트에서 선택된 부분이 있을 경우
선택된 범위를 알려면
아래 코드를 사용하면 됩니다.
Dim Rng As Range
Set Rng = Application.Selection
위 코드를 사용하면
Rng 변수에 선택된 범위의 셀 정보값이 들어갑니다.
먼저 범위가 제대로 선택이 되었는지 확인을 합니다.
Sub test()
Dim rng As Range
Set rng = Application.Selection
If rng Is Nothing Then
MsgBox "범위가 선택되지 않았습니다."
Else
MsgBox "범위가 선택되었습니다."
End If
End Sub
아래 코드를 통해 rng 변수에 값이 입력되었는지,
즉 셀 범위가 입력이 되었는 지 확인을 합니다.
If rng Is Nothing
하지만 이렇게 코드를 작성했을 경우
하나의 셀만 선택해도 에러 없이 실행이 됩니다.
목적은 범위를 선택하는 것이므로
셀이 하나만 선택되었을 경우에도
범위가 선택이 이루어지지 않은 것으로 판단할 수 있게 하는
코드를 추가합니다.
If rng Is Nothing Or rng.Cells.Count = 1
rng 변수에 값이 없거나, 셀이 하나만 선택되었을 경우에도
범위가 선택되지 않은 것으로 인식하게 바꾸었습니다.
Sub test()
Dim rng As Range
Set rng = Application.Selection
If rng Is Nothing Or rng.Cells.Count = 1 Then
MsgBox "범위가 선택되지 않았습니다."
Else
MsgBox "범위가 선택되었습니다."
End If
End Sub
여기서 문제가 하나 더 발생합니다.
마우스 드래그로 셀을 선택하면
일반적으로 범위가 선택이 되지만,
컨트롤 키를 눌러 셀을 하나씩 선택했을 경우에는
연결되지 않은 셀이 선택이 됩니다.
이럴 경우에도 범위라고 볼 수는 없습니다.
또한 범위가 단일범위가 아닌 두개 이상의 범위가 선택되었을 경우에도
제대로 범위가 선택되지 않은 것으로 간주합니다.
이 부분을 검증하는 코드를 추가 작성합니다.
이때 Range 객체의 Areas 속성을 사용합니다.
이 속성은 비연속적인 영역을 선택했을 때
각 영역을 개별적으로 다룰 수 있게 해 줍니다.
Sub test()
Dim rng As Range
Set rng = Application.Selection
If rng Is Nothing Or rng.Cells.Count = 1 Then
MsgBox "범위가 선택되지 않았습니다."
ElseIf rng.Areas.Count > 1 Then
MsgBox "연속된 범위가 선택되지 않았습니다."
Else
MsgBox "범위가 선택되었습니다."
End If
End Sub
ElseIf rng.Areas.Count > 1 Then
MsgBox "연속된 범위가 선택되지 않았습니다."
하나의 범위가 선택되면
rng.Areas.Count는 1이 됩니다.
개별 셀이 두 개 이상 선택되거나,
범위가 두개 이상 선택되면
rng.Areas.Count는 1 이상이 되어
msgbox가 출력이 됩니다.
마지막으로 범위가 제대로 출력이 되었을 때
선택된 범위가 어디인지 사용자에게 알려주는 코드입니다.
Range 객체의 address 속성을 사용하면
셀 범위의 주소를 알 수 있습니다.
MsgBox rng.Address & "의 범위가 선택되었습니다."
이렇게 하면 절대참조로 표시가 됩니다.
$A$1:$C$1 이런 식으로 말이죠
만약에 표시할 때 $는 표시하고 싶지 않다면
아래와 같이 코드를 작성하면 됩니다.
MsgBox rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) & "의 범위가 선택되었습니다."
RowAbsolute, ColumnAbsolute 는
각각 행과 열에 대한 참조를 표시하는 인수인데
기본적으로는 True이며 절대참조로 표시합니다.
만약 False로 설정을 하면
셀의 주소가 상대참조 형식으로 표시가 됩니다.
최종 코드
Sub test()
Dim rng As Range
Set rng = Application.Selection
If rng Is Nothing Or rng.Cells.Count = 1 Then
MsgBox "범위가 선택되지 않았습니다."
ElseIf rng.Areas.Count > 1 Then
MsgBox "연속된 범위가 선택되지 않았습니다."
Else
MsgBox rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) & "의 범위가 선택되었습니다."
End If
End Sub
여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.
'EXCEL VBA' 카테고리의 다른 글
엑셀 VBA UNIQUE 함수와 유사한 기능을 하는 사용자 정의 함수 만들기 (0) | 2024.08.21 |
---|---|
엑셀 VBA에서 Dictionary 사용하기 (0) | 2024.08.21 |
엑셀 VBA 조건에 맞는 코드 실행 : Select Case 문에 대한 기본 개념 및 사용법 (0) | 2024.08.17 |
엑셀 VBA에서 두 개의 범위가 겹치는 공통 셀 찾기 : Intersect 함수 (0) | 2024.08.16 |
엑셀 VBA Application.Close 와 Application.Quit의 차이 (0) | 2024.08.14 |