EXCEL VBA

[ 엑셀 VBA ] 범위를 테이블(표)로 바꾸는 VBA 코드

카루루1007 2025. 3. 23. 18:59
728x90
반응형

 들어가며

 

엑셀에서 데이터를 분석하고 관리할 때 

표 기능은 매우 유용합니다.

 

필터링, 정렬, 서식 지정 등 작업을 쉽게 수행하게 해 줍니다.

 

이번 블로그에서는 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

 

728x90

 이미 표로 설정되어 있는 경우 실행하지 않게 하기

 

위 코드는 이미 표로 지정되어 있을 경우에는 에러가 발생합니다.

선택된 범위가 이미 표로 지정되어 있는지 확인하고

표로 지정되어 있다면,

변환을 하지 않고 프로그램을 종료하도록 바꾸겠습니다.

 

먼저 해당 범위가 표로 지정되어 있는 지 확인하는 함수를 하나 만들어줍니다.

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 함수의 사용법은 아래 링크를 참고하시면 됩니다.

intersect 함수 사용방법

여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.

엑셀 공부하기
VBA 공부하기

728x90
반응형