EXCEL VBA

엑셀 VBA 엑셀에서 선택된 범위 정보 가져오기

카루루1007 2024. 8. 17. 17:24
728x90
반응형

 들어가며

 

엑셀에서 셀 범위를 선택했을 때

그 범위의 정보에 대해 가지고 오는 코드입니다.

 

범위마우스로 드래그해서 선택하는

연속적인 단 하나의 범위를 말하고,

 

여러 셀을 독립적으로 선택한 것, 

또는 연속되지 않은 여러 범위를 선택한 것은 제외하겠습니다.

728x90

 선택된 범위 정보 가져오기

 

 

현재 엑셀 시트에서 선택된 부분이 있을 경우

선택된 범위를 알려면

아래 코드를 사용하면 됩니다.

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

 

여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.

엑셀 공부하기
VBA 공부하기

728x90
반응형