ikaner
Goto Top

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)

6cc5f3052180ec78515386213eaf4748

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 ^^

Content-Key: 250964

Url: https://administrator.de/contentid/250964

Printed on: April 19, 2024 at 21:04 o'clock

Member: colinardo
colinardo Oct 04, 2014 updated at 11:45:39 (UTC)
Goto Top
Moin Patrik,
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
Grüße Uwe
Member: Ikaner
Ikaner Oct 04, 2014 at 11:46:36 (UTC)
Goto Top
Hallo Uwe,

jetzt hab ich dich extra nicht angeschrieben, um dir nicht auf die Nerven zu gehen. =D

und zack hab ich ne Antwort - danke face-wink
Member: colinardo
colinardo Oct 04, 2014 updated at 11:51:24 (UTC)
Goto Top
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 face-wink
kam gerade hier vorbei, und dachte das machen wir schnell, so braucht sich niemand erst in den Code einlesen face-smile

Grüße Uwe
Member: Ikaner
Ikaner Oct 04, 2014 at 12:15:34 (UTC)
Goto Top
Achso ok face-smile

Es funktioniert einwandfrei. face-big-smile

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?

Grüße Patrick
Member: colinardo
colinardo Oct 04, 2014 updated at 12:19:45 (UTC)
Goto Top
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.
Member: Ikaner
Ikaner Oct 04, 2014 at 12:25:13 (UTC)
Goto Top
Alles klar. danke dir face-big-smile