한 번에 하나씩이 아니라 그룹이나 여러 개의 개별 파일에서 Excel VBA를 통해 CSV 파일을 가져 오는 방법은 무엇입니까?Excel VBA를 통해 한 번에 둘 이상의 CSV 파일을로드하는 방법?
답변
csv 파일의 일괄 처리를 구문 분석하고 파일을 저장하기 위해 간단한 콘솔 응용 프로그램을 작성할 수 있습니다.
가장 쉬운 해결책은 아니지만 옵션 일 수 있습니다.
이 한 차원 배열로 파일을 얻을 것이다 빠르게
Open "myfile.csv" For Input As 1
Dim Txt As String
Txt = Input(LOF(1), 1)
Close #1
Dim V As Variant
V = Split(Txt, ",")
그런 다음 V는 하나의 열의 모든 항목을 포함, NB 첫 번째 항목 (0)
나는 조금 의아해 오전 V입니다 대부분의 Excel 버전은 문제없이 .csv 파일을 열 수 있습니다.
strPath = "C:\Docs\"
strFile = Dir(strPath & "*.csv")
Do While strFile <> ""
Workbooks.Open Filename:=strPath & strFile
ActiveWorkbook.SaveAs Filename:=strPath & Mid(strFile, 1, InStr(strFile, ".") - 1) _
& "Conv.xls", FileFormat:=xlNormal
strFile = Dir
Loop
당신은 또한
다음과 같이 내가 처음이었다 한 아이디어를 workbooks.opentext 사용할 수 있습니다. 세 가지 글로벌 배열이 데이터
Dog Names,Dog Ages,Collar Size
Woof,3,4
Bowser,2,5
Ruffy,4.5,6
Angel,1,7
Demon,7,8
Dog,9,2
생성을 감안할 때,
Dog_Names
,
Dog_Ages
및
Collar_Size
라고하고 CSV 파일의 데이터로 채 웁니다.
이 VBScript 비트는 해당 작업을 수행하고 결과를 표시합니다. x
서브 루틴의 wscript.echo
에서 주석 표시를 제거하여 모든 문제가 발생하는지 확인하십시오.
Option Explicit
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim oStream
Dim sData
Dim aData
Set oStream = fso.OpenTextFile("data.csv")
sData = oStream.ReadAll
aData = Split(sData, vbNewLine)
Dim sLine
sLine = aData(0)
Dim aContent
aContent = Split(sLine, ",")
Dim aNames()
Dim nArrayCount
nArrayCount = UBound(aContent)
ReDim aNames(nArrayCount)
Dim i
For i = 0 To nArrayCount
aNames(i) = Replace(aContent(i), " ", "_")
x "dim " & aNames(i) & "()"
Next
For j = 0 To nArrayCount
x "redim " & aNames(j) & "(" & UBound(aData) - 1 & ")"
Next
Dim j
Dim actual
actual = 0
For i = 1 To UBound(aData)
sLine = aData(i)
If sLine <> vbnullstring Then
actual = actual + 1
aContent = Split(sLine, ",")
For j = 0 To nArrayCount
x aNames(j) & "(" & i - 1 & ")=" & Chr(34) & aContent(j) & Chr(34)
Next
End If
Next
For j = 0 To nArrayCount
x "redim preserve " & aNames(j) & "(" & actual - 1 & ")"
Next
For i = 0 To actual - 1
For j = 0 To nArrayCount
x "wscript.echo aNames(" & j & ")," & aNames(j) & "(" & i & ")"
Next
Next
Sub x(s)
'wscript.echo s
executeglobal s
End Sub
결과는이 Excel에서 csv 파일을 열 때 얻을 다시 계산을 방지하는 또 다른 방법입니다이
>cscript "C:\Documents and Settings\Bruce\Desktop\datathing.vbs"
Dog_Names Woof
Dog_Ages 3
Collar_Size 4
Dog_Names Bowser
Dog_Ages 2
Collar_Size 5
Dog_Names Ruffy
Dog_Ages 4.5
Collar_Size 6
Dog_Names Angel
Dog_Ages 1
Collar_Size 7
Dog_Names Demon
Dog_Ages 7
Collar_Size 8
Dog_Names Dog
Dog_Ages 9
Collar_Size 2
>Exit code: 0 Time: 0.338
부스트 - 내가 이해하는 것처럼 ExecuteGlobal (및 Execute)은 VBScript에서만 사용할 수 있지만 VBA에서는 사용할 수 없습니까? –
것 같습니다.
당신은 또한 아무도 실수로 사용되지 않도록, 시트를 숨길 수있는 시트의 객체Function getCsv(fn)
Dim d, scrup As Boolean
scrup = Application.ScreenUpdating
Application.ScreenUpdating = False
With Me.QueryTables.Add(_
Connection:="TEXT;" & fn, _
Destination:=Me.Range("A1") _
)
.Name = "data"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = False
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
End With
d = Me.Names(1).RefersToRange.Value
Me.Names(1).Delete
Me.UsedRange.Rows.Delete
Application.ScreenUpdating = scrup
getCsv = d
End Function
다음 코드를 통합 문서에 빈 시트를 추가하고 추가 할 수 있습니다. 안정성 문제가있을 수 있습니다 (예를 들어, 데이터 1, 데이터 2, ...), 그래서 그런 다음 당신은 약간 나 이름은 당신이 기능을 사용할 때마다 증가됩니다 있다는 것입니다 우려이
dim d
d = getCsv("C:\temp\some.csv")
한 가지처럼 사용할 수 있습니다 이 이름들이 어딘가에 저장되면.
- 1. 한 번에 둘 이상의 제약 조건을 삭제하는 방법 (Oracle, SQL)
- 2. 빠른 ESP 쿼리에서 한 번에 둘 이상의 결과를 얻는 방법
- 3. 한 번에 둘 이상의 공급자를 사용하여 OAuth를 수행하는 방법은 무엇입니까?
- 4. document.getElementbyId - 한 번에 둘 이상의 ID를 가져 오는 중입니까?
- 5. 한 번에 둘 이상의 키가 푸시되고 있는지 확인하려면 어떻게합니까?
- 6. HDividedBox에서 한 번에 둘 이상의 분할 자 이동
- 7. django-nonrel/app 엔진에서 한 번에 둘 이상의 엔티티를 효율적으로 업데이트하는 방법
- 8. 둘 이상의 링크를 리디렉션하는 방법
- 9. 한 번에 두 줄의 CSV 읽기 (Java)
- 10. Excel (.xls) 파일을로드하는 C++ 라이브러리
- 11. 한 번에 두 개 이상의 객체 렌더링하기
- 12. VBA를 통해 모든 셀을 새로 고치는 방법
- 13. 둘 이상의 객체 터널링
- 14. csv/excel 파일에서 날짜를 올바르게 읽는 방법
- 15. 둘 이상의 테이블에서 같은 열을 업데이트하는 방법
- 16. VBA를 사용하여 Excel 셀 이름을 설정하는 방법
- 17. ASP.NET의 HttpInputStream에서 파일을로드하는 방법
- 18. nl2br 둘 이상의 개행
- 19. 둘 이상의 UIPickerView 사용
- 20. PDO INSERT - 둘 이상의
- 21. 각 루프에 대해 vba를 Excel에서 한 번에 두 걸음 처리합니다.
- 22. 정적 멤버 변수가 IIS에서 한 번에 둘 이상의 요청에 의해 액세스되는 것을 방지하려면 어떻게합니까?
- 23. 사용자가 asp.net에서 한 번에 둘 이상의 파일을 선택하고 업로드 할 수 있습니까?
- 24. 하나의 asp.net 사용자가 세션이 사용 중일 때 한 번에 둘 이상의 요청을 할 수 있습니까?
- 25. ADO.NET : 단일 SqlConnection이 한 번에 둘 이상의 쿼리를 실행할 수 있습니까?
- 26. C#에서 Excel vbA를 구현하는 방법
- 27. VBA를 사용하여 Excel 파일의 데이터를 정렬하는 방법
- 28. vb.net의 Excel 셀에 둘 이상의 하이퍼 링크를 추가하는 방법이 있습니까?
- 29. VBA를 사용하여 Excel 시트 병합
- 30. CopyFromScreen을 통해 둘 이상의 CopyPixelOperation을 보내는 방법은 무엇입니까?
필자는 vbNewLine을 사용하여 파일을 줄 바꿈하고 각 줄을 쉼표로 분리하는 것이 더 좋을 것이라고 생각합니다. 그렇게하면 각 필드를 V (행) (열)로 지정할 수 있습니다. 라인과 컬럼은 물론 제로 기반 일 것입니다. – bugmagnet
또한 필드가 따옴표로 분리되거나 쉼표가 포함되어 있다고 가정합니다. – Graham