본문으로 건너뛰기
엑셀·구글시트 자동화 실험

엑셀·구글시트 자동화 실험No. 120

엑셀 VBA 매크로로 텍스트 앞뒤 공백을 정리하는 방법

기적기획읽는 시간 약 4분

결론부터

반복되는 텍스트 공백 정리는 VBA로 처리할 수 있지만, 처음부터 원본 값을 덮어쓰면 변경 내용을 확인하기 어렵다. 입력 열은 보존하고 옆 열에 결과를 만들면 달라진 값을 비교할 수 있다. 아래 매크로는 사본에서 실행하며, 일반 공백만 정리한다는 범위를 먼저 이해해야 한다.

공백을 지우기 전에 보존할 내용을 정하기

예를 들어 여러 파일에서 모은 분류명 앞뒤에 공백이 붙는 상황을 가정한다. 눈에는 같은 이름처럼 보여도 조회나 분류 작업에서는 다른 값으로 취급될 수 있다. 그렇다고 모든 공백을 없애면 단어 사이의 필요한 간격까지 사라진다.

이번 작업의 범위는 텍스트 앞뒤의 일반 공백 제거다. 문장 내부 공백, 줄바꿈, 탭은 정리 대상에 넣지 않는다. 숫자와 수식도 자동으로 변환하지 않고 확인 대상으로 남긴다.

사본 파일에 정리라는 시트를 준비한다. B열은 입력 전용, C열은 결과 전용으로 사용하고 첫 행에는 열 제목을 둔다. C열의 기존 내용은 실행 시 바뀌므로 비워 둔다. 데이터는 다음 행부터 시작한다.

결과 열에만 기록하는 VBA 코드

데스크톱 엑셀의 Visual Basic 편집기에서 표준 모듈을 추가하고 다음 코드를 넣는다. 코드를 보관할 파일은 매크로 사용 통합 문서 형식으로 저장한다. 아래 행 번호와 열 번호는 설명용 예시 숫자다.

Option Explicit

Sub CleanLabels()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim r As Long
    Dim v As Variant
    Dim result As String

    Set ws = ThisWorkbook.Worksheets("정리")
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    If lastRow < 2 Then Exit Sub

    For r = 2 To lastRow
        v = ws.Cells(r, "B").Value2

        If ws.Cells(r, "B").HasFormula Then
            result = "수식 확인"
        ElseIf IsError(v) Then
            result = "오류 확인"
        ElseIf IsEmpty(v) Then
            result = ""
        ElseIf VarType(v) = vbString Then
            result = Trim$(v)
        Else
            result = "문자 형식 확인"
        End If

        With ws.Cells(r, "C")
            .NumberFormat = "@"
            .Value2 = result
        End With
    Next r
End Sub

ThisWorkbook은 이 코드가 저장된 통합 문서를 가리킨다. 다른 파일을 화면에서 선택해 두었다고 해서 그 파일을 처리하는 구조가 아니다. 코드를 넣은 파일에 정리 시트가 있는지 확인한다.

Microsoft Learn의 Range.Value2 설명은 셀 값을 읽고 쓰는 속성을 안내한다. 여기서는 B열의 값을 읽고 C열에 결과를 기록하는 데 사용한다.

결과 열은 텍스트 형식으로 지정한다. 정리한 문자열이 등호로 시작하더라도 결과를 수식으로 실행하려는 목적이 아니기 때문이다. 숫자 계산에 사용할 열에는 이 코드를 그대로 적용하지 않는다.

주의

원본 파일에서 매크로를 바로 실행하지 않는다. 반드시 사본을 만들고, 결과 전용 C열에 보관할 내용이 없는지 확인한 뒤 시험한다.

실행 후에는 바뀐 행을 비교하기

시험 자료에는 앞 공백, 뒤 공백, 내부 공백이 있는 텍스트를 따로 준비한다. 앞뒤의 일반 공백만 사라지고 내부 간격은 유지되어야 한다. 빈 셀은 빈 결과로 남아야 한다.

수식 셀에는 계산 결과 대신 수식 확인이라는 문구가 나온다. 오류 셀과 숫자 셀도 별도 문구로 남는다. 이는 해당 값이 틀렸다는 판정이 아니라, 이 매크로의 처리 대상에서 제외했다는 표시다.

원래 텍스트 자체가 확인 문구와 같을 수도 있다. 따라서 결과 열만으로 오류 목록을 확정하지 않는다. 반드시 같은 행의 B열과 함께 보고 입력 형식을 확인한다.

자동화되는 부분은 각 셀을 열어 앞뒤 공백을 지우는 동작이다. 정리 규칙을 정하고 예외를 판단하는 일은 남는다. 실제 파일에서 실행 시간을 측정한 결과는 아니므로 특정 절감률을 제시하지 않는다.

처리 범위의 한계와 마무리 점검

Trim$는 여기서 모든 종류의 보이지 않는 문자를 없애는 도구가 아니다. 웹에서 복사된 특수 공백이나 탭이 남을 수 있다. 정리 뒤에도 조회가 실패하면 원문에 어떤 문자가 있는지부터 조사한다.

중간의 빈 행은 건너뛰지 않고 결과를 비운다. 다만 마지막 처리 행은 B열을 기준으로 결정한다. B열의 데이터가 줄어들면 그 아래 C열의 이전 결과는 남을 수 있으므로, 재실행 전 결과 열의 사용 범위를 확인한다.

이 코드는 셀마다 읽고 쓰는 이해하기 쉬운 형태다. 데이터가 많아지면 배열로 일괄 처리하는 구조가 필요할 수 있다. 속도를 높이기 전에 현재 규칙이 올바른지 먼저 검증한다.

실행 중 오류가 나면 위쪽 행만 처리된 상태로 멈출 수 있다. 매크로 실행은 일반적인 되돌리기를 기대하지 말고 사본으로 복구할 준비를 한다. 실행을 마쳤다는 이유만으로 결과를 원본 열에 덮어쓰지 않는다.

최종 반영 전에는 정상 텍스트와 예외 셀을 각각 살핀다. 정리가 필요한 열과 숫자나 수식이 들어 있는 열을 구분한 뒤, 확인된 결과만 다음 작업에 사용한다.