david0815
Goto Top

Makro um aus einer xlt.Datei mit 3 Worksheets Daten aus dem 3en ins 2e kopieren.

Hi,
Ich habe ein Problem mit meinem Excel Makro...
In einer xlt-Datei werden Daten (Projekte) in den letzten Worksheet geschrieben.

Diese Projekte haben vorne eine fortlaufende Nummer.
Nun will ich alle Projekte die bspw. eine 1 vorne in ein Arbeitsblatt kopieren (bzw. für dieses Projekt einen neuen Worksheet erstellen) und dieses Arbeitsblatt dann nach dem Projektnamen benennen.
Das ganze soll nun auch für die weiteren Projekte funktionieren sodass die Schleife durchläuft und für jedes Projekt einen weiteren Worksheet erstellt und diese jeweils benennt.

Kann mir da jemand weiterhelfen?

Am Ende, wo er aus der Schleife rausspringt hat er nurnoch ein ** als fortlaufende Nummer vorne.
Diese Funktion habe ich bereits eingebaut, dass er mir da rausspringt.

Content-Key: 184103

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

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

Member: mak-xxl
mak-xxl Apr 26, 2012 at 09:17:20 (UTC)
Goto Top
Moin David0815,

da eine xlt-Datei eine Vorlage darstellt, wird bei deren Öffnen eine Excel-Mappe erzeugt, die Einstellungen der Vorlage erbt. Soll also das Kopieren der Projektdaten aus der Vorlage in die resultierende Mappe erfolgen oder soll sich die Vorlage (bei welchem Ereignis?) selbst modifizieren? Oder möchtest Du das oben geschriebene an einer normalen Excel-Mappe vornehmen und diese dann als Vorlage speichern?

Freundliche Grüße von der Insel - Mario
Member: David0815
David0815 Apr 27, 2012 at 06:51:45 (UTC)
Goto Top
Ich bisher in der xlt ein Makro geschrieben, dass mir aus dem 3en Arbeitsblatt (wo Projekte mit vorne fortlaufender Nummer drinstehen) die Projektnamen ausliest und für jedes Projekt ein weiteres Arbeitsblatt in der xlt-generiert.
Diese werden nach den Projektnamen benannt.
Das Problem was ich jetzt habe ist, dass ich mehreren Zeilen zu einem Projekt habe.

Muster in etwa so:
A B C D E
1 Projektname Daten Daten2 Daten3
1 Projektname Daten Daten2 Daten3


2 Projektname Daten Daten2 Daten3
2 Projektname Daten Daten2 Daten3


Jetzt möchte ich diese Spalten auch in das richtige Arbeitsblatt (was bereits erstellt wurde) kopieren. Also das Arbeitsblatt mit der Nummer 1 soll die beiden zeilen von 1 erhalten. Von 2 die Daten von 2.
Er selektiert das Zeile für Zeile und nicht beide Zeilen. Daher ein Problem beim Kopieren.
Ich weiß nicht wie ich dem Makro, da er in einer Schleife die Zeilen abläuft mittels UNION oder ähnliches sagen kann, dass er bis ich es sage die Zeilen alle Selektieren soll...

Konnte ich das irgendwie verständlich rüberbringen?

Ist schwer zu erklären...

Mfg David
Member: mak-xxl
mak-xxl Apr 27, 2012 at 08:35:42 (UTC)
Goto Top
Moin David,

Zitat von @David0815:
... Jetzt möchte ich diese Spalten auch in das richtige Arbeitsblatt (was bereits erstellt wurde) kopieren.

Du meinst Zeilen?!

Konnte ich das irgendwie verständlich rüberbringen?

Soweit ja. Ich habe nur noch nicht begriffen, was das Ganze in einer Vorlage - aber egal.

Da ich nicht weiß, wie Dein Ansatz ist, was man mit den Basisdaten machen darf (sortieren, gruppieren etc.) und man diese Sache vom Ansatz her grundverschieden lösen kann, skizziere ich eine (getestete) Möglichkeit. Den Quelltext bitte in ein Modul kopieren.

Sub ProjektManagement()
    Dim i As Long, j As Long
    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
        With .ThisWorkbook
            .Sheets(1).Range("A1:IV" & .Sheets(1).Range("A" & Rows.Count).End(xlUp).Row).Sort _  
                        Key1:=.Sheets(1).Range("A2"), Order1:=xlAscending, Header:=xlYes, OrderCustom:=1, _  
                        MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
            For i = .Sheets.Count To 2 Step -1
                .Sheets(i).Delete
            Next i
            For i = 2 To .Sheets(1).Range("A" & Rows.Count).End(xlUp).Row  
                If .Sheets(Sheets.Count).Name <> .Sheets(1).Cells(i, 1).Text Then
                    .Sheets(1).Copy After:=.Sheets(.Sheets.Count)
                    .Sheets(.Sheets.Count).Name = .Sheets(1).Cells(i, 1).Text
                End If
                With .Sheets(.Sheets.Count)
                    For j = 2 To .Range("A" & Rows.Count).End(xlUp).Row  
                        If .Cells(j, 1) <> "" And .Cells(j, 1) <> .Name Then  
                            .Rows(j).Delete
                            j = j - 1
                        End If
                    Next j
                End With
            Next i
        End With
        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
End Sub

Der Code geht davon aus, dass auf dem ersten Tabellenblatt die Projektdaten gespeichert sind, speziell in Spalte A die Projektbezeichner. Dieses Blatt wird zunächst sortiert nach Spalte A (Zeile 7). Danach werden alle weiteren, eventuell vorhandenen) Tabellenblätter der Mappe gelöscht (Zeile 11) - unter der Annahme, das stets das Masterblatt aktuelle(re) Daten enthält. Die Projektbezeichner in Spalte A werden durchlaufen, existiert noch kein separates Projektblatt (Zeile 14), wird es angelegt (als Kopie des Masterblattes), benannt und alle Zeilen mit nicht zum Blattnamen passenden Projektbezeichner werden gelöscht (Zeilen 20-23). Das hat den Vorteil, dass automatisch alle Projektblätter alle (auch neuere) Projekte (Zeilen) aus dem Masterblatt (Sheet(1)) haben. Sollte das Masterblatt keine Überschrift tragen, so muss in der Zeile 8 die Referenz (2x) sowie in den Zeilen 13 und 19 der Startwert angepasst werden.
Wenn prinzipiell diese Vorgehensweise (Sortieren, Löschen etc.) auf Deine Daten passt, kann man das Ganze im Detail eleganter gestalten.

Freundliche Grüße von der Insel - Mario
Member: David0815
David0815 Apr 27, 2012 at 11:30:25 (UTC)
Goto Top
Danke dir für deine Mühe !
Ich hab mir selber weiterhelfen können.
Habe die Daten aus dem 3en Worksheet erstmal alle in die einzelnen Worksheets der Projekte kopiert und dann einen GoSub gefahren.
In diesem GoSub hab ich alle Zeilen rausgelöscht die vom Namen her nicht mit dem des Worksheetnamens übereinstimmen.

-> Es dauert jetzt zwar ein paar Sekunden mehr da er erst alle reinkopiert, ist aber soweit in Ordnung.

Mfg David
Mitglied: 76109
76109 Apr 27, 2012 at 22:00:30 (UTC)
Goto Top
Hallo @all!

Eine kleine Anmerkung zum kopieren von Daten. Bei Nutzung der AutoFilter-Funktion, werden mit dem Copy-Befehl nur die sichtbaren Zeilen kopiert.


Gruß Dieter