메뉴
실무 위키VBA 코드CsvToArray

CsvToArray

Function

CSV 파일 또는 CSV 문자열을 엑셀 배열로 변환하는 VBA 사용자 지정 함수입니다.

CsvToArray 코드 미리보기
구문 = CsvToArray ( 파일경로, [파일여부], [열강제맞춤] )
인수구분 형식 설명
파일경로(또는 문자열) 필수 String
CSV 파일 경로 또는 CSV 문자열을 입력합니다.
파일여부 선택 Boolean
첫 번째 인수로 CSV 문자열을 입력했을 경우 FALSE 를 입력합니다. 기본값은 TRUE 입니다.
열강제맞춤 선택 Boolean
TRUE 일 경우 각 행의 열 개수가 다를 때 모든 행을 최대 열 개수로 강제 맞춤합니다. 기본값은 FALSE 입니다.
CSV 파일 오류로 일부 행의 열 개수가 달라 배열 변환에 실패할 때 사용합니다.

마스터 코드

복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요
Module1 · 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

활용 예제

실행중인 통합문서와 동일한 경로에 있는 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

안내사항

전체 코드에는 보조 함수인 Read_TextFile 함수가 함께 포함되어 있으므로 두 함수를 모두 모듈에 추가해야 합니다.
사용 예제의 ArrayToRng 명령문은 별도 게시글에서 복사해 모듈에 추가합니다.
댓글 4
5 (3개 평가)
lyb****
lyb**** 2021.05.29 11:44
감사합니다!
흰둥이멍멍
흰둥이멍멍 2022.06.28 20:04
감사합니다. 여기에 transpose를 추가하면 csv 불러오면서 바로 행렬 변환이 가능할까요?
오빠두엑셀
오빠두엑셀 작성자 2022.06.29 00:31
안녕하세요.
확인해보지 않았지만
Transpose 함수를 사용하면 가능할 것 같습니다.
강민준🤗
강민준🤗 2024.08.11 12:07
좋은 자료 감사합니다.🙇‍♂️
스크랩 완료