Makro, das nach Verschieben von Zellen Formel automatisch ergänzt

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Lapana.

    Makro, das nach Verschieben von Zellen Formel automatisch ergänzt

    Hallo,

    Ich helfe momentan in einer Firma aus und habe die Aufgabe bekommen, ein Makro zu erstellen, welches zuerst Zeilen ergänzt und dann weiter unten im Dokument die Formel um einige Zellen ergänzt. Ich habe das Makro zwar soweit, dass es die Zeilen einfügt, allerdings "verschiebt" es die Formel dann nicht um die paar Zeilen nach unten, sondern fügt diese dann in die ursprüngliche Zelle wieder ein und bringt so die ganze Rechnung durcheinander... Ich habe es auch schon mit der relativen Aufzeichnung versucht, doch dann hat er das einfach irgendwo eingefügt :S

    Ich hoffe, es kann mir jemand helfen, denn ich kenne mich nicht wirklich mit VB aus, wie man sich vielleicht denken kann :/
    ActiveWindow.SmallScroll Down:=9
    Range("E199").Select
    ActiveCell.FormulaR1C1 = _
    "=R[-145]C+R[-143]C+R[-139]C+R[-103]C+R[-101]C+R[-97]C+R[-82]C+R[-80]C+R[-76]C+R[-61]C+R[-59]C+R[-55]C+R[-50]C+R[-124]C+R[-122]C+R[-118]C"
    Range("E199").Select
    Selection.AutoFill Destination:=Range("E199:DD199"), Type:=xlFillDefault
    Range("E199:DD199").Select
    ActiveWindow.ScrollColumn = 87
    ActiveWindow.ScrollColumn = 81
    ActiveWindow.ScrollColumn = 78
    ActiveWindow.ScrollColumn = 74
    ActiveWindow.ScrollColumn = 70
    ActiveWindow.ScrollColumn = 65
    ActiveWindow.ScrollColumn = 61
    ActiveWindow.ScrollColumn = 58
    ActiveWindow.ScrollColumn = 52
    ActiveWindow.ScrollColumn = 47
    ActiveWindow.ScrollColumn = 45
    ActiveWindow.ScrollColumn = 41
    ActiveWindow.ScrollColumn = 36
    ActiveWindow.ScrollColumn = 34
    ActiveWindow.ScrollColumn = 30
    ActiveWindow.ScrollColumn = 27
    ActiveWindow.ScrollColumn = 25
    ActiveWindow.ScrollColumn = 21
    ActiveWindow.ScrollColumn = 18
    ActiveWindow.ScrollColumn = 13
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    Range("E208").Select
    ActiveWindow.SmallScroll Down:=6
    ActiveCell.FormulaR1C1 = _
    "=R[-162]C+R[-160]C+R[-156]C+R[-150]C+R[-120]C+R[-118]C+R[-114]C+R[-108]C+R[-99]C+R[-97]C+R[-93]C+R[-87]C+R[-78]C+R[-76]C+R[-72]C+R[-66]C+R[-61]C+R[-54]C+R[-141]C+R[-139]C+R[-135]C+R[-129]C"
    Range("E208").Select
    Selection.AutoFill Destination:=Range("E208:DD208"), Type:=xlFillDefault
    Range("E208:DD208").Select
    ActiveWindow.ScrollColumn = 86
    ActiveWindow.ScrollColumn = 72
    ActiveWindow.ScrollColumn = 47
    ActiveWindow.ScrollColumn = 15
    ActiveWindow.ScrollColumn = 1
    Range("E214").Select
    ActiveWindow.SmallScroll Down:=12
    Range("E217").Select
    ActiveCell.FormulaR1C1 = "=R[-167]C+R[-125]C+R[-104]C+R[-83]C+R[-61]C+R[-146]C"
    Range("E217").Select
    Selection.AutoFill Destination:=Range("E217:DD217"), Type:=xlFillDefault
    Range("E217:DD217").Select
    Range("CU217").Select
    ActiveWindow.ScrollColumn = 88
    ActiveWindow.ScrollColumn = 82
    ActiveWindow.ScrollColumn = 81
    ActiveWindow.ScrollColumn = 77
    ActiveWindow.ScrollColumn = 73
    ActiveWindow.ScrollColumn = 68
    ActiveWindow.ScrollColumn = 60
    ActiveWindow.ScrollColumn = 55
    ActiveWindow.ScrollColumn = 47
    ActiveWindow.ScrollColumn = 42
    ActiveWindow.ScrollColumn = 36
    ActiveWindow.ScrollColumn = 31
    ActiveWindow.ScrollColumn = 23
    ActiveWindow.ScrollColumn = 20
    ActiveWindow.ScrollColumn = 18
    ActiveWindow.ScrollColumn = 17
    ActiveWindow.ScrollColumn = 15
    ActiveWindow.ScrollColumn = 13
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 1
    Range("E221").Select
    End Sub
    Uff.
    Sehe ich richtig, dass du noch nie programmiert hast, sondern versuchst, das Ganze mit Macro-Aufzeichnung zu lösen?

    Macros sind schön und gut, um rauszufinden, welche Objekte und Methoden verwendet werden.
    Aber für eine saubere Automation sollte man schon strukturierter vorgehen.

    Fangen wir mal damit an, das Problem grundsätzlich zu klären.
    Habe ich richtig verstanden, dass du am unteren Ende der Tabelle neue Zeilen einfügen willst und die Formeln der darüberliegenden Zeile nachziehen willst?
    Welche Spalten sollen "neu" sein und in welchen Spalten stehen die Formeln?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also ich muss innerhalb der Tabelle neue Zeilen einfügen, in die man dann jeweils Daten einträgt (Lohn, Stunden etc). Das habe ich bereits als Makro.
    Diese Daten sollen dann unter der Tabelle in mehrere Formeln ergänzt werden, sodass die Daten mit in den Endbetrag einberechnet werden. Das Hauptproblem ist, dass ich keine Ahnung habe, wie ich das hinbekomme, die Daten automatisch einzufügen, obwohl diese Formel sich ja mit weiter nach unten verschiebt.

    Und nein, richtig programmiert habe ich nie, lediglich mit JavaScript in der Schule.

    Schon mal danke!
    Ich tu mir immer noch schwer, zu verstehen, was das Programm tatsächlich machen soll.
    Woran ich erkenne, wo Zeilen eingefügt werden sollen.
    Wie ich programmatisch raus finden kann, was ihn der Formel zu stehen hat.

    Zumindest die hart codierte Summenformel sieht nicht sehr automatisierbar aus.
    Hast du mal darüber nachgedacht, die SUMIF (SUMMEWENN) Formel zu verwenden?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also ich habe mich die letzten tage etwas mehr mit Visual Basic befasst und habe mir daraufhin einen eigenen Code zusammengebastelt und die Tabelle umgestellt.

    Visual Basic-Quellcode

    1. Public Sub DatenEinfügen()
    2. Dim Zelle As Range
    3. Dim i As Integer 'zählt Array rauf
    4. Dim n As Integer 'zählt Array runter
    5. Dim var As Variant 'Formel, die nachher ausgegeben wird
    6. Dim FarbigeZellen(200) As Variant 'Array speichert Zellen für die Formel
    7. Dim alteFormel As String, neueFormel As String 'Formeln
    8. i = 0
    9. Set Zelle = Range("E100")
    10. Application.Volatile
    11. For Each Zelle In ActiveSheet.Range("E100:E1000")
    12. If Zelle.Interior.ColorIndex = RGB(179, 217, 241) Then 'Alle farbigen Zellen auswählen
    13. ActiveCell.Select
    14. ActiveCell.Offset(1, 0).Select
    15. FarbigeZellen(i) = ActiveCell.Value
    16. i = i + 1
    17. End If
    18. Next Zelle
    19. var = ""
    20. Do While FarbigeZellen(i) <> 0 'Array auslesen
    21. var = var + UBound(FarbigeZellen, i)
    22. i = i - 1
    23. Loop
    24. [E45].Activate 'Formel in Zelle einfügen
    25. alteFormel = ActiveCell.Formula
    26. neueFormel = Replace(alteFormel, alteFormel, var)
    27. ActiveCell.Formula = neueFormel
    28. End Sub




    Also zuerst soll ein Array erstellt werden, in dem ich dann der Reihe nach Daten speichern möchte(die jeweiligen Zellnamen, damit sie später in einer Formel weiterverwendet werden können). Hier sollen aber nur die Daten unterhalb des gefärbten Feldes übernommen werden.
    Anschließend möchte ich den Array in einer anderen Zelle "leeren" und die eben schon angesprochene Formel konstruieren. Nun wird kein Fehler angezeigt, wenn ich das Makro ausführe, doch als Ergebnis steht nichts in der Zelle. Nun ist auch die Frage, ob ich überhaupt eine Formel erstellt habe, da ich mir das ganze nur aus dem Internet zusammengesucht habe...

    Ich hoffe, es ist nun verständlicher :/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lapana“ ()