Excel - VBA

[VBA] 선택한 행/열 강조하기

EGTools 2023. 11. 25. 13:55

매우 큰 표에서 선택된 셀의 열제목이나 행제목을 쉽게 볼 수 있도록 십자 형태로 셀 색을 바꾸어 줄 수 있습니다.

이미 사용자가 셀에 바탕색을 입력했을 수도 있으므로 이 것을 훼손하지 않고 작업하려면 

조건부 서식을 이용해서 선택된 경우에만 표시가 되고, 그렇지 않은 경우에는 원래의 색이 표시되도록 합니다.

 

주의할 점은 이 기능을 사용하면 모든 선택 변경시마다 "매크로가 실행" 되므로

Excel의 "되돌리기(Undo)" 기능은 작동하지 않게 됩니다.

 

우선 아래와 같이 이름 관리자에서 "MyRange"나 원하는 이름으로 아무 셀이나 참조대상으로 설정합니다.
주의할 점은 처음 지정하는 "MyRange"이름의 범위(S)에 반드시 "통합 문서"로 지정해야합니다.

처음 지정에 'Sheet1'같이 특정 시트를 지정하면 시트 복사할 때 정상적으로 작동하지 않습니다.

 

 

마우스나 키보드로 선택이 바뀔 때마다 실행되는 이벤트인 "SelectionChange" 를 아래와 같이 작성합니다.

ApplyAddress에는 해당 매크로가 적용될 범위위 주소를 지정합니다.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = False
    Dim ApplyAddress As String: ApplyAddress = "C4:AH104"
    ''// 먼저 이름관리자에서 "MyRange"를 만들어 둡니다.
    ''// 실제 선택이 변경되면 매번 "MyRange"의 대상 영역을 변경
    With ActiveWorkbook.Names("MyRange")
        If TypeName(Target) = "Range" And Not Intersect(Target, Range(ApplyAddress)) Is Nothing Then
            .RefersTo = "='" & Target.Parent.Name & "'!" & Target.Address
        Else
            .RefersTo = "='" & Target.Parent.Name & "'!" & Cells(Rows.Count, Columns.Count).Address
        End If
    End With
    Application.ScreenUpdating = True
End Sub

 

 

혹시 시트 복사를 하면 같은 이름으로 여러개의 이름이 존재하게 되는데, 이름이 같아서 적용이 잘 못 되거나 오류가 날 수 있을 것으로 예상해서 시험해 봤는데, 위처럼 단순하게 해도 문제가 되지 않았습니다. 

시트를 복사하면 이름도 동일한 이름으로 복사됨

 

실제로 'Sheet1 (3)'에서 매크로가 실행되면 아래처럼 정확히 해당 시트의 "MyRange"가 적용이 됩니다.

매크로가 실행된 시트의 이름에 정확히 적용이 됨

 

이제 적용할 범위를 선택하고 조건부 서식을 설정합니다.

 

선택한 셀을 기준으로 가로/세로 한 줄씩만 선택한다면 조건부 서식에서 수식을 아래와 같이 입력합니다.

=OR(ROW() = ROW(MyRange), COLUMN() = COLUMN(MyRange))

 

 

여러 셀을 선택하고, 선택된 셀들을 기준으로 가로/세로 모두 표시하고 싶다면 아래와 같이 수식을 입력합니다.

=OR(AND( ROW() >= SMALL(INDEX(ROW(MyRange),),1), ROW() <= LARGE(INDEX(ROW(MyRange),),1)), AND(COLUMN() >= SMALL(INDEX(COLUMN(MyRange),),1), COLUMN() <= LARGE(INDEX(COLUMN(MyRange),),1) ))

 

 

혹시 선택한 영역만 더 강조하려면 아래 수식을 사용합니다.

=AND( ROW() >= SMALL(INDEX(ROW(MyRange),),1), ROW() <= LARGE(INDEX(ROW(MyRange),),1), COLUMN() >= SMALL(INDEX(COLUMN(MyRange),),1), COLUMN() <= LARGE(INDEX(COLUMN(MyRange),),1) )

 

 

선택범위행열강조하기.xlsm
0.06MB