Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
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

Automatisiertes filtern und abspeichern

Automatisiertes filtern und abspeichern
14.06.2015 18:22:54
wizard
Hallo zusammen, brächte dringen nochmal Hilfe zu folgendem Thread:
https://www.herber.de/forum/messages/1430819.html
Ich komme an der Stelle leider nicht weiter. Hab jetzt eine Datei bei der wie in der Beispieldatei in der ersten Spalte die Unternehmenskennziffer steht, in der zweiten Spalte die Wertpapiernummer und dann folgende in den weiteren Spalten die Datensätze.
Ich möchte nun für jedes Unternehmen eine Datei erstellen in der alle Wertpapiernummern und die entsprechenden Datensätze enthalten sind. Schick wäre es, wenn die Wertpapiernummern dann oben stehen (quaisi über eine Art transportieren-Funktion). Ich stoße gerade mit meinen VBA Kentnisse an die Grenzen und habe schon einiges probiert ohne das es funktioniert. Wäre sehr nett wenn mir jemand helfen könnte =)
Hier die Beispieldatei
https://www.herber.de/bbs/user/98188.xlsx

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Automatisiertes filtern und abspeichern
14.06.2015 19:45:10
wizard
Wow vielen Dank. Das hat mir sehr weiter geholfen!!! Eine Sache habe ich noch auf dem Herzen wenn ich schon solch einen Profi fragen kann. Habe verschiedene Zwischenschritte mittlerweile selbst programmiert. Was ich noch machen müsste ist in all diesen erzeugten Dateien eine Spalte an die Stelle A einzufügen die alle Zeilenittelwert der jeweiligen Zeile von B (also ohne Datumsspalte) bis XFD enthält. Bin hier leider total gescheitert und wäre sehr sehr dankbar für nen Code =)

Anzeige
AW: Automatisiertes filtern und abspeichern
14.06.2015 20:13:12
Sepp
Hallo wizard,
kein Problem, soll die Datumsspalte erhalten bleiben?
Komme aber erst etwas später dazu.
Gruß Sepp

AW: Automatisiertes filtern und abspeichern
14.06.2015 21:28:04
Sepp
Hallo Christopher,
mit Erhalt der Datumsspalte.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub transposeAndExport()
  Dim rng As Range, objWB As Workbook, objSH As Worksheet
  Dim vntUniqe As Variant, vntTmp As Variant
  Dim strExportPath As String
  Dim lngI As Long, lngSheetCount As Long, lngLast As Long
  Dim lngCalc As Long
  
  On Error GoTo ErrExit
  
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = -4135
    .DisplayAlerts = False
  End With
  
  lngSheetCount = Application.SheetsInNewWorkbook
  
  Application.SheetsInNewWorkbook = 1
  
  strExportPath = "E:\Forum\Test3\"
  
  strExportPath = strExportPath & IIf(Right(strExportPath, 1) = "\", "", "\")
  
  With Tabelle1
    Set rng = .Range("A1").CurrentRegion
    vntTmp = .Range("A2:A" & Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row))
    vntUniqe = toArrayUnique(vntTmp)
    For lngI = LBound(vntUniqe) To UBound(vntUniqe)
      Application.StatusBar = "Exportiere Datei " & lngI + 1 & " von " & UBound(vntUniqe) + 1 & " : " & "Firma_" & vntUniqe(lngI) & ".xlsx"
      Set objWB = Workbooks.Add(xlWBATWorksheet)
      Set objSH = objWB.Sheets(1)
      rng.AutoFilter Field:=1, Criteria1:=vntUniqe(lngI)
      rng.SpecialCells(xlCellTypeVisible).Copy
      objSH.Range("A1").PasteSpecial Paste:=xlPasteAll, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=True
      Application.CutCopyMode = False
      objSH.Columns.AutoFit
      objSH.Cells(1, 3).Resize(1, objSH.Columns.Count - 3) = ""
      lngLast = Application.Max(3, objSH.Cells(objSH.Rows.Count, 1).End(xlUp).Row)
      objSH.Columns(1).Insert
      objSH.Cells(2, 1) = "Mittelwert"
      objSH.Range(objSH.Cells(3, 1), objSH.Cells(lngLast, 1)).Formula = "=IFERROR(AVERAGE(C3:XFD3),"""")"
      objSH.Range(objSH.Cells(3, 1), objSH.Cells(lngLast, 1)) = objSH.Range(objSH.Cells(3, 1), objSH.Cells(lngLast, 1)).Value
      objWB.SaveAs strExportPath & "Firma_" & vntUniqe(lngI) & ".xlsx"
      objWB.Close
    Next
    .ShowAllData
  End With
  
  MsgBox "Es wurden " & lngI & " Dateien nach '" & strExportPath & "' Exportiert!", vbInformation
  
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'transposeAndExport'" & 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 - transposeAndExport"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
    .StatusBar = False
    If lngSheetCount > 0 Then .SheetsInNewWorkbook = lngSheetCount
  End With
  
End Sub


Public Function toArrayUnique(Field As Variant, Optional Sort As Integer = 1) As Variant
  'Sort unsortiert = 0, sortiert A-Z = 1, sortiert Z-A = -1
  Dim objArrayList As Object
  Dim lngR As Long, lngC As Long
  
  On Error GoTo ErrExit
  
  Set objArrayList = CreateObject("System.Collections.Arraylist")
  
  With objArrayList
    For lngR = LBound(Field, 1) To UBound(Field, 1)
      For lngC = LBound(Field, 2) To UBound(Field, 2)
        If Not .Contains(Trim(Field(lngR, lngC))) Then
          If Field(lngR, lngC) <> "" Then .Add Trim(Field(lngR, lngC))
        End If
      Next
    Next
    If Sort <> 0 Then .Sort
    If Sort < 0 Then .Reverse
    toArrayUnique = .toArray
  End With
  
  Exit Function
  ErrExit:
  toArrayUnique = -1
End Function


Gruß Sepp

Anzeige
AW: Automatisiertes filtern und abspeichern
14.06.2015 22:18:02
wizard
1000 Dank auf dafür =)
Ich bekomme leider nach rund 300 von 900 Dateien folgende Fehlermeldung. Worauf ist die zurückzuführen?
Userbild

AW: Automatisiertes filtern und abspeichern
14.06.2015 22:33:55
Sepp
Hallo Christopher,
habe deine Datensätze mehr Zeilen als eine Tabelle Spalten hat?
Gruß Sepp

AW: Automatisiertes filtern und abspeichern
15.06.2015 09:15:22
wizard
Das ist bei rund 5 Unternehmen der Fall. Dort ist in der Tat die Anzahl der Wertpapiere größer als die Länge der Datensätze. Kann der Code entsprechend angepasst werden?

Anzeige
AW: Automatisiertes filtern und abspeichern
15.06.2015 09:21:02
wizard
Habe gerad de Code mit der Mittelwert-Berechnung pobiert. Hier erscheint leider nur Mittelwert in der Zeile A2. Die einzelnen Mittelwerte werden jedoch nicht berechnet bzw. die Spalte ist sonst leer.

AW: Automatisiertes filtern und abspeichern
15.06.2015 14:00:16
wizard
Ist das mit den fehlenden Mittelwerten vllt auf die Formel zurückzuführen?
Manuell würde ich das mit de wie folgt erledigen mit der Matrixformel:
{=MITTELWERT(WENN(ISTZAHL(C3:XFD3);C3:XFD3))}
Lässt sich das entsprechend integrieren?

AW: Automatisiertes filtern und abspeichern
15.06.2015 18:37:14
Sepp
Hallo Christopher,
so, jetzt läuft es auch bei mehr Zeile als Spalten! Die Formel habe ich auch angepasst.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub transposeAndExport()
  Dim rng As Range, rngC As Range, objWB As Workbook, objSH As Worksheet, objSHTmp As Worksheet
  Dim vntUniqe As Variant, vntTmp As Variant
  Dim strExportPath As String
  Dim lngI As Long, lngSheetCount As Long, lngLast As Long
  Dim lngCalc As Long
  
  On Error GoTo ErrExit
  
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = -4135
    .DisplayAlerts = False
  End With
  
  lngSheetCount = Application.SheetsInNewWorkbook
  
  Application.SheetsInNewWorkbook = 2
  
  strExportPath = "E:\Forum\Test3\"
  
  strExportPath = strExportPath & IIf(Right(strExportPath, 1) = "\", "", "\")
  
  With Tabelle1
    Set rng = .Range("A1").CurrentRegion
    vntTmp = .Range("A2:A" & Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row))
    vntUniqe = toArrayUnique(vntTmp)
    For lngI = LBound(vntUniqe) To UBound(vntUniqe)
      Application.StatusBar = "Exportiere Datei " & lngI + 1 & " von " & UBound(vntUniqe) + 1 & " : " & "Firma_" & vntUniqe(lngI) & ".xlsx"
      Set objWB = Workbooks.Add
      Set objSH = objWB.Sheets(1)
      Set objSHTmp = objWB.Sheets(2)
      rng.AutoFilter Field:=1, Criteria1:=vntUniqe(lngI)
      Set rngC = rng.SpecialCells(xlCellTypeVisible)
      rngC.Copy
      objSHTmp.Range("A1").PasteSpecial Paste:=xlPasteAll, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False
      Application.CutCopyMode = False
      objSHTmp.Range("A1").CurrentRegion.Resize(RowSize:=Application.Min(objSH.Columns.Count - 1, objSHTmp.Range("A1").CurrentRegion.Rows.Count)).Copy
      objSH.Range("A1").PasteSpecial Paste:=xlPasteAll, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=True
      Application.CutCopyMode = False
      objSH.Columns.AutoFit
      objSH.Cells(1, 3).Resize(1, objSH.Columns.Count - 3) = ""
      lngLast = Application.Max(3, objSH.Cells(objSH.Rows.Count, 1).End(xlUp).Row)
      objSH.Columns(1).Insert
      objSH.Cells(2, 1) = "Mittelwert"
      objSH.Cells(3, 1).FormulaArray = "=IFERROR(AVERAGE(IF((ISNUMBER(C3:XFD3))*(C3:XFD3<>""""),C3:XFD3)),"""")"
      objSH.Range(objSH.Cells(3, 1), objSH.Cells(lngLast, 1)).FillDown
      objWB.SaveAs strExportPath & "Firma_" & vntUniqe(lngI) & ".xlsx"
      objSHTmp.Delete
      objSH.Cells(1, 1).Select
      objWB.Close
    Next
    .ShowAllData
  End With
  
  MsgBox "Es wurden " & lngI & " Dateien nach '" & strExportPath & "' Exportiert!", vbInformation
  
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'transposeAndExport'" & 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 - transposeAndExport"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
    .StatusBar = False
    If lngSheetCount > 0 Then .SheetsInNewWorkbook = lngSheetCount
  End With
  
  Set objWB = Nothing
  Set objSH = Nothing
  Set objSHTmp = Nothing
  Set rng = Nothing
  Set rngC = Nothing
End Sub


Public Function toArrayUnique(Field As Variant, Optional Sort As Integer = 1) As Variant
  'Sort unsortiert = 0, sortiert A-Z = 1, sortiert Z-A = -1
  Dim objArrayList As Object
  Dim lngR As Long, lngC As Long
  
  On Error GoTo ErrExit
  
  Set objArrayList = CreateObject("System.Collections.Arraylist")
  
  With objArrayList
    For lngR = LBound(Field, 1) To UBound(Field, 1)
      For lngC = LBound(Field, 2) To UBound(Field, 2)
        If Not .Contains(Trim(Field(lngR, lngC))) Then
          If Field(lngR, lngC) <> "" Then .Add Trim(Field(lngR, lngC))
        End If
      Next
    Next
    If Sort <> 0 Then .Sort
    If Sort < 0 Then .Reverse
    toArrayUnique = .toArray
  End With
  
  Exit Function
  ErrExit:
  toArrayUnique = -1
End Function


Gruß Sepp

Anzeige
AW: Automatisiertes filtern und abspeichern
15.06.2015 20:28:00
wizard
Das mit den mehr Zeilen als Spalten läuft super - danke hierfür! Aber bei manchen Dateien werden die Mittelwerte nicht angegeben. Woran könnte das hängen? Am #NV in manchen Zeilen hängt es nicht, habe ich schon geprüft und wird durch den Code ja auch gelöst. Sieht fast so aus als ob der Automatismus bei höherer Anzahl von Spalten keinen Mittelwert ausgibt. Kann das sein?

AW: Automatisiertes filtern und abspeichern
15.06.2015 21:42:25
Sepp
Hallo Christopher,
glaub ich nicht, denn es wird ja nicht die gesamte Zeile angegeben, was erhälst du, wenn du die Formel per Hand einträgst?
Gruß Sepp

Anzeige
AW: Automatisiertes filtern und abspeichern
15.06.2015 21:51:38
wizard
Wenn ich sie per Hand eintrage als Matrixformel mit Strg Shift Return abschließe geht es... hmm.
Hast du ne Idee wo es noch dran liegen könnte?

AW: Automatisiertes filtern und abspeichern
15.06.2015 21:57:31
wizard
Ich glaube die eingetragene Matrixformel ist falsch. Muss so heißen:
=MITTELWERT(WENN(ISTZAHL(C7639:XFD7639);C7639:XFD7639))
und steht drin als:
=WENNFEHLER(MITTELWERT(WENN((ISTZAHL(C7639:XFD7639))*(C7639:XFD7639"");C7639:XFD7639));"")
Wie ändere ich sie in VBA Schreibweise ab?

AW: Automatisiertes filtern und abspeichern
15.06.2015 22:06:38
Sepp
Hallo Christopher,
die Formel ist nicht falsch, sondern nur erweitert!
Deine Formel so:
objSH.Cells(3, 1).FormulaArray = "=AVERAGE(IF(ISNUMBER(C3:XFD3),C3:XFD3))"

Gruß Sepp

Anzeige
AW: Automatisiertes filtern und abspeichern
15.06.2015 22:15:21
wizard
Genau die hab ich eingegeben und das funktioniert. Nur bei der Erweiterung hab ich versucht was abzuändern, aber so klappt es leider nicht. Wo ist das der Fehler?
"=IF(IFERROR(AVERAGE(IF((ISNUMBER(C3:XFD3)),C3:XFD3))),"""",AVERAGE(IF((ISNUMBER(C3:XFD3)),C3:XFD3)))"

AW: Automatisiertes filtern und abspeichern
15.06.2015 22:20:32
Sepp
Hallo Christopher,
bei WENNFEHLER() darfst du den True-Part nicht zweimal eingeben, das kann nicht funktionieren. Und das separate WENN() drumherum ist nonsense. Von den überflüssigen Klammern mal abgesehen.
Gruß Sepp

Anzeige
AW: Automatisiertes filtern und abspeichern
15.06.2015 22:25:59
wizard
Wie würdest du denn vorgehen um die Fehlermeldung bei der Grundformel "=AVERAGE(IF(ISNUMBER(C3:XFD3),C3:XFD3))" weg zu bekommen?

AW: Automatisiertes filtern und abspeichern
15.06.2015 22:27:41
Sepp
Hallo,
=IFERROR(AVERAGE(IF(ISNUMBER(C3:XFD3),C3:XFD3)),"""")
Gruß Sepp

AW: Automatisiertes filtern und abspeichern
15.06.2015 22:28:47
wizard
Wenn ich das hier manuell eingebe kommen in allen Zeilen Ergebnisse. Ist sowas ähnliches auch über VBA machbar?
=WENN(ISTFEHLER(MITTELWERT(WENN(ISTZAHL(C3:XFD3);C4:XFD3)));"#NA";MITTELWERT(WENN(ISTZAHL(C3:XFD3); C3:XFD3)))

Anzeige
AW: Automatisiertes filtern und abspeichern
15.06.2015 22:47:04
Sepp
Hallo,
"=IF(ISERROR(AVERAGE(IF(ISNUMBER(C3:XFD3),C4:XFD3))),""#NA"",AVERAGE(IF(ISNUMBER(C3:XFD3), C3:XFD3)))"
Gruß Sepp

AW: Automatisiertes filtern und abspeichern
16.06.2015 13:57:13
wizard
Danke nochmal =)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige