들어가며
엑셀에서 데이터를 분석하고 관리할 때
표 기능은 매우 유용합니다.
필터링, 정렬, 서식 지정 등 작업을 쉽게 수행하게 해 줍니다.
이번 블로그에서는 VBA 코드를 사용하여
일반 셀 범위를 엑셀 표로 바꾸는 방법을 알아보겠습니다.
구현할 내용
왼쪽 그림과 같은 범위를
오른쪽 그림의 표로 바꾸는 VBA 코드입니다.


코드 작성하기
Sub ConvertRangeToTable()
Dim ws As Worksheet
Dim dataRange As Range
' 작업할 워크시트 설정
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 데이터 범위 설정
Set dataRange = ws.Range("A1:D10")
' 범위를 테이블로 변환
ws.ListObjects.Add(xlSrcRange, dataRange, , xlYes).Name = "MyTable"
End Sub
위 코드를 실행하면 A1 ~ D10 범위가
표로 바뀌게 됩니다.
Sheet1 이름을 가진 시트를 선택하고
A1 ~ D10 범위를 코드에서 직접 지정해 줍니다.
그리고 해당 범위를 표로 바꾸고
표의 이름은 MyTable로 지정합니다.
셀 입력받기
우선 범위를 코드에서 지정하는 것보다는
사용자로부터 하나의 셀을 입력받고
해당 셀을 포함하는 범위를 표로 만들 수 있도록 코드를 수정하겠습니다.
먼저 inputbox를 통해 셀 주소를 입력받을 수 있게 해 줍니다.
cellAddress = InputBox("테이블로 변환할 데이터 영역의 셀 주소를 입력하세요 (예: A1):", "셀 주소 입력")
잘못된 셀 주소를 입력하거나,
취소 버튼을 눌렀을 경우 작업을 취소하는 코드를 추가합니다.
If cellAddress = "" Then
MsgBox "작업이 취소되었습니다.", vbInformation
Exit Sub
End If
마지막으로 입력된 셀 주소가 유효할 셀 주소가 아닐 경우
처리해 주는 코드도 작성해 줍니다.
On Error Resume Next
Set startCell = ws.Range(cellAddress)
On Error GoTo 0
If startCell Is Nothing Then
MsgBox "유효하지 않은 셀 주소입니다. 다시 시도해주세요.", vbExclamation
Exit Sub
End If
이렇게 코드를 수정하면
셀 주소를 입력받고 입력받은 셀과 연결된 범위를 모두 표로 바꿀 수 있습니다.
Option Explicit
Sub ConvertRangeToTable()
Dim ws As Worksheet
Dim dataRange As Range
Dim cellAddress As String
Dim startCell As Range
' 작업할 워크시트 설정
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 사용자로부터 셀 주소 입력받기
cellAddress = InputBox("테이블로 변환할 데이터 영역의 셀 주소를 입력하세요 (예: A1):", "셀 주소 입력")
' 사용자가 취소를 누르거나 빈 값을 입력한 경우
If cellAddress = "" Then
MsgBox "작업이 취소되었습니다.", vbInformation
Exit Sub
End If
' 입력된 주소가 유효한지 확인
On Error Resume Next
Set startCell = ws.Range(cellAddress)
On Error GoTo 0
' 유효하지 않은 셀 주소인 경우
If startCell Is Nothing Then
MsgBox "유효하지 않은 셀 주소입니다. 다시 시도해주세요.", vbExclamation
Exit Sub
End If
' 데이터 범위 설정 (입력받은 셀의 CurrentRegion)
Set dataRange = startCell.CurrentRegion
' 범위를 테이블로 변환
ws.ListObjects.Add(xlSrcRange, dataRange, , xlYes).Name = "MyTable"
End Sub
이미 표로 설정되어 있는 경우 실행하지 않게 하기
위 코드는 이미 표로 지정되어 있을 경우에는 에러가 발생합니다.
선택된 범위가 이미 표로 지정되어 있는지 확인하고
표로 지정되어 있다면,
변환을 하지 않고 프로그램을 종료하도록 바꾸겠습니다.
먼저 해당 범위가 표로 지정되어 있는 지 확인하는 함수를 하나 만들어줍니다.
Function IsInTable(cell As Range) As Boolean
Dim tbl As ListObject
IsInTable = False
' 워크시트의 모든 테이블을 확인
For Each tbl In cell.Worksheet.ListObjects
If Not Intersect(cell, tbl.Range) Is Nothing Then
IsInTable = True
Exit Function
End If
Next tbl
End Function
그다음 메인 프로시저에서 위 함수를 호출하여
표가 있는지 확인합니다.
If IsInTable(startCell) Then
MsgBox "선택한 셀은 이미 테이블에 포함되어 있습니다.", vbExclamation
Exit Sub
End If
다음은 전체코드입니다.
Option Explicit
Sub ConvertRangeToTable()
Dim ws As Worksheet
Dim dataRange As Range
Dim cellAddress As String
Dim startCell As Range
' 작업할 워크시트 설정
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 사용자로부터 셀 주소 입력받기
cellAddress = InputBox("테이블로 변환할 데이터 영역의 셀 주소를 입력하세요 (예: A1):", "셀 주소 입력")
' 사용자가 취소를 누르거나 빈 값을 입력한 경우
If cellAddress = "" Then
MsgBox "작업이 취소되었습니다.", vbInformation
Exit Sub
End If
' 입력된 주소가 유효한지 확인
On Error Resume Next
Set startCell = ws.Range(cellAddress)
On Error GoTo 0
' 유효하지 않은 셀 주소인 경우
If startCell Is Nothing Then
MsgBox "유효하지 않은 셀 주소입니다. 다시 시도해주세요.", vbExclamation
Exit Sub
End If
' 선택한 셀이 이미 테이블에 속해 있는지 확인
If IsInTable(startCell) Then
MsgBox "선택한 셀은 이미 테이블에 포함되어 있습니다.", vbExclamation
Exit Sub
End If
' 데이터 범위 설정 (입력받은 셀의 CurrentRegion)
Set dataRange = startCell.CurrentRegion
' 범위를 테이블로 변환
ws.ListObjects.Add(xlSrcRange, dataRange, , xlYes).Name = "MyTable"
MsgBox "테이블이 성공적으로 생성되었습니다!", vbInformation
End Sub
' 셀이 테이블에 속해 있는지 확인하는 함수
Function IsInTable(cell As Range) As Boolean
Dim tbl As ListObject
IsInTable = False
' 워크시트의 모든 테이블을 확인
For Each tbl In cell.Worksheet.ListObjects
If Not Intersect(cell, tbl.Range) Is Nothing Then
IsInTable = True
Exit Function
End If
Next tbl
End Function
마치며
위 코드를 조금 수정하면
여러 시트 또는 여러 파일에 있는 범위를 표로 바꿀 수 있습니다.
위 코드에 사용된 intersect 함수의 사용법은 아래 링크를 참고하시면 됩니다.
여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.
'EXCEL VBA' 카테고리의 다른 글
[ 엑셀 VBA ] 엑셀 날짜 선택해서 입력하기, Date Picker 소개 (0) | 2025.03.23 |
---|---|
[ 엑셀 VBA ] 간단한 파일 관리 및 분류 프로그램 만들기-두번째 (2) | 2024.11.26 |
[ 엑셀 VBA ] 간단한 파일 관리 및 분류 프로그램 만들기-첫번째 (1) | 2024.11.26 |
[ 엑셀 VBA ] vlookup과 비슷한 중복값 찾기 기능, 좌측값 찾기 기능이 있는 사용자 정의 함수 만들기 (0) | 2024.11.23 |
[ 엑셀 VBA ] 두 범위를 입력받아 사용 가능한 경우의 수 조합하기, 사용자 정의함수 (0) | 2024.11.22 |