Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1652to1656
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

Für jede Zeile neues Sheet

Für jede Zeile neues Sheet
03.11.2018 12:17:46
Chris
Hallo zusammen,
ich habe ein Problem, was ich zum Teil schon mit den Antworten aus dem Forum lösen könnte, aber leider nicht ganz.
Also ich habe im Tabellenblatt mit dem Namen "Maßnahmen" ab der zweiten Zeile Maßnahmen aufgelistet.Die Maßnahmen werden anhand ihrer ID, die in Spalte B steht, unterschieden. In Spalte C steht ein Startdatum und in Spalte D ein Enddatum .
Nun möchte ich für jede ID ein neues Tabellenblatt erstellen -> das löse ich momentan dank " _ https://www.herber.de/forum/archiv/1132to1136/1135807_Fuer_jede_Zeile_neues_Sheet_und_Daten_transponieren.html" so:

Sub DatenpoolSepariertTransponieren()
Dim lngZ As Long
Dim wsDatenpool As Worksheet
'Name des Tabellenblattes, das die Liste enthält - bitte anpassen :
Set wsDatenpool = Worksheets("Abgeschlossene Maßnahmen")
With wsDatenpool
For lngZ = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
Sheets.Add.Name = .Cells(lngZ, 2) 'Name des neuen Blattes aus Spalte A
.Rows(1).Copy
Next
End With
Application.CutCopyMode = False
Set wsDatenpool = Nothing 'Speicher für Variable wieder freigeben
End Sub

Das Problem ist, dass manche Maßnahmen (mit der selben ID) über mehrere Zeilen gehen und deswegen eine Fehlermeldung kommt, da jedes Tabellenblatt unterschiedlich heißen muss (Dopplung). Filtern/Sortieren oder auch doppelte Maßnahmen löschen funktioniert hier vorab leider nicht, da ich gerne auch das Start und das Enddatum in das neue Tabellenblatt kopieren möchte. Allerdings brauche ich nur das erste Startdatum und das letzte Enddatum --> Vllt. nochmal zum Verständnis: Wenn eine Maßnahme mit dem gleichen Namen über 3 Zeilen geht, hat sie 3 Startdaten (Spalte C) und 3 Enddaten (Spalte D).
Excel sollte also "selber erkennen" über wieviele Zeilen die Maßnahme mit der selben ID geht, dann ein neues Tabellenblatt mit der ID als Name erstellen und anschließend das erste Start- und das letzte Enddatum in das entsprechende Tabellenblatt kopieren.
Ich hoffe das war einigermaßen nachvollziehbar erklärt. Ich bin für jeden Hinweis dankbar.
Viele Grüße,
Chris

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: sheet.Exist
03.11.2018 12:52:45
Fennek
Hallo,
hier sind 2 Varianten um ein "Sheet.Exist" zu prüfen:

if [not(isref(Total!a1))] then sheets.add().name="Total"
Function SheetExists(shName As String) As Boolean
Dim sh As Worksheet
On Error Resume Next
Set sh = Sheets(shName)
On Error GoTo 0
SheetExists = Not sh Is Nothing
End Function
mfg
AW: Für jede Zeile neues Sheet
03.11.2018 13:18:59
Daniel
Hi
wenn man davon ausgehen kann, dass die Ausgangsliste nach der ID-Nummer und den Datumswerten sortiert ist so das gleiche IDs auch direkt untereinander stehen, dann kannst du mit Worksheetfunction.CountIF ermitteln, wie oft eine ID vorkommt und dann in der For-Next-Schleife die Folgezeilen mit der gleichen ID-Nummer einfach überspringen:
 Sub DatenpoolSepariertTransponieren()
Dim lngZ As Long
Dim Anzahl as long
Dim wsDatenpool As Worksheet
'Name des Tabellenblattes, das die Liste enthält - bitte anpassen :
Set wsDatenpool = Worksheets("Abgeschlossene Maßnahmen")
With wsDatenpool
For lngZ = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
Sheets.Add.Name = .Cells(lngZ, 2) 'Name des neuen Blattes aus Spalte A
.Rows(1).Copy
Anzahl = Worksheetfunction.CountIf(.columns(2), .Cells(lngZ, 2))
ActiveSheet.Cells(2, 1) = .Cells(lngZ, 3) 'startdatum
ActiveSheet.Cells(3, 1) = .Cells(lngZ + Anzahl - 1) 'Enddatum
lngZ = lngZ + Anzahl - 1
Next
End With
Application.CutCopyMode = False
Set wsDatenpool = Nothing 'Speicher für Variable wieder freigeben
End Sub
sollte man davon ausgehen müssen, dass die Liste unsortiert ist, wirds etwas komplizierter.
Gruß Daniel
Anzeige
AW: Für jede Zeile neues Sheet
03.11.2018 14:24:27
Chris
Hallo Daniel,
vielen Dank für die schnelle Rückmeldung. Genau, die gleichen ID's der Maßnahmen stehen immer untereinander und sind auch nach Datum sortiert.
Habe es auch schon ausprobiert und es macht fast was ich möchte. Die Bezeichnung des Tabellenblatts und das Startdatum stimmen, nur das Enddatum wird leider nicht korrekt bzw. gar nicht angezeigt. Ich verstehe den Befehl leider nicht, aber im ersten neu erzeugten Tabellenblatt wird mir anstelle des gewünschten Enddatums der Inhalt aus der Zelle B1 ("Einsatz-ID" angezeigt. In den darauffolgenden neu erzeugten Tabellenblättern wird dann gar kein Wert des Enddatums mehr angezeigt. Hast du da vllt. noch eine Idee?
Vielen Dank schonmal und viele Grüße,
Chris
Anzeige
AW: Für jede Zeile neues Sheet
03.11.2018 14:30:16
Daniel
Hi
naja, du musst deinen Code schon selber prüfen, ob da auf die richtigen Zellen verwiesen wird und gegebenen Falls auch korrigieren.
Ich kenne jetzt deine Datei nicht und kann den Code auch nicht testen.
und wenn ich sowas hier lese:
Sheets.Add.Name = .Cells(lngZ, 2) 'Name des neuen Blattes aus Spalte A
dann weiß ich auch, dass ich mich auf deine Angaben nicht unbedingt verlassen kann.
also wie gesagt, ich zeige dir das Prinzip (dh hier die Methode, die Anzahl der ID-Nummern zu ermitteln um dann in der Schleife die nicht benötigten Zeilen zu überspringen), für die korrekte Ausführung bist du verantwortlich, ist ja schließlich dein Code.
Gruß Daniel
Anzeige
AW: Für jede Zeile neues Sheet
03.11.2018 15:54:39
Chris
Hallo Daniel,
sorry, du hast ja Recht, da hätte Spalte B stehen müssen. Ich bin leider ein ziemlicher Newb was VBA angeht und habe das Makro von einem anderem Forums-Post kopiert.
Ich habe mal die Datei hochgeladen, allerdings ist mir grad aufgefallen, dass das erste Tabellenblatt nur "Maßnahmen" heißt und im Makro "Abgeschlossene Maßnahmen" steht. Hab dann nochmal versucht es hochzuladen und eine Fehlermeldung bekommen.
https://www.herber.de/bbs/user/125089.xlsm
Würde mich sehr freuen, wenn du dir das mit dem Enddatum vllt. nochmal angucken könntest. Ich habe etwas rumgespielt, aber es bis jetzt leider nicht hinbekommen. Das Problem ist ja, dass eine Maßnahme über unterschiedlich lange Zeilen geht und deswegen nicht weiß wie ich die Zelle des Enddatums auslese.
Vielen Dank und Gruß,
Chris
Anzeige
AW: Für jede Zeile neues Sheet
03.11.2018 16:12:41
Daniel
Hi
naja, wenn die Liste sortiert ist, ist es doch einfach.
wenn beispielsweise eine Indexnummer in Zeile 5 beginnt und 3x vorkommt (das wird mit Worksheetfunction.CountIf ermittelt und in der Variable Anzahl gespeichert) dann steht der letzte Eintrag zu diesem Index in Zeile 7 (5 + 3 - 1, bzw erste Zeile + Anzahl - 1)
damit solltst du selber berechnen können, in welcher Zeile der letzte Eintrag steht.
bedenke weiterhin, dass du für Code, den du dir aus dem Internet kopierst, so verantwortlich bist, als hättest du ihn selber geschrieben, insofern warne ich immer davor, Code blind und ohne ihn zu verstehen aus dem Internet zu kopieren.
im Prinzip funktioniert mein Code, der einzige Fehler den ich drin habe ist, dass ich beim Einfügen des Enddatums vergessen habe, die Spalte anzugeben, aus der der Wert gelesen werden soll (Spalte 4).
ActiveSheet.Cells(3, 1) = .Cells(lngZ + Anzahl - 1, 4) 'Enddatum
da ich nicht weiß, wo das Datum eingetragen werden soll, habe ich einfach mal Zelle A3 angenommen, (Cells(3, 1))
das entsprechend anzupasen und die gewünschte Zeilen- und Spaltennummer einzutragen, solltest du selber hinbekommen.
gruß Daniel
Anzeige
AW: Für jede Zeile neues Sheet
03.11.2018 16:29:19
Chris
Hi Daniel,
klasse, jetzt funktionierts genau so wie ich mir das vorgestellt habe. Vielen Dank!!
Viele Grüße,
Chris
AW: Lösung für unsortierte Liste
03.11.2018 17:05:41
Daniel
hier nochmal ein Code, der auch mit einer unsortierten Liste zurecht kommen würde.
der verwendet allerdings eine etwas fortgeschrittene Programmiertechnik (Dictionary).
Diese sollte man aber kennen, wenn man sich intensiver mit VBA beschäftigen will, weil man damit viele Aufgaben mit wenig Programmieraufwand und auch bei größeren Datenmengen schnell in der Verarbeitung lösen kann.
Sub test()
Dim dicStart As Object
Dim dicEnde As Object
Dim arr, ID
Dim z As Long
Dim Überschriften
arr = Sheets("Abgeschlossene Maßnahmen").UsedRange.Value
Überschriften = Sheets("Abgeschlossene Maßnahmen").UsedRange.Rows(1).Value
Set dicStart = CreateObject("scripting.dictionary")
Set dicEnde = CreateObject("scripting.dictionary")
'--- Start und Enddatum pro ID in Dictionary-Objekt einlesen
For z = 2 To UBound(arr, 1)
ID = arr(z, 2)
If arr(z, 4) > dicEnde(ID) Then dicEnde(ID) = arr(z, 4)
If arr(z, 3) 

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige