엑셀 CSV 파일 배열로 변환 :: CsvToArray 명령문 사용법 총정리
엑셀 CsvToArray 명령문 목차 바로가기
요약
엑셀 CsvToArray 명령문은 CSV 파일 또는 CSV 문자열을 엑셀 파일의 배열로 변환합니다.
명령문 구문
CsvToArray 파일경로, [파일여부], [열강제맞춤]
사용된 인수 및 변수 알아보기
인수 | 설명 |
파일경로(또는 문자열) [String] |
CSV 파일 경로 또는 CSV 문자열을 입력합니다. |
파일여부 [Boolean, 선택인수] |
만약 첫번째 인수로 CSV 문자열을 입력했을 경우 FALSE를 입력합니다. 기본값은 TRUE 입니다. |
열강제맞춤 [Boolean, 선택인수] |
TRUE 일 경우 CSV 파일 내부 오류로 인해 각 행의 열 개수가 다를 경우, 모든 열의 개수를 최대 열 개수로 강제맞춤 합니다. 기본값은 FALSE 입니다. |
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [엑셀VBA함수] CsvToArray 명령문예제파일
상세 설명
엑셀 CsvToArray 함수는 CSV 파일 또는 CSV 문자열을 엑셀 파일의 배열로 변환하는 사용자 지정 함수입니다. CSV 파일을 엑셀파일로 빠르게 불러오거나 외부 API를 통해 받아온 CSV 데이터를 빠르게 엑셀로 불러올 수 있습니다.
CsvToArray 명령문 실전 사용 예제 (CSV 파일 엑셀 불러오기) 간혹 일부 API의 결과가 잘못 반환되거나 CSV 파일에 오류가 있어 일부 행에서 열의 개수가 달라 배열로 반환할 때 오류가 발생할 수 있습니다. 그럴 경우, 열강제맞춤 여부를 TRUE로 입력하면 정확한 배열을 반환할 수 있습니다.
실전 사용 예제
- 실행중인 통합문서와 동일한 경로에 있는 CSV 파일을 엑셀로 불러오기
Sub Test1() 'ArrayToRng 명령문은 아래 링크에서 복사 후 모듈에 추가합니다. 'www.oppadu.com/vba-arraytorng-함수/ Dim vArr As Variant vArr = CsvToArray(ThisWorkbook.Path & "\" & "테스트.csv", True) ArrayToRng Range("A1"), vArr End Sub
- API에서 받아온 CSV 문자열을 엑셀로 출력하기
Sub Test2() 'ArrayToRng 명령문은 아래 링크에서 복사 후 모듈에 추가합니다. 'www.oppadu.com/vba-arraytorng-함수/ Dim vArr As Variant vArr = CsvToArray("a,b,c,d,e" & Chr(10) & "f,g,h,i,j", False) ArrayToRng Sheet1.Range("A1"), vArr End Sub
엑셀 CSV 파일 배열로 변환, CsvToArray 명령문 동작원리
CsvToArray 명령문 전체 코드
Function CsvToArray(strCSV As String, Optional isFile As Boolean = True, Optional isDiffCols As Boolean = False) As Variant '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '■ CsvToArray 함수 '■ CSV파일(콤마로 분리된 문자열)을 배열로 반환합니다. '■ 인수 설명 '_____________strCSV : CSV 문자열 또는 CSV 파일 경로입니다. '_____________isFile : 첫번째 인수가 파일경로일 경우 TRUE를 입력합니다. 기본값은 FALSE 입니다. '_____________isDiffCols : 파싱 오류로 인해 각 행의 열 개수가 다를 경우 TRUE로 입력하면 열의 최대개수를 강제로 조절합니다. '■ 사용 예제 'Array = CsvToArray("a,b,c,d,e") '■ 사용된 보조 함수 'Read_TextFile 함수 '############################################################## Dim i As Long: Dim j As Long: Dim X As Long Dim Rows As Long: Dim Cols As Long: Dim tempCols As Long Dim strRow As String Dim vRows As Variant Dim vRow As Variant Dim vResult As Variant Const q = """" Const qq = q & q If isFile = True Then strCSV = Read_TextFile(strCSV) If Len(strCSV) Then For i = 1 To Len(strCSV) Select Case Mid(strCSV, i, 1) Case q: X = X + 1 Case Chr(10): If X Mod 2 Then Mid(strCSV, i, 1) = "|" End Select Next vRows = Split(Trim(strCSV), Chr(10)) Rows = UBound(vRows) + 1 If isDiffCols = False Then Cols = UBound(Split(vRows(0), ",")) + 1 Else For i = 0 To Rows - 1 tempCols = UBound(Split(vRows(i), ",")) + 1 If tempCols > Cols Then Cols = tempCols Next End If ReDim vResult(1 To Rows, 1 To Cols) For i = 1 To Rows strRow = vRows(i - 1) If Len(strRow) Then If InStr(strRow, "|") Then strRow = Replace(strRow, "|", Chr(10)) If InStr(strRow, qq) Then strRow = Replace(strRow, qq, "|") For j = 1 To Len(strRow) Select Case Mid(strRow, j, 1) Case q: X = X + 1 Case ",": If X Mod 2 Then Mid(strRow, j, 1) = "♩" End Select Next If InStr(strRow, q) Then strRow = Replace(strRow, q, "") vRow = Split(strRow, ",") If isDiffCols = True Then Cols = UBound(Split(strRow, ",")) + 1 For j = 1 To Cols strRow = vRow(j - 1) If InStr(strRow, "♩") Then strRow = Replace(strRow, "♩", ",") If InStr(strRow, "|") Then strRow = Replace(strRow, "|", q) vResult(i, j) = strRow Next End If Next CsvToArray = vResult End If End Function Function Read_TextFile(sPath As String, Optional Charset As String = "UTF-8") As String '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '■ Read_TextFile 함수 '■ 텍스트 또는 CSV 파일을 읽어옵니다. '■ 인수 설명 '_____________sPath : 텍스트 또는 CSV 파일의 파일경로입니다. '_____________Charset : [선택인수] 인코딩형식입니다. 기본값은 UTF-8 입니다. Unicode, ANSI 등으로 설정할 수 있습니다. '■ 사용 예제 's = Read_TextFile("C:\Temp\Test.txt") '############################################################## On Error GoTo EH: Dim objADO As Object Set objADO = CreateObject("ADODB.Stream") With objADO .Open .Charset = Charset .LoadFromFile sPath Read_TextFile = .ReadText End With Exit Function EH: Read_TextFile = "" End Function
명령문 동작원리 단계별 알아보기
- 명령문에 사용할 변수를 선언하고 변수에 값을 입력합니다.
Dim i As Long: Dim j As Long: Dim X As Long Dim Rows As Long: Dim Cols As Long: Dim tempCols As Long Dim strRow As String Dim vRows As Variant Dim vRow As Variant Dim vResult As Variant Const q = """" Const qq = q & q
- CSV 파일에서 읽어올 경우 Reat_TextFile 함수로 파일을 읽어옵니다.
If isFile = True Then strCSV = Read_TextFile(strCSV)
- CSV 문자열 중 큰따옴표(") 에 포함된 줄바꿈을 세로바로 변경합니다. 이후 CSV 줄바꿈 기준으로 배열을 생성합니다.
If Len(strCSV) Then For i = 1 To Len(strCSV) Select Case Mid(strCSV, i, 1) Case q: X = X + 1 Case Chr(10): If X Mod 2 Then Mid(strCSV, i, 1) = "|" End Select Next vRows = Split(Trim(strCSV), Chr(10)) Rows = UBound(vRows) + 1
- 열강제맞춤 여부가 TRUE일 경우 최대 열 개수를 확인하여 출력할 배열을 생성합니다.
If isDiffCols = False Then Cols = UBound(Split(vRows(0), ",")) + 1 Else For i = 0 To Rows - 1 tempCols = UBound(Split(vRows(i), ",")) + 1 If tempCols > Cols Then Cols = tempCols Next End If ReDim vResult(1 To Rows, 1 To Cols)
- 줄바꿈 기준으로 생성된 배열을 하나씩 돌아가며 쉼표(,) 기준으로 나눈 뒤 출력 배열 안에 값을 하나씩 입력합니다.
For i = 1 To Rows strRow = vRows(i - 1) If Len(strRow) Then If InStr(strRow, "|") Then strRow = Replace(strRow, "|", Chr(10)) If InStr(strRow, qq) Then strRow = Replace(strRow, qq, "|") For j = 1 To Len(strRow) Select Case Mid(strRow, j, 1) Case q: X = X + 1 Case ",": If X Mod 2 Then Mid(strRow, j, 1) = "♩" End Select Next If InStr(strRow, q) Then strRow = Replace(strRow, q, "") vRow = Split(strRow, ",") If isDiffCols = True Then Cols = UBound(Split(strRow, ",")) + 1 For j = 1 To Cols strRow = vRow(j - 1) If InStr(strRow, "♩") Then strRow = Replace(strRow, "♩", ",") If InStr(strRow, "|") Then strRow = Replace(strRow, "|", q) vResult(i, j) = strRow Next End If Next
- CsvToArray 명령문으로 출력배열을 반환 후 명령문을 종료합니다.
CsvToArray = vResult End If
- 실행중인 통합문서와 동일한 경로에 있는 CSV 파일을 엑셀로 불러오기