Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1428to1432
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Auswertung von mehreren Dateien mit VBA

Auswertung von mehreren Dateien mit VBA
14.06.2015 14:13:24
mehreren
Hallo Liebes Forum,
ich habe ein recht komplexes Problem, vielleicht könnt ihr mir ein paar Tipps geben.
Ich habe über 100 Excel Dateien mit Werten.
Alle Dateien sind gleich aufgebaut.(gleiche Spalten).
Problem 1 - einzelne Datei auswerten
Ich möchte nach einer Zelle suchen (z.B. in Spalte A) in der der Wert 1 das erste mal vorkommt. Anschließend möchte ich benachbarte Zellen kopieren und in ein neues Blatt einfügen.
Außerdem möchte ich in einer anderen Spalte nach dem Maxwert suchen.
Im Kleinen habe ich das jetzt nach mehreren Stunden hinbekommen. Einmal mit der Vergleichsfunktion von Excel und anschließendem Kopieren per VBA und mit der Max-funktion von Excel.
Habt ihr ne Idee, wie ich das alles in VBA realisieren kann?
Problem 2 - alle Dateien auswerten
Habt ihr ne Idee, wie ich automatisiert alle der Dateien auf die gleiche Weise auswerte?
Ideal wäre es, wenn die Namen der Dateien in die erste Spalte geschrieben werden und die gewünschten Werte in die folgenden Spalten kopiert werden.
Vielen Dank im Voraus. Ich bin für jeden Tipp dankbar.
Gruß
Mat

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Auswertung von mehreren Dateien mit VBA
14.06.2015 14:20:58
mehreren
Hallo Mat,
lade eine Beispieltabelle hoch, der Aufbau und die Daten solltem den Original-Dateien entsprechen.
Beschreibe auch, welche Daten du genau willst.
Gruß Sepp

AW: Auswertung von mehreren Dateien mit VBA
14.06.2015 16:33:58
mehreren
Hallo,
Danke fürs schnelle Antworten.
Ich habe jetzt zwei Dateien hochgeladen.
1. Quelldatei - 1_a_1.csv
https://www.herber.de/bbs/user/98185.zip
Musste es zippen, da sie über 300kB ist.
2. Auswertedatei - Auswertung.xlsm

Die Datei https://www.herber.de/bbs/user/98184.xlsm wurde aus Datenschutzgründen gelöscht


Es wird komplizierter, als ich dachte.
Über die Auswertedatei sollen wichtige Daten aus den Quelldateien gezogen werden.
In den Quelldateien, sind die einzelnen Werte durch Kommawerte getrennt.
Für die Auswertung müssen die Werte auf Spalten aufgeteilt werden.
Händisch bekomme ich das hin, in dem ich auf "Daten" "Text in Spalten" klicke und dort
das Komma als Trennzeichen festlege.
Wenn möglich, wäre es super, wenn das auch durch VBA realisiert wird.
Auswertedatei:
Spalte A - hier soll der name der Quelldatei stehen
Spalte B - hier soll der "Position" Wert aus der Zeile stehen, in der "Trigger_Detekt" das erste mal 1 wird.
Spalte C - hier soll eine Differenz aus dem eben geschriebenen Positionswert und dem minimalen "Position" Wert stehen
Spalte D - hier soll der maximale "Kraft" Wert stehen, während "Trigger_Detekt" 1 ist. Das Ergebnis muss durch 10 000 000 000 geteilt werden.
Vielen Dank schon mal.
Mat

Anzeige
AW: Auswertung von mehreren Dateien mit VBA
14.06.2015 18:02:39
mehreren
Hi.
Es funktioniert genau so, wie ich es mir wünsche.
Ich bin baff, in welcher Geschwindigkeit Du das gemacht hast.
Das mit den 10 Milliarden musste doch raus. Habe ich aber schon gefunden.
Also erneut vielen, lieben Dank.
Wenn Du noch Elan hast, wäre es toll, wenn Du in deinem Code kommentieren kannst, was Du gemacht hast.
Dann könnte ich das Dokument künftig eventuell selbst anpassen.
Aber mach dir bitte keinen Stress.
Bin jetzt schon voll zufrieden.
Gruß
Mat

Anzeige
AW: Auswertung von mehreren Dateien mit VBA
14.06.2015 18:12:33
mehreren
Hallo zusammen,
ich wollte schon antworten, habe dann aber glücklicherweise schnell genug registriert, daß Sepp bereits geantwortet hatte: ich bin begeistert! So elegant hätte ich das in absehbarer Zeit nicht hinbekommen: der Code landet gleich in meinem Archiv.
Zu dem "letzten" Problem möchte ich mich aber noch äußern:
ich hatte die .CSV zwecks Übersicht (und Nachvollziehen Deiner Werte) händisch in Spalten aufgeteilt, die 1 gesucht und mit =MAX(K978:K7113) das Maximum gesucht, wobei bei mir tatsächlich 20.393.550.396 ausgegeben wird: der Wert ist also durch 10^10 zu dividieren. Eine msgbox an der entsprechenden Stelle im Code *vor* der Division ergab aber nur die 2,nochwas.
Ich vermute, daß das daran liegt, daß die Werte im engl. Format mit Dezimalpunkt vorliegen - hier kommt X anscheinend mit Dezimalpunkt und Tausendertrennzeichen durcheinander.
Ich weise nur darauf hin, weil es zu irreführenden Ergebnissen in der Auswertung führen könnte.
Ansonsten vielen Dank an Sepp für den erhellenden Code!
Schöne Grüße,
Michael

Anzeige
AW: Auswertung von mehreren Dateien mit VBA
14.06.2015 18:15:16
mehreren
Hallo Micheal,
in meinem Code wird beim Import der Punkt als Dezimal-Trenner verwendet!
Gruß Sepp

ich seh's grad,
14.06.2015 18:51:21
Michael
Sepp,
und habe versuchsweise in der Zeile drunter auch noch den Punkt reingesetzt, also:
.TextFileDecimalSeparator = "."
.TextFileThousandsSeparator = "."
und, siehe da, es kommt dann auch (richtig) 2,nochwas raus, wenn ich Dein Makro laufen lasse.
X kann also anscheinend beide Kriterien "gleichzeitig" verarbeiten.
Schöne Grüße,
Michael

Anzeige
Sorry, war quatsch ...
15.06.2015 19:28:21
Michael
... denn ich hab mich von dem händischen TextinSpalten narren lassen: tatsächlich stehen in der .CSV-Datei ja keine Zahlen mit Tausendertrennzeichen.
Happy Exceling,
Michael

AW: Auswertung von mehreren Dateien mit VBA
14.06.2015 18:13:16
mehreren
Hallo Mat,
freut mich, dass es klappt.
Hier der Code mit ein paar Kommentaren.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub importCSV()
  Dim objSh As Worksheet
  Dim strFile As String, strPath As String
  Dim vntRet As Variant, varValues() As Variant, varTmp(3) As Variant
  Dim lngI As Long, lngLast As Long
  Dim rng As Range
  Dim lngCalc As Long
  
  On Error GoTo ErrExit 'Fehlerbehandlung
  
  'XL "ruhig" stellen
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = -4135
    .DisplayAlerts = False
  End With
  
  strPath = fncBrowseForFolder 'Verzeichnissauswahl oder alternativ
  
  'strPath = "E:\Forum\Test2" 'Pfad fest vorgeben
  
  If strPath <> "" Then
    strPath = strPath & IIf(Right(strPath, 1) = "\", "", "\")
    
    strFile = Dir(strPath, vbNormal) 'erste Datei im Verzeichnis suchen
    
    Set objSh = ThisWorkbook.Worksheets.Add 'neue tenporäre Tabelle erstellen
    Do While strFile <> "" 'so lange eine Datei gefunden wird
      
      If strFile Like "*.csv" Then 'wenn es eine csv-datei ist
        varTmp(0) = strFile 'Dateiname in temporärem Array speichern
        With objSh
          .Cells.Clear 'Zellen der Tabelle leeren
          'Textdatei importieren
          With .QueryTables.Add(Connection:="TEXT;" & strPath & strFile, _
              Destination:=Range("$A$1"))
            .Name = "temp"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .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, 1, 1)
            .TextFileDecimalSeparator = "."
            .TextFileThousandsSeparator = " "
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
          End With
          Application.StatusBar = "Analysiere Datei: " & strFile
          lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row 'letzte Datenzeile des Importes
          Set rng = .Columns(12).Find(What:="1", LookAt:=xlWhole, LookIn:=xlValues) 'die erste 1 suchen
          If Not rng Is Nothing Then 'wenn "1" gefunden
            varTmp(1) = .Cells(rng.Row, 5).Value 'Position im tem. Array speichern
            vntRet = Application.Min(.Range(.Cells(2, 5), .Cells(lngLast, 5))) 'Minimum Position ermitteln
            If IsNumeric(vntRet) Then
              varTmp(2) = .Cells(rng.Row, 5).Value - vntRet 'Minimum im tem. Array speichern
            End If
            vntRet = Application.Max(.Range(.Cells(rng.Row, 11), .Cells(lngLast, 11))) 'Max. Kraft ab Zeile mit 1 ermitteln
            If IsNumeric(vntRet) Then
              varTmp(3) = vntRet * 10 ^ -10 'Max. im tem. Array speichern
            End If
          End If
        End With
        Redim Preserve varValues(lngI) 'Ausgabearray neu dimensionieren
        varValues(lngI) = Array(varTmp(0), varTmp(1), varTmp(2), varTmp(3)) 'Werte an Array übergeben
        lngI = lngI + 1
        Erase varTmp
      End If
      
      strFile = Dir 'nächste Datei suchen
    Loop
    objSh.Delete
    If lngI > 0 Then
      With Sheets("Ausgabe")
        .Range(.Cells(2, 1), .Cells(.Rows.Count, 4)) = "" 'zellen in "Ausgabe" leeren
        .Cells(2, 1).Resize(UBound(varValues, 1) + 1, 4) = Application.Transpose(Application.Transpose(varValues)) 'Daten aus Array in Tabelle schreiben
      End With
    End If
  End If
  
  'Fehlerbehandlung
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'importCSV'" & vbLf & String(60, "_") & _
        vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
        "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
        .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
        "VBA - Fehler in Prozedur - importCSV"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
    .StatusBar = False
  End With
  
End Sub



Private Function fncBrowseForFolder(Optional ByVal defaultPath = "") As String
  Dim objFlderItem As Object, objShell As Object, objFlder As Object
  
  Set objShell = CreateObject("Shell.Application")
  Set objFlder = objShell.BrowseForFolder(0&, "Ordner auswählen...", 0&, defaultPath)
  
  If objFlder Is Nothing Then GoTo ErrExit
  
  Set objFlderItem = objFlder.Self
  fncBrowseForFolder = objFlderItem.Path
  
  ErrExit:
  
  Set objShell = Nothing
  Set objFlder = Nothing
  Set objFlderItem = Nothing
End Function


Gruß Sepp

Anzeige

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige