Werte in Matrix einfügen- Schleife
Hallo Leute,
wie kann ich das bestehende Makro ergänzen, sodass es mir für jedes entstandene Arbeitsblatt (trägt den Namen der Quelldatei z.B. "P20I30" den Wert in der Zelle J2 in eine andere Arbeitsmappe genannt "Matrix" in die jeweils passende Zelle einfügt? (ohne Formel nur den Wert)
Hier im Bild beispielweise entspricht die Zelle L10 => P8I10
Ich will nicht jeder Zelle einen Namen geben, weil diese Matrix noch lange nicht vollständig ist. (bis zu 255 Zeilen/255 Spalten), daher müsste der Code "mitdenken" können, wenn ich die Zeilen und Spalten erweitere.
P.S. den Code habe ich nicht selber geschrieben, da war ein sehr schlauer Kopf dran ^^
wie kann ich das bestehende Makro ergänzen, sodass es mir für jedes entstandene Arbeitsblatt (trägt den Namen der Quelldatei z.B. "P20I30" den Wert in der Zelle J2 in eine andere Arbeitsmappe genannt "Matrix" in die jeweils passende Zelle einfügt? (ohne Formel nur den Wert)
Hier im Bild beispielweise entspricht die Zelle L10 => P8I10
Ich will nicht jeder Zelle einen Namen geben, weil diese Matrix noch lange nicht vollständig ist. (bis zu 255 Zeilen/255 Spalten), daher müsste der Code "mitdenken" können, wenn ich die Zeilen und Spalten erweitere.
Sub ImportCSVData()
Dim wb As Workbook, wbCSV As Workbook, wsRohdaten As Worksheet, wsDiagramm As Worksheet
Set fso = CreateObject("Scripting.FileSystemObject")
' Pfad zu den CSV-Dateien angeben (ohne Backslash am Ende)
'--------------------------------------
Const strPathCSV = "Datei_Pfad" 'Pfad, wo die Rohdaten hinterlegt sind
Const strCSVExtension = "*.csv"
'--------------------------------------
'Diagramm-Vorlagesheet
Set wsDiagrammVorlage = Sheets("Diagramm_Vorlage")
'CSV-Dateien im Verzeichnis holen
strFilename = Dir(strPathCSV & "\" & strCSVExtension)
'ScreenRefresh während des Importes abschalten
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Diese Schleife für jede CSV-Datei im Verzeichnis ausführen
While strFilename <> ""
strBasename = fso.GetBaseName(strFilename)
'Neues Diagramm-Sheet auf Basis der Vorlage erstellen
wsDiagrammVorlage.Copy After:=Sheets(Sheets.Count)
Set wsDiagramm = Sheets(Sheets.Count)
'Datenquelle des Charts auf das aktuelle Arbeitsblatt aktualisieren
wsDiagramm.ChartObjects(1).Chart.SetSourceData wsDiagramm.Range("$B$1:$H$2086")
On Error Resume Next
'Namen des neuen Diagramm-Sheets auf den Namen der CSV-Datei (ohne Dateierweiterung) setzen
wsDiagramm.Name = strBasename
'Falls schon ein Sheet mit dem selben Namen existiert gebe eine Meldung aus.
If Err.Number <> 0 Then
MsgBox "Ein Diagramm mit dem Namen " & fso.GetBaseName(strFilename) & " existiert bereits in der Arbeitsmappe!", vbExclamation, "Fehler"
End If
'Fehlerbehandlung zurücksetzen
On Error GoTo 0
'CSV-Datei öffnen und Daten anpassen und importieren
Set wbCSV = Workbooks.Open(Filename:=strPathCSV & "\" & strFilename, Local:=True, Format:=4)
With wbCSV.Sheets(1)
'nicht benötigte Zeilen aus den Rohdaten entfernen (unverändert nach deiner Vorgabe)
lngSoll = Application.WorksheetFunction.Match(60, .Columns(3), 0) - 20
If lngSoll > 0 Then
.Rows("1:" & lngSoll).Delete
'Daten in das Diagramm-Sheet übertragen
.Range("B1:C" & .UsedRange.Rows.Count).Copy wsDiagramm.Range("C2")
Else
'wenn durch die Bedingung nichts gelöscht wurde importiere den gesamten Bereich ab Zelle B6:CXXXX
.Range("B6:C" & .UsedRange.Rows.Count).Copy wsDiagramm.Range("C2")
End If
'CSV schließen ohne Änderungen zu speichern
wbCSV.Close False
End With
'nächste CSV-Datei holen
strFilename = Dir
Wend
'Screen wieder aktualisieren
Application.ScreenUpdating = True
Application.DisplayAlerts = True
'Objekte freigeben
Set fso = Nothing
End Sub
P.S. den Code habe ich nicht selber geschrieben, da war ein sehr schlauer Kopf dran ^^
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 250964
Url: https://administrator.de/forum/werte-in-matrix-einfuegen-schleife-250964.html
Ausgedruckt am: 27.04.2025 um 16:04 Uhr
6 Kommentare
Neuester Kommentar
Moin Patrik,
guckst du hier:
Grüße Uwe
guckst du hier:
Sub ImportCSVData()
Dim wb As Workbook, wbCSV As Workbook, wsRohdaten As Worksheet, wsDiagramm As Worksheet, wsMatrix As Worksheet, row_y As Integer, col_x As Integer
Set fso = CreateObject("Scripting.FileSystemObject")
' Pfad zu den CSV-Dateien angeben (ohne Backslash am Ende)
'--------------------------------------
Const strPathCSV = "D:\Pfad"
Const strCSVExtension = "*.csv"
'--------------------------------------
'Diagramm-Vorlagesheet
Set wsDiagrammVorlage = Sheets("Diagramm_Vorlage")
'Matrix Sheet
Set wsMatrix = Sheets("Matrix")
'CSV-Dateien im Verzeichnis holen
strFilename = Dir(strPathCSV & "\" & strCSVExtension)
'ScreenRefresh während des Importes abschalten
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Diese Schleife für jede CSV-Datei im Verzeichnis ausführen
While strFilename <> ""
strBasename = fso.GetBaseName(strFilename)
'Koordinaten für Matrix extrahieren
arrCords = Split(strBasename, "I", -1, vbTextCompare)
row_y = Application.WorksheetFunction.Match(arrCords(0), wsMatrix.Range("B:B"), 0)
col_x = Application.WorksheetFunction.Match("I" & arrCords(1), wsMatrix.Range("2:2"), 0)
'Neues Diagramm-Sheet auf Basis der Vorlage erstellen
wsDiagrammVorlage.Copy After:=Sheets(Sheets.Count)
Set wsDiagramm = Sheets(Sheets.Count)
'Datenquelle des Charts auf das aktuelle Arbeitsblatt aktualisieren
wsDiagramm.ChartObjects(1).Chart.SetSourceData wsDiagramm.Range("$B$1:$H$2086")
On Error Resume Next
'Namen des neuen Diagramm-Sheets auf den Namen der CSV-Datei (ohne Dateierweiterung) setzen
wsDiagramm.Name = strBasename
'Falls schon ein Sheet mit dem selben Namen existiert gebe eine Meldung aus.
If Err.Number <> 0 Then
MsgBox "Ein Diagramm mit dem Namen " & fso.GetBaseName(strFilename) & " existiert bereits in der Arbeitsmappe!", vbExclamation, "Fehler"
End If
'Fehlerbehandlung zurücksetzen
On Error GoTo 0
'CSV-Datei öffnen und Daten anpassen und importieren
Set wbCSV = Workbooks.Open(Filename:=strPathCSV & "\" & strFilename, Local:=True, Format:=4)
With wbCSV.Sheets(1)
'nicht benötigte Zeilen aus den Rohdaten entfernen (unverändert nach deiner Vorgabe)
lngSoll = Application.WorksheetFunction.Match(60, .Columns(3), 0) - 20
If lngSoll > 0 Then
.Rows("1:" & lngSoll).Delete
'Daten in das Diagramm-Sheet übertragen
.Range("B1:C" & .UsedRange.Rows.Count).Copy wsDiagramm.Range("C2")
Else
'wenn durch die Bedingung nichts gelöscht wurde importiere den gesamten Bereich ab Zelle B6:CXXXX
.Range("B6:C" & .UsedRange.Rows.Count).Copy wsDiagramm.Range("C2")
End If
'Gesamtwert in die Matrix eintragen
wsMatrix.Cells(row_y, col_x).Value = wsDiagramm.Range("J2").Value
'CSV schließen ohne Änderungen zu speichern
wbCSV.Close False
End With
'nächste CSV-Datei holen
strFilename = Dir
Wend
'Screen wieder aktualisieren
Application.ScreenUpdating = True
Application.DisplayAlerts = True
'Objekte freigeben
Set fso = Nothing
End Sub
Zitat von @Ikaner:
jetzt hab ich dich extra nicht angeschrieben, um dir nicht auf die Nerven zu gehen. =D
und zack hab ich ne Antwort - danke
kam gerade hier vorbei, und dachte das machen wir schnell, so braucht sich niemand erst in den Code einlesen jetzt hab ich dich extra nicht angeschrieben, um dir nicht auf die Nerven zu gehen. =D
und zack hab ich ne Antwort - danke
Grüße Uwe
Zitat von @Ikaner:
muss ich im Code noch was ändern, wenn mehr Zellen und Spalten hinzu kommen? bzw. macht das dem Code was aus, wenn Zellen
ausgeblendet sind?
nein geht out-of-the-box, nur die Spalte (B) und Zeile(2) in denen die Koordinaten stehen (Zeile 27/28 im Code) musst du ändern wenn du die Matrix woanders auf dem Sheet platzieren willst.muss ich im Code noch was ändern, wenn mehr Zellen und Spalten hinzu kommen? bzw. macht das dem Code was aus, wenn Zellen
ausgeblendet sind?