EXCEL - VBA

범위를 지정하는 방법(1) - Application.InputBox

별동산 2025. 2. 20. 08:10
반응형

엑셀 작업할 때 범위를 대상으로 많이 작업을 합니다.

 

작업된 영역을 선택할 때는 CurrentRegion을 사용하고,

기준 열의 맨 아래 줄까지 한 줄씩 작업할 때는 맨 아래줄을 알아내기 위해 Cells(Rows.count, "A").End(XlUp).Row를 사용합니다(여기서는 Rows.Count는 맨 아래 줄의 행 수를 가리킵니다).

 

그리고, 작업 시 범위를 입력받을 때는 Application.InputBox를 사용해 직접 입력을 하도록 하는데,

 예) Application.InputBox("작업 범위를 선택하세요", type:=8)

 

이미 지정된 범위에서 작업할 때는 Selection을 이용하면 됩니다.

하이픈지우기.xlsx
0.01MB

 

 

1. 바꾸기

Ctrl + H키를 누르거나, 

홈 탭 - 편집 그룹에서 '찾기 및 선택' 아래 바꾸기를 누르면

 

찾기 및 바꾸기 대화 상자가 표시되므로

찾을 내용에 -을 입력하고, 바꿀 내용은 빈칸으로 둔 상태로 '모두 바꾸기' 버튼을 눌러 한꺼번에 바꾸거나, '바꾸기'를 눌러 하나씩 바꿀 수 있습니다.

 

모두 바꾸기 버튼을 눌렀더니 "12개 항목이 바뀌었습니다."라는 메시지 창이 표시됩니다.

 

확인 버튼 누르고, 닫기 버튼을 누른 후

 

 

2. Application.InputBox 이용하기

개발 도구 - Visual Basic 명령을 누른 후

하이픈지우기.xlsx가 선택된 상태에서

삽입 - 모듈 메뉴 또는 사용자 정의 폼 등 선택 콤보 상자 버튼을 누른 후 모듈을 클릭합니다.

 

그러면 하이픈지우기.xlsx 아래에 모듈과 그 아래 Module1이 생기고, 오른쪽에 빈 에디터 창이 열립니다.

 

그리고, 아래와 같이 코드를 작성합니다.

Sub 하이픈지우기1()
    Dim wRange As Variant
    Dim c As Range
    
    On Error Resume Next
    
    While wRange.Cells.Count = 0
        Set wRange = Application.InputBox("작업 범위를 선택하세요.", Type:=8)
    
        If IsEmpty(wRange) Then
            End
        Else
            For Each c In wRange
                c = WorksheetFunction.Substitute(c, "-", "")
            Next
        End If
    Wend
End Sub

 

다른 이름으로 저장을 누른 후 파일 형식을 *.xlsm으로 바꾸고 저장합니다.

 

하이픈지우기.xlsm
0.02MB

 

3. 코드 설명

 

(1) 변수 선언

Dim wRange As Variant
Dim c As Range

 

wRange 변수는 범위를 저장하는 변수인데, 취소 버튼을 눌렀을 때는 범위가 아니고 Empty 값을 반환하므로 이것을 처리하기 위해서 Variant로 지정해야 합니다.

 

For Each 반복문에서 사용할 범위 변수명을 c로 지정합니다.

 

(2) 에러일 경우 처리

On Error Resume Next

 

취소 버튼을 누르면 범위가 지정되지 않았으므로

Application.InputBox에서 에러가 발생하는데,

다음 문장으로 처리가 넘어가도록 하는 구문입니다.

 

(3) 반복문

    While wRange.Cells.Count = 0
        ...
    Wend

 

While을 사용해서 조건이 맞는 동안 계속 반복하고 아니면 끝내는 것입니다.

wRange.Cells.Count는 선택된 범위의 셀 개수로 범위가 선택되지 않으면 계속 범위 선택을 요구하도록 하는 것입니다.

 

(4) 취소 버튼 클릭 시 종료

If IsEmpty(wRange) Then
    End

 

취소 버튼을 누르면 Empty값이 반환되므로 Empty값이면 sub 프로세스를 끝내는 것입니다.

 

(5) 범위가 선택되면 하이픈을 공백으로 대체

Else
    For Each c In wRange
        c = WorksheetFunction.Substitute(c, "-", "")
    Next
End If

 

For Each c In wRange : 선택된 범위를 한 셀씩 처리

 

c = WorksheetFunction.Substitute(c, "-", "") :

  ① Substitute 함수는 VBA에서 제공하지 않기 때문에 WorksheetFunction을 앞에 붙여서 엑셀 워크시트의 함수라는 것을 지정해야 합니다.

 

  ② Substitute(c, "-", "")는 하이픈을 공백으로 대체하는 수식입니다.

 

  ③ c = WorksheetFunction.Substitute(c, "-", "") : 하이픈을 공백으로 대체한 값을 c, 다시 말해 처리 중인 셀에 입력하는 것입니다.

 

4. '범위를 선택하지 않고 확인 버튼을 누를 경우'의 해결책

범위를 선택하지 않고 확인 버튼을 누르면 수식 에러가 납니다.

 

 

이때는 Application.InputBox에서 아래와 같이 Default값을 현재 셀로 지정하면 됩니다. 

Set wRange = Application.InputBox("작업 범위를 선택하세요.", Type:=8, Default:=ActiveCell.Address)

 

이때 ActiveCell이라고 하면 안 되고, ActiveCell.Address라고 해야 합니다.

 

그리고, 실행하면 항상 범위가 지정되어 있으므로 확인 버튼을 누르면 현재 셀을 대상으로 작업이 이뤄지고, 아니면 다른 영역을 지정하면 됩니다.

 

수정된 파일은 아래와 같습니다.

하이픈지우기1.xlsm
0.02MB

 

5. 작업 동영상

VB Editor 상태에서 매크로 실행 아이콘을 누르면

현재 셀 주소가 셀 주소 입력 칸에 표시되며, 그대로 누르면 현재 셀의 하이픈을 제거하고,

현재 셀 주소가 선택된 상태에서 다른 셀을 선택하면 그 영역에 대해 작업이 이뤄집니다.

Application.InputBox로 범위를 입력받아 해당 영역의 하이픈을 제거하는 매크로

 

반응형