2017-02-18 7 views
1

Fragen, ob Sie mit einem VBA-Problem helfen können. Ich pieced die folgenden, ohne wirklich zu wissen, zusammen, was ich tat:Importieren von Daten von .csv in Excel-Dokument mit VBA

Sub Import_Raw_Stripe_data() 

    Dim fileDialog As fileDialog 
    Dim strPathFile As String 
    Dim strFileName As String 
    Dim strPath As String 
    Dim dialogTitle As String 
    Dim Tworkbook As Workbook 
    Dim Sworkbook As Workbook 


dialogueTitle = "Select File to Import" 
Set fileDialogue = Application.fileDialog(msoFileDialogFilePicker) 
With fileDialogue 
    .InitialFileName = "L:\Downloads" 
    .AllowMultiSelect = False 
    .Filters.Clear 
    .Title = dialogueTitle 

    If .Show = False Then 
     MsgBox "No file selected." 
     Exit Sub 
    End If 
    strPathFile = .SelectedItems(1) 
End With 

Set Sworkbook = Workbooks.Open(fileName:=strPathFile) 
Set Tworkbook = ThisWorkbook 



End Sub 

Welche, soweit ich in Excel einen Dateidialog kann sagen öffnet, ermöglicht es einem Benutzer, ein Dokument zu wählen, und öffnet sie dann.

Was Ich mag würde tun, ist der folgende:

1) einen Dateidialog öffnen und eine CSV-Datei auswählen, um Daten aus zu importieren (vollständig) in eine XLSM Stammdatei (mit mehreren Blättern)?.

2) Wählen Sie bestimmte Spalten aus der .csv (Spalte A, Q, R und S in diesem Fall), kopieren Sie sie und importieren Sie sie in das zweite Blatt der Master-Excel-Datei mit dem Titel "Raw Stripe Data".

Jede Hilfe in der Angelegenheit würde sehr geschätzt werden.

Update: Ich schaffte den folgenden Code zu finden:

Sub load_csv() 
    Dim fStr As String 

    With Application.fileDialog(msoFileDialogFilePicker) 
     .Show 
     If .SelectedItems.Count = 0 Then 
      MsgBox "Cancel Selected" 
      Exit Sub 
     End If 
     'fStr is the file path and name of the file you selected. 
     fStr = .SelectedItems(1) 
    End With 

    With ThisWorkbook.Sheets("Stripe Raw Data").QueryTables.Add(Connection:= _ 
    "TEXT;" & fStr, Destination:=ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1")) 
     .Name = "CAPTURE" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 437 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = True 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = True 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
     ActiveWorkbook.Save 



    End With 

End Sub 

Dies funktioniert gut - aber ist es trotzdem, es nicht zu haben, die Daten bereits importiert außer Kraft setzen? (Zum Beispiel, wenn ich es zweimal verwende, überschreibt der zweite Import den ersten).

Antwort

2

ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1") Gibt an wo die importierten Daten geschrieben werden, das ist die erste Zelle des Blattes Stripe Raw Data.

Passen Sie dies nach Ihren Wünschen an, wenn Sie den nächsten Import an einem anderen Ort wünschen.

Wie in den Kommentaren erwähnt, können Sie load_csv() ändern, um das Ausgabeziel als Parameter zu übernehmen. Wenn Sie es auch von Sub zu Function ändern, können Sie die Anzahl der Zeilen importiert zurück:

Function load_csv(rngDestination As Range) As Long 
    '... 

    With ThisWorkbook.Sheets("Stripe Raw Data").QueryTables.Add(Connection:= _ 
    "TEXT;" & fStr, Destination:=rng) 

     '... 

     .Refresh BackgroundQuery:=False 
     load_csv = .ResultRange.Rows.Count 

     '... 

End Function 

Jetzt können Sie immer wieder load_csv nennen und mit dem Bereich zur Verfügung stellen, wo die Ausgabe beispielsweise beginnen sollte:

Dim rngOutput As Range 
Dim lngRows As Long 

Set rngOutput = ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1") 

lngRows = load_csv(rngOutput) ' load first file 
lngRows = lngRows + load_csv(rngOutput.Offset(lngRows)) ' load second file 
lngRows = lngRows + load_csv(rngOutput.Offset(lngRows)) ' load third file 
lngRows = lngRows + load_csv(rngOutput.Offset(lngRows)) ' load fourth file 

Es gibt noch viel Raum für Verbesserungen:

  • doppelten Überschriften
  • Entfernen
  • eine Schleife statt explizit Erstellen Aufruf load_csv viermal
  • Bessere Kontrolle für die Benutzerdateien wählen (Mehrfachauswahl)
  • die importierten Daten von der Abfragetabelle trennen Abhängigkeiten auch nach dem Import
  • Nicht in ThisWorkbook Import zu reduzieren aber danach Speicher ActiveWorkbook - sie können nicht immer die gleichen
  • ...

aber das ist nicht Teil dieser Frage.Alles, was Sie wissen wollten, war:

Gibt es trotzdem, es nicht überschreiben die Daten bereits importiert?

Ich hoffe, ich könnte genug mit dem oben genannten beantworten.

+0

Ja, ich verstehe, dass das passieren muss, aber das Problem ist, ich weiß nicht, wie man es implementiert. Ich würde annehmen, dass es eine Schleife von irgendeiner Art geben muss, aber wieder buchstäblich mein zweiter Tag, der VBA verwendet. – Spnkmyr

+0

Wenn Sie die Prozedur erweitern, um 'ThisWorkbook.Sheets (" Stripe Raw Data ") zu nehmen. Bereich (" $ A $ 1 ")' als Parameter: 'load_csv (rng As Range)' - dann können Sie den Import ändern dazu: 'ThisWorkbook.Sheets (" Stripe Raw Data "). QueryTables.Add (Verbindung: = _ " TEXT; "& fStr, Destination: = rng)' - Nun kann man 'load_csv()' mit variierenden Wiederholungen aufrufen Parameter. – Leviathan

+0

Hey, danke für deine Hilfe. In Ihrem Beispiel können Sie die notwendigen Schritte ausführen, um dies zu implementieren (insbesondere load_csv (rng As Range)? Können Sie Worksheet.Range = rng deklarieren und dann rng ("$ B $ 1") oder etwas ähnliches? Die andere Frage I has hängt davon ab, wo die Daten importiert werden.Ich möchte grundsätzlich, dass jeder Datensatz über den letzten geladen wird (im Gegensatz zu derselben Zelle, die alle vorherigen Daten nach lateral schiebt) .Wenn Sie sagen, Ziel: = rng, wie spezifizieren Sie den Anfang Bereich und dann die anschließende Import-Bereich? – Spnkmyr

Verwandte Themen