Clever-Excel-Forum

Normale Version: CSV Export über mehrere Blätter
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

aktuell habe ich ein für mich kniffeliges Problem, und hoffe jemand kann mir weiterhelfen :)

Ich habe quasi eine tägl. Datei, in dieser Datei habe ich 2 Blätter, in beiden Blättern habe ich den Bereich B6:CC504 mit Daten gefüllt.
In B7:B504 stehen normal Artikelnummern, doch es kann sein das an einen Tag 50 am anderen 250 drin stehen.
Aktuell mache ich einen Datenabruf und kopiere die gefüllten Spalten in eine "import.csv" hinein, doch leider kommen meine Kollegen damit nicht klar.

Daher, hat jemand eine Idee, wie ich folgendes via VBA erreichen kann?

Exportiere Tabelle1 B6:B504 sofern B6 gefüllt ist (Loop bis B504), dann Tabelle2 B6:B504 sofern B6 gefüllt ist (Loop bis B504) als Wert und erstelle die import.csv

Wie gesagt, das Problem ist halt das nicht immer eine Artikelnummer in den Tabellen steht, und keine leeren Zeilen in der import.csv stehen dürfen.

Ich bedanken mich schonmal im voraus :)

BG

Ps. gerne kann ich auch eine Musterdatei nachliefern.
Chat GPT sagt:

Code:
Sub ExportDataToCSV()
    Dim wb As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim lastRow As Long, i As Long
    Dim dataArr1() As Variant, dataArr2() As Variant
    Dim csvFilePath As String
   
    ' Set the workbook and worksheet objects
    Set wb = ThisWorkbook
    Set ws1 = wb.Sheets("Tabelle1")
    Set ws2 = wb.Sheets("Tabelle2")
   
    ' Find the last row in the first sheet
    lastRow = ws1.Cells(ws1.Rows.Count, "B").End(xlUp).Row
   
    ' Check if there is data in the first sheet
    If lastRow < 6 Then
        MsgBox "No data to export.", vbInformation
        Exit Sub
    End If
   
    ' Resize the array to hold the data
    ReDim dataArr1(1 To lastRow - 5, 1 To 1)
   
    ' Loop through the data in the first sheet and populate the array
    For i = 6 To lastRow
        If ws1.Cells(i, "B").Value <> "" Then
            dataArr1(i - 5, 1) = ws1.Cells(i, "B").Value
        End If
    Next i
   
    ' Find the last row in the second sheet
    lastRow = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row
   
    ' Check if there is data in the second sheet
    If lastRow < 6 Then
        MsgBox "No data to export.", vbInformation
        Exit Sub
    End If
   
    ' Resize the array to hold the data
    ReDim dataArr2(1 To lastRow - 5, 1 To 1)
   
    ' Loop through the data in the second sheet and populate the array
    For i = 6 To lastRow
        If ws2.Cells(i, "B").Value <> "" Then
            dataArr2(i - 5, 1) = ws2.Cells(i, "B").Value
        End If
    Next i
   
    ' Check if both arrays are empty
    If IsArrayEmpty(dataArr1) And IsArrayEmpty(dataArr2) Then
        MsgBox "No data to export.", vbInformation
        Exit Sub
    End If
   
    ' Prompt the user to choose a save location for the CSV file
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Save CSV File"
        .Filter = "CSV files (*.csv)|*.csv"
       
        If .Show = -1 Then
            csvFilePath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
   
    ' Create the CSV file and write the data
    On Error GoTo ErrorHandler
    Open csvFilePath For Output As #1
   
    ' Write data from the first array
    If Not IsArrayEmpty(dataArr1) Then
        For i = LBound(dataArr1, 1) To UBound(dataArr1, 1)
            Print #1, dataArr1(i, 1)
        Next i
    End If
   
    ' Write data from the second array
    If Not IsArrayEmpty(dataArr2) Then
        For i = LBound(dataArr2, 1) To UBound(dataArr2, 1)
            Print #1, dataArr2

Achtung: alle Kommata müssen durch Semikolon ersetzt werden!

Hinweis: Nicht getestet!
Moin Crowley,

erst einmal zusammengefasst, was ich glaube verstanden zu haben: 

Du hast zwei (oder mehrere?) Tabellenblätter, aus denen Daten in eine CSV zusammengeführt werden sollen, sofern Zelle B6 nicht leer ist. Das heißt, der erste Filter ist B6. Soweit korrekt?
Leerzeilen dürfen nicht in die CSV übergeben werden. Das also als Filter im zweiten Schritt. Soweit korrekt?

Dann lässt sich das über folgende Schleifen lösen:

Äußere Schleife über das ganze Workbook [PseudoCode]
  • For each Sheet in This Workbook 'damit werden alle Sheets abgeharkt
  • If Cells(6,2) <> "" then
Innere Schleife über die aktive Tabelle
  • for i = 1 to Usedrange.rows.count  'damit werden die vorhanden Zeilen abgeharkt, egal ob 50 oder 249
  • If Cells(i,1) = "" then i = i+1
  • else


Und nun die Aktion:
Entweder du schreibst die gefundenen Daten erst einmal in eine Zwischentabelle oder direkt in die CSV.
Innere Schleife beendet, nächste Runde Äußere...

Falls ich wenigstens der Spur nach richtig liege, mein Vorschlag: Mach das Thema hier auf und helfe Dir gerne.
Der ChatGP-Code mag funktionieren, was ich nicht testen werde. Handgemachter Code ist mal gleich deutlich kürzer...

Schöne Grüße
Hallo zusammen,

danke für die ersten Antworten.

Ich habe nun mal eine Beispieldatei gebaut.

Also: In Tabelle1 die Spalte U-1 ist Dynamisch, der Rest der Tabelle Statisch mit Formeln.
Ich rufe also meine Daten ab, im Rest wird ein Index durchgeführt.

Die VBA soll nun in Tabelle1 in Spalte U-1 nach unten prüfen und wenn gefüllt die Zeilen (inkl. Überschrift) in eine CSV Datei schreiben. Wenn er dort fertig ist, Tabelle2 in Spalte U-1 nach unten prüfen und wenn gefüllt die Zeilen (ohne Überschrift) in die selbe CSV schreiben. 

Die CSV soll dann als Import.CSV auf dem Desktop gespeichert werden.

An ChatGPT hätte ich bei so einem Problem nie Gedacht.tGPT

Hi. danke für deinen Input, ich habe soeben eine Beispieldatei für mein Problem gebaut.

Einfach nur interessehalber ;) Was macht es für einen Unterschied ob ich es hier schreibe oder in deinem Forum https://www.vbasteleien.de/?

BG Crowley
Moin crowley,

zur Frage hier oder dort: Foren leben von den Beiträgen ihrer Nutzer und die Basteleien versuchen sich als freundlicherer Nachfolger der office-loesungen.de, die es leider nicht mehr gibt. Verstehe meinen Satz als Einladung, die du annehmen oder ausschlagen kannst.

zu Deinem Thema: mal abgesehen davon, dass Du mit Deiner Beschreibung (zumindest für XL-Menschen) schon etwas Verwirrung stiftest, stehen doch die Daten U-1 in XL-Spalte B(2) verweise ich gerne noch mal meinen Vorschlag aus meinem Beitrag von gestern 13:45. Mit der dort genannten Schleifenlösung lässt sich das zügig realisieren.

Schönen Abend noch!
Moinsen,

ich finde den Hinweis, in ein anderes Forum zu wechseln etwas befremdlich.

Ich würde auch von einer Schleife abraten, dafür gibt es doch den Autofilter. Insgesamt würde ich das Verfahren aber wahrscheinlich ganz anders aufbauen.
Ziel eins wäre es dabei vollständig auf getrennte Teiltabellen zu verzichten. Wofür benötigst du die überhaupt? Und warum hältst du überhaupt nicht benötigte Zeilen vor?
Als zweitbeste Lösung würde ich die Einzeltabellen mit Powerquery zusammenführen und anschließend das ganze neue Blatt nur noch als CSV-Datei speichern.

Eine Beispieldatei würde da beim Helfen helfen.

Viele Grüße
derHöpp

Nachtrag: Die Beispieldatei hab ich jetzt auch gesehen. Meine Hinweise gelten vollumfänglich weiter ;)