본문 바로가기
WeekdayLife/excel

[엑셀VBA] 참조표(테이블)을 이름정의에 사용하기 위한 배열로 변환

by JO_i 2022. 11. 9.

얼마 전에, 이름정의에 배열로 참조표(테이블)을 넣어서, 사용하는 방법에 대한 글을 적은 적이 있다. 한번 해놓으면 편하게 사용할 수 있지만, 단점은 아무래도, 따옴표와 컴마, 그리고 세미콜론까지 입력이 용이하지 않은 창에 수기로 타자를 치기가 어렵다는 점이겠다.

 

 

 

[엑셀] 등급 찾아서 넣기 : 이름정의에서 배열 사용#2(VLOOKUP)

이름정의에서 배열상수를 넣어서, 별도의 참조테이블을 사용하지 않는 방법을 얼마전 글에서 적은 적이 있다. 이를 사용하여 점수별 등급을 손쉽게 넣을 수 있다. 이는 VLOOKUP의 마지막 상수(RANGE

sunnybong.tistory.com

 

 

VBA로 간단하게 테이블을 배열 텍스트로 변환하는 코드이다.

테이블 영역을 선택하면 txt파일이 생기고, 이를 클립보드에 복사하는 과정까지이다. 구지 txt파일을 생성하지 않아도 되지만, 변환과정에서 생기는 오류 등을 확인하기 위한 LOG라고 보면 되겠다. 문제가 없다면 구지 파일을 켜지 않아도 되고, 기본적으로 "문서" 폴더에 저장된다.

* 아래 코드에 고정으로 적힌 문서폴더 경로는 각자에 맞춰 수정해야한다.

 

클립보드로 복사하는 방법으로 변경하였다. 파일이 생성되지 않아, 훨씬 수월해졌다.

또한 찾는 값이 위치하는 맨 좌측 컬럼의 값이 숫자인 경우, 텍스트로 처리되지 않도록 변경하였다.

 

 

Private Sub tableToArray()
   
Dim myTableRng As Range
   
On Error Resume Next
Application.DisplayAlerts = False
    Set myTableRng = Application.InputBox("변환할 테이블을 선택하세요, 레이블행은 제외하세요", , , , , , , 8)
Application.DisplayAlerts = True
On Error GoTo 0

If myTableRng Is Nothing Then
    MsgBox "범위를 선택하지 않아, 종료합니다"
    GoTo dd
End If
   
 
txt = ""
    For r = 1 To myTableRng.Rows.Count    
        If r = 1 Then
            txt = "={"
        End If
           
            For c = 1 To myTableRng.Columns.Count        
                If IsNumeric(myTableRng(r, c)) And c = 1 Then            
                    txt = txt & myTableRng(r, c)            
                Else: txt = txt & """" & myTableRng(r, c) & """"            
                End If            
                If c = myTableRng.Columns.Count Then
                    If r <> myTableRng.Rows.Count Then
                        txt = txt & ";"
                    End If
                Else
                    txt = txt & ","
                End If            
        Next c
       
        If r = myTableRng.Rows.Count Then        
            txt = txt & "}"            
        End If        
    Next r    
    copyVariable (txt)  
dd:
End Sub

Public Function copyVariable(Optional s$) As Boolean
    Dim v: v = s  'Cast to variant for 64-bit VBA support
    With CreateObject("htmlfile")
        With .parentWindow.clipboardData
            Select Case True
                Case Len(s): .setData "text", v
                Case Else:   copyVariable = .GetData("text")
            End Select
        End With
    End With
End Function

 

끝.