Laster Mer enn en CSV fil om gangen

stemmer
0

Hvordan gjør man importere CSV-filer via Excel VBA i et sett, i grupper eller i flere individuelle filer, snarere enn en av gangen?

Publisert på 23/10/2008 klokken 03:57
kilden bruker
På andre språk...                            


6 svar

stemmer
0

Du kan skrive en enkel konsoll applikasjon for å analysere en gruppe med csv-filer og lagre dem til Excel-filer.
Ikke den enkleste løsningen, men det kan være et alternativ.

Svarte 23/10/2008 kl. 04:26
kilden bruker

stemmer
1

Dette vil få en fil til en endimensjonal matrise raskt

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, ",")

Deretter V inneholder alle elementene i en enkelt kolonne, er NB første elementet V (0)

Svarte 23/10/2008 kl. 06:36
kilden bruker

stemmer
2

Jeg er litt rådvill på at de fleste versjoner av Excel vil åpne CSV-filer uten noen som helst problemer.

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
Svarte 23/10/2008 kl. 19:41
kilden bruker

stemmer
0

du kan også bruke workbooks.opentext

Svarte 24/10/2008 kl. 22:38
kilden bruker

stemmer
0

Ideen jeg hadde opprinnelig var som følger. Gitt disse dataene

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

opprette tre globale matriser, kalt Dog_Names, Dog_Agesog Collar_Sizeog fylle dem med dataene i CSV-filen.

Denne bit av VBScript gjør den jobben og viser resultatene. Fjern kommentarmerke fra wscript.echoi xsubrutine for å se alt skje.

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

Resultatet ser slik ut

>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
Svarte 29/10/2008 kl. 00:59
kilden bruker

stemmer
1

Dette er en annen måte som unngår Recalc du får når du åpner en CSV-fil i Excel.

Legg et blankt ark til arbeidsboken og legg til følgende kode arket formål

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

Du kan også være lurt å skjule ark, slik at ingen ved et uhell bruker den. Deretter kan du bruke som dette

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

En ting som litt bekymrer meg er at navnet blir økes hver gang du bruker funksjonen (f.eks data_1, data_2, ...), så det kan være en stabilitet problem hvis disse navnene blir lagret et sted.

Svarte 17/06/2011 kl. 09:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more