Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Formel erweitern über VBA

Formel erweitern über VBA
10.08.2017 09:36:55
Berndt
hallo zusammen,
mein Makro fügt bei Bedarf neue Zeilen ein. Wenn eine neue Zeile eingefügt wird, so wird auch meine Summenformel neu angepasst.
Nun habe ich eine zweite Formel, die ich nun bei einer neuen Zeile ebenfalls anpassen möchte.
Nur daran scheitere ich gerade.
Excel Formel für Zelle F6:
  • =SUMMENPRODUKT(($C$12:$C12=$C$6)*($D$12:$D12="KW "&KÜRZEN((HEUTE()-DATUM(JAHR(HEUTE()+3-REST(HEUTE()-2;7));1;REST(HEUTE()-2; 7)-9) )/7))*($F$12:$F12))/SUMME($F$12:F12)

  • in VBA übersetzt:
  • Range("F6").FormulaR1C1 = "=SUMPRODUCT((R12C3:R[6]C3=R6C3)*(R12C4:R[6]C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1,MOD(TODAY()-2, 7)-9) )/7))*(R12C6:R[6]C6))/SUM(R12C6:R[6]C)"

  • mit einer neuen Zeile soll nun der Fett markierte Bereich in der obigen EXcel Formel um 1 erweitert werden.
    aus $C12 wird z.B. $C13.
    Ich hoffe ihr könnt mir helfen.
    Danke und Grüße
    Berndt
    Anzeige

    11
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    Das steckt
    10.08.2017 10:02:24
    lupo1
    
    Range("F6:F7").Filldown            'Kopiere die Formel in F7 ...
    Range("F7").Cut: Range("F6").Paste '... und versetze sie zurück nach F6
    

    AW: Formel erweitern über VBA
    10.08.2017 10:02:53
    ChrisL
    Hi Berndt
    Vielleicht wäre eine Möglichkeit der Zelle einen Namen zu vergeben z.B.
    =SUMME($F$12:EinName)
    Ansonsten wüsste ich aufgrund deiner Beschreibung nicht, wie zu erkennen wäre, wo sich die relevanten Zellen gerade befinden.
    cu
    Chris
    Anzeige
    AW: Formel erweitern über VBA
    10.08.2017 10:21:32
    Rainer
    Hallo Berndt,
    du kannst die Bereiche auch über INDEX() zuweisen, z.B.
    
    =SUMME($C$12:$C20)
    

    ist gleich wie
    
    =SUMME(index(C:C,12):index(C:C,20))
    
    anstelle der Angabe der Zeilennummer in der INDEX Formel kannst du eine Zelle oder Variable eingeben. Dein Makro muss dann nur zählen, wieviele Zeilen es eingefügt hat und die zweite INDEX Formel anpassen (da wo im Beispiel "20" steht)
    Gruß,
    Rainer
    Anzeige
    vll. hilft das
    10.08.2017 13:06:11
    Berndt
    Vll. habe ich mich auch etwas kompliziert ausgedrückt.
    Deswegen mal eine Bsp.-Datei:
    https://www.herber.de/bbs/user/115371.xlsm
    betätigt einmal den Button "neue Aufgabe/... einfügen" und wählt dann A und OK.
    Eine neue Zeile wird durch Makro eingeführt.
    aber die Formeln in z.B. F6 werden nicht erweitert.
    Grüße
    Berndt
    Anzeige
    Ein ZellBezug in einer Fml wird nur genau dann ...
    10.08.2017 20:05:17
    Luc:-?
    …automatisch von Xl erweitert, Bendt,
    wenn es sich dabei …
    1. um einen echten Bezug, keinen AdressText, oder seinen Namen handelt (ebenfalls nicht als Text);
    2. eingefügte Zeilen oder Spalten zwischen der erst- und der letztgenannten eingefügt wdn.
    In allen anderen Fällen wird der Bezug nicht erweitert, es sei denn, es handelte sich um Zeilen oder Spalten einer definierten Tabelle. Ein benannter Bereich sollte also von derartiger Größe sein, dass Einfügungen immer innerhalb seiner Grenzen erfolgen → ggf (geschützte) Leerzeilen/-spalten vorsehen!
    Gruß, Luc :-?
    Besser informiert mit …
    Anzeige
    aber...
    11.08.2017 11:38:34
    Berndt
    ...warum funktioniert die Bsp. Datei dann mit der Erweiterung der ebenfalls enthaltenen Summenformel.
    Diese wird nämlich gemäß Makro erweitert.
    Ich habe versucht die jetztige Formel genau wie die eben gesagte ins Makro einzubinden. Nur dies will anscheinend nicht funktionieren.
    GRuß Berndt
    Anzeige
    AW: aber...
    12.08.2017 16:47:27
    fcs
    Hallo Bernd,
    man muss die Zeile in den Formeln im Bereich F6:J8 hier mit einem absoluten Bezug einbauen, d.h. die Zeile muss erst berechnet werden.
    Bei der Summenformel für die KW funktioniert es nur, wenn auch eine Tätigkeit in Spalte B eingetragen wurde, ansonsten gibt es Formel/Werte-Chaos.
    Die Summenzeile kann man z.B. ermitteln, indem man in Spalte B nach "Problemspeicher" sucht und dann 2 abzieht.
    Alternativ ginge auch eine Suche in Spalte K nach "*Summe aktuelle KW".
    Gruß
    Franz
    Private Sub CommandButton2_Click()
    ' neue Zeile einfügen für Aufgabe oder Problem
    Dim EZ As Double
    Dim Ab As Double
    Dim WoEinf As String
    Dim ZL As Long
    Application.ScreenUpdating = False
    WoEinf = InputBox("(A)ufgabe" & vbLf & "(P)roblem", _
    "Wo möchten Sie eine neue Zeile hinzufügen?", "A")
    Select Case UCase(WoEinf)
    Case "A"
    EZ = UF_neueZeile(12, True) '8
    'Zeile mit Summenzeile
    ZL = Range("B:B").Find(What:="Problemspeicher", LookIn:=xlValues, _
    lookat:=xlPart).Row - 2
    'Summenformeln für aktuelle KW
    Range("F" & ZL & ":J" & ZL).FormulaR1C1 = _
    "=SUMPRODUCT(((R12C4:R[-1]C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+" _
    & "3-MOD(TODAY()-2,7)),1,MOD(TODAY()-2, 7)-9) )/7))+(R12C4:R[-1]C4=""""))" _
    & "*(R12C:R[-1]C))"
    'Zeile oberhalb Summenzeile
    ZL = ZL - 1
    'Summenformeln für Cluster
    Range("F6:J8").FormulaR1C1 = _
    "=IFERROR(SUMPRODUCT((R12C3:R" & ZL & "C3=RC3)*(R12C4:R" & ZL _
    & "C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1," _
    & "MOD(TODAY()-2, 7)-9) )/7))*(R12C:R" & ZL & "C))/SUM(R12C:R" & ZL & "C),0)"
    Cells(EZ, 2).Select
    Case "P"
    'Text:  Problemspeicher nach unten suchen
    EZ = Cells(12, 2).End(xlDown).Row '8
    If Trim(Cells(EZ, 2)) = "Problemspeicher" Then
    'Es wurden noch keine Aufgaben eingetragen
    EZ = UF_neueZeile(EZ + 1, True)
    Cells(EZ, 2).Select
    Else
    EZ = Cells(EZ, 2).End(xlDown).Row
    If Trim(Cells(EZ, 2)) = "Problemspeicher" Then
    EZ = UF_neueZeile(EZ + 1, True)
    Cells(EZ, 2).Select
    Else
    MsgBox "Kann Text: -Problemspeicher- nicht finden"
    End If
    End If
    Case Else
    '            Exit Sub
    End Select
    Application.ScreenUpdating = True
    End Sub
    

    Anzeige
    Tausend Dank
    14.08.2017 09:19:24
    Berndt
    Ich danke dir vielmals für deine Hilfe.
    Deine Version des Makros ist ja noch viel besser als gedacht.
    GLG
    Berndt
    AW: Tausend Dank
    14.08.2017 12:29:56
    fcs
    Hallo bernd,
    danke für die Rückmeldung.
    Ja, da hab ich mir die Mühe gemacht, die Formel in F6 so mit absoluten und relativen Bezügen für die Zeilen/Spalten aufzubauen, dass sie nach rechts und nach unten kopiert werden kann.
    So kann dann die Formel im Makro dann in einer Anweisung in den Bereich F6:J8 eingefügt werden.
    Gruß
    Franz
    Anzeige
    ich sehe gerade...
    15.08.2017 16:14:05
    Berndt
    ...beim test des Makros folgendes:
                  'Summenformeln für Cluster
    Range("F6:J8").FormulaR1C1 = _
    "=IFERROR(SUMPRODUCT((R12C3:R" & ZL & "C3=RC3)*(R12C4:R" & ZL _
    & "C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1," _
    & "MOD(TODAY()-2, 7)-9) )/7))*(R12C:R" & ZL & "C))/SUM(R12C:R" & ZL & "C),0)"
    
    im Fett markierten Bereich wird mir das ermittelte Ergebnis durch die gesamtsumme ausgeworfen. Sozusagen ein Mittelwert.
    Allerdings sollte auch hier nur die Summe verwendet werdern, welche die aktuelle KW besitzt.
    Kann man da statt SUM noch SUMPRODUCT einbauen?
    VG Berndt
    Anzeige
    Habs
    15.08.2017 16:41:33
    Berndt
    ich habe es selbständig gelöst. Danke nochmals.
                'Summenformeln für Cluster
    Range("F6:J8").FormulaR1C1 = _
    "=IFERROR(SUMPRODUCT((R12C3:R" & ZL & "C3=RC3)*(R12C4:R" & ZL _
    & "C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1," _
    & "MOD(TODAY()-2, 7)-9) )/7))*(R12C:R" & ZL & "C))/SUMPRODUCT((R12C4:R" & ZL _
    & "C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1," _
    & "MOD(TODAY()-2, 7)-9) )/7))*(R12C:R" & ZL & "C)),0)"
    

    Anzeige
    ;
    Anzeige
    Anzeige

    Infobox / Tutorial

    Formel erweitern über VBA


    Schritt-für-Schritt-Anleitung

    Um eine Excel-Formel über VBA zu erweitern, kannst du folgendes Vorgehen verwenden:

    1. Öffne den VBA-Editor:

      • Drücke ALT + F11, um den VBA-Editor zu öffnen.
    2. Erstelle ein neues Modul:

      • Klicke im Projekt-Explorer mit der rechten Maustaste auf dein Projekt und wähle Einfügen > Modul.
    3. Füge den folgenden Code ein:

      Sub FormelErweitern()
         Dim ZL As Long
         ' Ermittle die letzte Zeile in Spalte C
         ZL = Cells(Rows.Count, 3).End(xlUp).Row
      
         ' Setze die Formel in Zelle F6
         Range("F6").FormulaR1C1 = "=SUMPRODUCT((R12C3:R" & ZL & "C3=R6C3)*(R12C4:R" & ZL & "C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1,MOD(TODAY()-2, 7)-9))/7))*(R12C:R" & ZL & "C))/SUMPRODUCT((R12C4:R" & ZL & "C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1,MOD(TODAY()-2, 7)-9))/7))*(R12C:R" & ZL & "C)),0)"
      End Sub
    4. Führe das Makro aus:

      • Drücke F5, um das Makro auszuführen. Die Formel in Zelle F6 wird nun automatisch auf die aktuelle Zeilenanzahl in Spalte C angepasst.

    Häufige Fehler und Lösungen

    • Fehler: Formel wird nicht erweitert
      Lösung: Stelle sicher, dass du die Formel in einem absoluten Bezug richtig gesetzt hast. Verwende $C$12 für die Anfangszeile.

    • Fehler: Ergebnis zeigt falsche Werte
      Lösung: Überprüfe, ob in der Spalte B Werte eingetragen sind. Fehlende Werte können dazu führen, dass die Berechnung nicht korrekt ist.


    Alternative Methoden

    1. Verwendung von benannten Bereichen:
      Du kannst die Formel auch so gestalten, dass sie auf einen benannten Bereich verweist:

      =SUMME($C$12:MeinBereich)
    2. Einsatz von INDEX-Funktion:
      Eine weitere Möglichkeit ist die Verwendung der INDEX-Funktion, um dynamische Bereiche zu definieren:

      =SUMME(INDEX($C:$C,12):INDEX($C:$C,20))

    Praktische Beispiele

    Hier ist ein Beispiel für eine Summenformel, die in Zelle F6 verwendet werden kann:

    Range("F6").FormulaR1C1 = "=SUMPRODUCT((R12C3:R[-1]C3=R6C3)*(R12C4:R[-1]C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1,MOD(TODAY()-2, 7)-9))/7))*(R12C:R[-1]C))/SUMPRODUCT((R12C4:R[-1]C4=""KW ""&TRUNC((TODAY()-DATE(YEAR(TODAY()+3-MOD(TODAY()-2,7)),1,MOD(TODAY()-2, 7)-9))/7))*(R12C:R[-1]C)),0)"

    Diese Formel passt sich dynamisch an die aktuelle Kalenderwoche (KW) an.


    Tipps für Profis

    • Optimierung von Makros: Verwende Application.ScreenUpdating = False, um die Ausführungsgeschwindigkeit zu erhöhen, während das Makro läuft.

    • Vermeide harte Kodierungen: Nutze Variablen für Zeilen- und Spaltennummern, um deine Formeln flexibler zu gestalten.


    FAQ: Häufige Fragen

    1. Wie kann ich sicherstellen, dass die Formel immer korrekt erweitert wird?
    Verwende absolute Bezüge und teste dein Makro regelmäßig, um sicherzustellen, dass es die gewünschten Ergebnisse liefert.

    2. Was ist der Vorteil der Verwendung von SUMPRODUCT in dieser Formel?
    SUMPRODUCT ermöglicht dir, mehrere Bedingungen gleichzeitig zu prüfen und dabei die Summen für die aktuelle Kalenderwoche zu berechnen.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige