css1977
Goto Top

Zeilen einfügen mit VBA

Zeilen einfügen mit VBA in Excel

Hallo zusammen,

ich habe folgendes Problem: Meine Exceldatei besteht aus 3 Spalten (Kalenderwoche, Titel, Verkäufe) und sieht beispielsweise wie folgt aus:


KW Titel Verkäufe
1 a 8
2 a 7
3 a 6
4 a 5
5 a 3
7 a 12
2 b 8
3 b 7
4 b 4
6 b 3
8 b 2


Ich möchte diesen Datensatz nun erweitern, indem Kalenderwochen hinzugefügt werden, wo es keine Verkäufe gibt (bei Titel a ist es Kalenderwoche 6, bei Titel b ist es Kalenderwoche 5 und 7). Lediglich die erste Kalenderwoche ist variabel, d.h. Titel b kann mit der 2. Kalenderwoche anfangen. Wichtig wäre mir zudem, dass die Verkäufe für die hinzugefügten Kalenderwochen eine Null erhalten und der Titel in der neuen Zeile mit kopiert wird. Der finale Datensatz sollte dann folgendermaßen aussehen:

KW Titel Verkäufe
1 a 8
2 a 7
3 a 6
4 a 5
5 a 3
6 a 0
7 a 12
2 b 8
3 b 7
4 b 4
5 b 0
6 b 3
7 b 0
8 b 2

Es wäre super, wenn mir jemand einen Tipp geben könnte, ich hoffe, ich habe mich verständlich ausgedrückt.

Viele Grüße

Content-Key: 117061

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

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

Member: bastla
bastla May 29, 2009 at 13:15:27 (UTC)
Goto Top
Hallo CSS1977 und willkommen im Forum!

Unter der Annahme, dass die Zeilen nach Titel und innerhalb des Titels nach KW sortiert sind, könnte das so gehen:
[Edit] Auf Anregung von didi1954 Sortierung hinzugefügt [/Edit]
Sub EinfKW()
Set StartAdresse = Range("A2")  

StartAdresse.CurrentRegion.Sort Key1:=StartAdresse.Offset(0, 1), Key2:=StartAdresse, Order1:=xlAscending, Order2:=xlAscending, Header:=xlYes

AbZeile = StartAdresse.Row
AbSpalte = StartAdresse.Column

Zeile = AbZeile
Do While Cells(Zeile, AbSpalte) <> ""  
    KW = Cells(Zeile, AbSpalte)
    Titel = Cells(Zeile, AbSpalte + 1)
    If Titel = LetzterTitel Then
        If KW <> LetzteKW + 1 Then
            KW = LetzteKW + 1
            Rows(Zeile).Insert
            With Cells(Zeile, AbSpalte)
                .Value = KW
                .Offset(0, 1) = Titel
                .Offset(0, 2) = 0
            End With
        End If
    End If
    LetzterTitel = Titel
    LetzteKW = KW
    Zeile = Zeile + 1
Loop
End Sub
Die Zeile 2 legt die erste Zelle des Datenblocks fest.

Grüße
bastla
Mitglied: 76109
76109 May 29, 2009 at 19:47:23 (UTC)
Goto Top
Gelöscht.
Member: bastla
bastla May 29, 2009 at 19:55:09 (UTC)
Goto Top
Hallo didi1954!

Schön face-smile - bis auf die Tatsache, dass unnötig ("Lediglich die erste Kalenderwoche ist variabel, d.h. Titel b kann mit der 2. Kalenderwoche anfangen.") eine Zeile für KW 1, Titel "b" eingefügt wird, und bei Änderung der Startzelle eine Menge Konstanten (Spaltenindizes!) anzupassen sind ...

Grüße
bastla

[Edit] Zählung der zu ändernden Konstanten von ursprünglich 4 gändert [/Edit]
Mitglied: 76109
76109 May 29, 2009 at 20:10:09 (UTC)
Goto Top
Gelöscht.
Member: bastla
bastla May 29, 2009 at 20:14:39 (UTC)
Goto Top
@76109
Was meinst Du mit Startzelle 4
4 war nur das Ergebnis der ersten (oberflächlichen) Zählung von Konstanten (mittlerweile komme ich auf einige mehr und habe daher meinen Kommentar editiert), die anzupassen wären, wenn zB die Daten ab Zelle C5 eingetragen wären ...

Grüße
bastla
Mitglied: 76109
76109 May 29, 2009 at 20:59:59 (UTC)
Goto Top
Hallo bastla!

Stimmt. Das wäre natürlich ein Problem, wenn die Angaben im Beitrag nicht zutreffend sind.
Um diesem Risiko aus dem Weg zu gehen, ziehe ich es vor meinen Code zu entfernenface-smile

Gruß Dieter
Member: bastla
bastla May 29, 2009 at 21:03:46 (UTC)
Goto Top
@76109
Um diesem Risiko aus dem Weg zu gehen, ziehe ich es vor meinen Code zu entfernenface-smile
Fände ich schade - warum versuchst Du nicht eher, ihn zu parametrisieren (etwa unter Verwendung von "Offset" oder zB "Resize" bei der Zuweisung des Arrays)?

Grüße
bastla
Mitglied: 76109
76109 May 30, 2009 at 11:49:40 (UTC)
Goto Top
Hallo bastla!

Zitat von @bastla:
warum versuchst Du nicht eher, ihn zu parametrisieren

Also gut, dann aber gleich mit der automatischen Suche nach dem Datensatzface-smile

Sub InsertKW()
    Dim Daten As Object, SortR As Range, Sort1 As Range, Sort2 As Range, Titel As String
    Dim KW As Integer, k As Integer, t As Integer, v As Integer, z As Integer
    
    Set Daten = Rows.Find("Titel", LookAt:=xlPart): If Daten Is Nothing Then Exit Sub  
    
    With Daten
        If .CurrentRegion.Columns.Count <> 3 Or .CurrentRegion.Rows.Count = 1 Then Exit Sub
        Set Sort1 = Range(.Cells.Address)
        Set Sort2 = Range(.Offset(0, -1).Address)
        Set SortR = Range(.CurrentRegion.Address)
        t = .Column:  k = t - 1:  v = t + 1:  z = .Row + 1
    End With
    
    SortR.Sort Key1:=Sort1, Key2:=Sort2, OrderCustom:=1, Header:=xlYes
    
    Do Until Cells(z, t) = ""  
        If Titel <> Cells(z, t) Then Titel = Cells(z, t): KW = 1
        If Cells(z, k) <> KW Then Rows(z).Insert:  Range(Cells(z, k), Cells(z, v)) = Array(KW, Titel, 0)
        z = z + 1: KW = KW + 1
    Loop
End Sub

Gruß Dieter

PS. Sort [xlAscending] ist Standard

[Edit]
Soll stets der erste KW-Eintrag pro Titel als Basis genommen werden, z.B. Titel = b und KW = 2, dann die Zeile 18 durch diese Zeile ersetzen
If Titel <> Cells(z, t) Then Titel = Cells(z, t):  KW = Cells(z, k)
[/Edit]
Member: bastla
bastla May 30, 2009 at 13:58:38 (UTC)
Goto Top
@76109
Freut mich, dass Du Dir die Mühe gemacht und einen noch besseren Ansatz gefunden hast. face-smile

PS. Sort [xlAscending] ist Standard
Ich weiß das - aber Excel ...

Versuch mal, zB die Daten in der Tabelle nach der Spalte "Verkäufe" absteigend und nach "KW" aufsteigend zu sortieren, und danach die Sortierung per VBA ohne Angabe der "Order" ...

Grüße
bastla
Mitglied: 76109
76109 May 30, 2009 at 14:08:03 (UTC)
Goto Top
Hallo bastla!

Zitat von @bastla:
Freut mich, dass Du Dir die Mühe gemacht und einen noch besseren Ansatz gefunden hast. face-smile
Na, wenn Du zufrieden bist, dann bin ich es auchface-smile
Versuch mal, zB die Daten in der Tabelle nach der Spalte "Verkäufe" absteigend > und nach "KW" aufsteigend zu sortieren
In dem Fall wird es wohl nicht funktionieren?

Gruß und schöne Pfingsten
Dieter