엑셀 작업을 하다 보면 여러 열을 하나의 열에 모두 합쳐서 정리를 해야 하는 경우가 있습니다.
열마다 마지막 행이 다르고, 중간에 비어 있는 셀이 있는 경우 데이터가 있는 셀만 모두 하나의 열로 합치려면 어떻게 하면 될까요?
열을 하나하나 복사해서 뒤에 이어 가면서 붙여 넣기 하면 되지만 좋은 방법은 아닙니다. 중간에 빈 셀이 있는 경우 복사해서 붙여 넣기 하는 작업이 훨씬 많아질 수도 있습니다.
이럴 경우 VBA 매크로를 활용하면 간단하게 원하는 셀 범위의 데이터를 하나의 열에 모두 모아서 정렬할 수 있습니다.
이번 글에서는 엑셀 VBA 매크로 – 여러 열을 하나의 열로 합쳐서 나열하는 방법(선택한 여러 열을 한 열로 표시)에 대해 알아보겠습니다.
혹시 엑셀 VBA 매크로를 처음 접하는 분이라면 엑셀에서 VBA(매크로)를 처음으로 시작할 때 참고하세요 글을 먼저 참고해 보시기 바랍니다.
엑셀에서 여러 열을 하나의 열로 합치기 시나리오
▶ 아래 엑셀 화면에서와 같이 A열, B열, C열의 데이터가 있고, 이 3개의 열을 합쳐서 E열에 정리해서 보여주는 시나리오가 있습니다.
- 각각의 열의 크기는 다릅니다. 즉 각 열마다 마지막 셀의 위치가 다릅니다.
- 열 중간에 빈 셀이 존재할 수 있습니다. 빈 셀은 합칠 때 제외해야 합니다.
- 합칠 셀을 미리 선택하고 VBA 매크로를 실행해서 원하는 위치에 합친 결과를 표시할 수도 있고,
- 매크로가 실행 될 때 셀 범위를 선택한 뒤 모두 합친 결과를 원하는 위치에 표시할 수도 있습니다.
▼ 아래 캡처 화면은 VBA 매크로 프로그램 작성 화면입니다.
엑셀 VBA 매크로 – 여러 열을 하나의 열로 합쳐서 나열하는 방법 1
▶ 첫 번째 방법은 VBA 매크로를 실행하기 전에 먼저 합칠 셀을 선택하고 매크로를 실행하는 방법입니다.
1. 앞 단락에 첨부한 이미지에서 A2에서 C11까지 셀을 먼저 선택합니다.
2. 아래 VBA 매크로를 작성해서 실행해 줍니다.
3. 결과가 표시될 셀 선택 Input Box에서 합친 결과가 표시될 셀 위치를 선택해 줍니다.
4. 그럼 결과가 원하는 셀 위치에서 1열로 모두 합쳐져서 표시됩니다.
Sub DataMerge() Dim selectedRange As Range Dim resultRange As Range Dim longCols As Long Dim longRows As Long Dim longN As Long Set selectedRange = Selection Set resultRange = Application.InputBox(“결과가 표시될 셀 선택”, “1열로 합치기”, “E2”, , , , , 8) For longCols = 1 To selectedRange.Columns.Count For longRows = 1 To selectedRange.Rows.Count If selectedRange.Cells(longRows, longCols).Value <> “” Then resultRange.Offset(longN) = selectedRange.Cells(longRows, longCols).Value longN = longN + 1 End If Next Next End Sub |
5. 미리 선택한 셀들을 합치기 하므로 For longRows = 1 To selectedRange.Rows.Count로 해서 첫 번째 행부터 합치기를 합니다.
엑셀 VBA 매크로 – 여러 열을 하나의 열로 합쳐서 나열하는 방법 2
▶ 두 번째 방법은 VBA 매크로를 실행해서 합치고자 하는 셀 범위를 지정하고 매크로를 실행하는 방법입니다.
1. 먼저 VBA 매크로를 실행합니다. 앞 단락에 첨부한 이미지에서 A2에서 C11까지 셀을 먼저 선택합니다.
2. 합치고자 하는 셀 선택 Input Box에서 합칠 셀 범위를 지정합니다.
3. 그리고 결과가 표시될 셀 선택 Input Box에서 합친 결과가 표시될 셀 위치를 선택해 줍니다.
4. 그럼 결과가 원하는 셀 위치에서 1열로 모두 합쳐져서 표시됩니다.
Sub DataMerge() Dim selectedRange As Range Dim resultRange As Range Dim longCols As Long Dim longRows As Long Dim longN As Long Set selectedRange = Application.InputBox(“합치고자 하는 셀 선택”, “자료 정리”, “A2:C2”, , , , , 8) Set selectedRange = selectedRange.CurrentRegion Set resultRange = Application.InputBox(“결과가 표시될 셀 선택”, “1열로 정리”, “E2”, , , , , 8) For longCols = 1 To selectedRange.Columns.Count For longRows = 2 To selectedRange.Rows.Count If selectedRange.Cells(longRows, longCols).Value <> “” Then resultRange.Offset(longN) = selectedRange.Cells(longRows, longCols).Value longN = longN + 1 End If Next Next End Sub |
5. 셀 범위를 지정하고 CurrentRegion를 지정해 줌으로 해서 For longRows = 2 To selectedRange.Rows.Count로 해서 두 번째 행부터 합치기를 합니다. 첫 번째 행은 타이틀 행으로 합치기에서 제외했습니다.
마무리
엑셀에서 여러 개의 열을 합쳐서 하나의 열에 쭉 데이터를 정리하는 일은 비교적 자주 발생하는 작업 중에 하나 입니다.
만약 앞에 VBA 매크로에서 빈 공백 셀도 포함한다면 IF 구문을 제외하면 됩니다.
또는 특정 셀 데이터만 제외한다면 IF 구문의 조건식을 적절히 지정해서 처리할 수도 있습니다.
참고로 예제 VBA에서 사용한 InputBox는 Application.InputBox 입니다.
일반적인 VBA의 InputBox에 대한 설명은 엑셀 VBA에서 입력 값을 받는 InputBox를 사용하는 방법 글을 참고하시기 바랍니다.
VBA의 InputBox와 달리 Application.InputBox에는 마지막 8번째 인수인 Type을 추가로 지정할 수 있습니다.
Type 인수는 반환 데이터 유형을 지정합니다. 이 인수가 생략되면 대화 상자는 텍스트를 반환합니다.
Type의 인수 값으로 8을 지정하면 Range(영역)을 지정할 수 있습니다.
Application.InputBox에 대한 자세한 설명은 https://learn.microsoft.com/ko-kr/office/vba/api/excel.application.inputbox 설명을 참고해 보세요.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
♥ 이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.