Загрузка более 1 файла CSV одновременно - PullRequest
0 голосов
/ 23 октября 2008

Как импортировать файлы CSV через Excel VBA в наборе, в группах или в нескольких отдельных файлах, а не по одному за раз?

Ответы [ 6 ]

2 голосов
/ 24 октября 2008

Я немного озадачен тем, что большинство версий 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
1 голос
/ 17 июня 2011

Это еще один способ избежать повторного вызова при открытии файла CSV в Excel.

Добавьте пустой лист в вашу книгу и добавьте следующий код объекта листа

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

Вы также можете скрыть лист, чтобы никто случайно не использовал его. Тогда вы можете использовать как это

dim d
d = getCsv("C:\temp\some.csv")

Одна вещь, которая немного беспокоит меня, заключается в том, что Имя увеличивается каждый раз, когда вы используете функцию (например, data_1, data_2, ...), поэтому может возникнуть проблема стабильности, если эти имена где-то сохранятся.

1 голос
/ 23 октября 2008

Это быстро превратит файл в одномерный массив

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 первый элемент V (0)

0 голосов
/ 29 октября 2008

Первоначально у меня была следующая идея. Учитывая эти данные

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 выполняет эту работу и отображает результаты. Удалите отметку комментария из wscript.echo в подпрограмме x, чтобы увидеть, как все это происходит.

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

Результат выглядит так

>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
0 голосов
/ 25 октября 2008

Вы также можете использовать workbooks.opentext

0 голосов
/ 23 октября 2008

Вы можете написать простое консольное приложение для анализа пакета CSV-файлов и сохранения их в файлы Excel.
Не самое простое решение, но это может быть вариант.

...