Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Wenn Funktion in VBA schreiben

Wenn Funktion in VBA schreiben
17.09.2015 10:43:29
Paul
Hallo an Alle,
habe eine Formel, die ich mittels VBA in eine Spalte eintrage. Diese greift auf eine Spalte zu, gleicht da ein Datum mit heute ab und gibt in der eingetragenen Zelle 0,1 oder 2 ein. Vorher wird noch geschaut ob in A1 was eingetragen wurde.
Worksheets("Tabelle_1").Range(Cells(2, 15), Cells(2, 15)).FormulaLocal = "=WENN(A2<>0;WENN(M2<>0;0;WENN(L2<HEUTE()=WAHR;1;2));"""")"
Worksheets("Tabelle_1").Range(Cells(2, 15), Cells(2, 15)).Select
Selection.AutoFill Destination:=Range(Cells(2, 15), Cells(i, 15)), Type:=xlFillDefault
Meine Frage ist ob ich das Ganze irgendwie mit VBA ohne die "WENN" Funktion programmieren kann, mit "if" vielleicht. Danke für jede Hilfe

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wenn Funktion in VBA schreiben
17.09.2015 10:52:16
Rudi
Hallo,
also statt Formel die Werte eintragen?
Sub aaa()
Dim i As Long
Application.ScreenUpdating = False
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 1)  "" Then
If Cells(i, 13)  0 Then
Cells(i, 15) = 0
Else
If Cells(i, 12) 
Gruß
Rudi

Anzeige
AW: Wenn Funktion in VBA schreiben
17.09.2015 11:19:29
matthias
Hallo Paul,
sicher geht das, die Frage ist nur, warum machst du es dir komplizierter als es ist?
Deine Variante ist kurz und mit Sicherheit deutlich schneller ausgeführt als alles andere. Vor allem wenn du mit der Funktion Application.Calculation = xlManual die Formelneuberechnung am Anfang des Makros deaktivierst. Nicht vergessen am Ende den Wert wieder auf xlAutomatic zu setzen.
Trotzdem hier deine If-Abfrage in VBA-Form:
Dim Zelle As Range
With Worksheets("Tabelle_1")
For x = 2 To i
Set Zelle = .Range("O" & i)
If .Range("A" & i).Value  0 Then
If .Range("M" & i).Value  0 Then
Zelle.Value = 0
Else
If .Range("L" & i).Value 
Abgesehn davon ist die Variante dein Tabellenblatt über den Namen anzusprechen nicht empfehlenswert. Lass einen User mal auf die Idee kommen das Blatt umzubenennen und dein Code ist hinfällig. Desshalb mein Tipp: Nutz den Code-Namen. Dieser ist nur von eingeweihten änderbar und damit gegen den Super-Dau geschützt. Falls du nicht weist wo du den herbekommst, Google hilft.
lg Matthias

Anzeige
AW: Wenn Funktion in VBA schreiben
17.09.2015 14:48:53
Paul
Hallo,
super!!! Hab die Formeln noch ein wenig angepasst und das funktioniert wunderbar :)
Ich habe generell folgendes Problem. Da sind mehrere längere "WENN" Funktionen die in Zellen per Makro eingetragen werden. Mittlerweile sind es so viele(ca. 5000), dass Excel immer langsamer wird bei der Berechnung und selbst bei normalem Klicken, meine Idee ist es, diese Formel zu ersetzen um Excel schneller zu bekommen. xlAutomatic und Manual ausgestellt, aber es hat sich wenig getan.
Ist das möglich? Oder spricht da etwas dagegen? Oder hat jemand vielleicht noch andere Tipps

Anzeige
AW: Wenn Funktion in VBA schreiben
18.09.2015 11:15:23
Paul
Hab jetzt doch gemerkt, dass Excel mit der "If" Funktion langsamer rechnet als mit dem Eintragen und ausrechnen der "WENN" Funktion in die Zelle.
Ist das echt so? hat da jemand Tipps?

AW: Wenn Funktion in VBA schreiben
18.09.2015 12:42:34
EtoPHG
Hallo Paul,
Die Illusion mit VBA-Code schneller zu sein, wie mit Standardformeln ist eine verbreitete Meinung bei XL-Anfänger. Es gibt extrem wenig Ausnahmen im Bereich von Matrixformeln die mit VBA u.U. schneller sind. Sehr oft sind mit anderen Mitteln einfacher Verbesserungen möglich. Z.B. das Aufbrechen komplexer Formeln (insb. Matrix) in einfache Einzelformeln in Hilfsspalten und das Weiterrechnen mit den Resultaten dieser Hilfsspalten oder das Überarbeiten der Formeln auf das Nötigste.
Bei deiner Formel:
=WENN(A20;WENN(M20;0;WENN(L2&ltHEUTE()=WAHR;1;2));"")

Ist z.B. das =WAHR völlig überflüssig bzw. verlängert die Berechnungszeit.¨
Zudem könnte der volatile Teil HEUTE() z.B. in einer einzigen Zelle stehen und in den restlichen Formeln, die das heutige Datum referenzieren, mit dieser (absoluten) Zelladresse ersetzt werden.
Merke:
VBA ist in 99% aller Fälle wesentlich langsamer als Formeln!
Das Verkürzen von Formeln auf das absolute Minimum bringt immer noch mehr als jegliche VBA Versuche!
Gruess Hansueli

Anzeige
AW: Wenn Funktion in VBA schreiben
18.09.2015 12:52:24
daniel
Hi
ich würde das so programmieren, wenn du die Werte in den Zellen haben willst und nicht die Formel:
With Worksheets("Tabelle_1").Range(Cells(2, 15), Cells(i, 15))
.FormulaLocal = "=WENN(A2  0;WENN(M2  0;0;WENN(L2 

die Schleife in VBA ist deswegen so langsam, weil Excel bei jedem Einfügen eines Wertes in das Tabellenblatt ein paar Aktionen ausführen muss, das wären unteranderem:
- prüfen, ob in Excel Formeln vorhanden sind, die sich auf diese Zelle(n) beziehen und neu berechnet werden müssen, wenn ja, dies auch machen.
- prüfen ob bedingte Formatierungen vorhanden sind und ggf anpassen
- Bildschirm neu aufbauen.
- ...
Deswegen sollte man versuchen, die Anzahl der Zellzugriffe auf das Tabellenblatt soweit wie möglich zu reduzieren, wieviele Zellen bei einem Zugriff gleichzeitig geändert werden, ist zum Grossteil unerheblich, entscheidend ist die Anzahl der Zugriffe.
In meinem Beispiel hast du maximal 2 schreibende Zugriffe auf das Blatt, beim Einfügen der Formel und beim Einfügen der Werte.
wenn du auf die Formeln verzichen willst und trotzdem in VBA genauso schnell sein willst, wird die Programmierung aufwendiger.
du müsstest so vorgehen:
- für die Berechnung benötigte Werte in ein Array kopieren
- ein Ergebnisarray erstellen
- in einer Schleife über die Arrays laufen, die Berechnung durchführen und das Ergebnis ins Ergebnisarray eintragen
- das Ergebnisarray in die Tabelle zurückschreiben.
kurzum: solange sich die Aufgabe relativ einfach mit Formeln lösen lässt, ist die VBA+Formelvariante deutlich einfacher als eine gleichschnelle reine VBA-Lösung.
(und wer schon mal komplexen Code im Einzelstep getestet hat, wird generell versuchen, soweit wie möglich ohne Schleifen auszukommen)
Gruß Daniel

Anzeige
AW: Wenn Funktion in VBA schreiben
21.09.2015 10:17:39
Paul
Morgen,
vielen Dank für die Hilfe. Denke bin auf einem guten weg meine Tabelle zu optimieren.
Habe da jetzt aber noch paar Fragen. Versuche jetzt momentan meine VBA Schleifen um zuschreiben.
Folgenden Code würde ich irgendwie gerne umgehen:
Dim AnzahlZeilen As Integer
AnzahlZeilen = Range("A2").End(xlDown).Row
Dim i As Integer
Dim a As Integer
For a = 1 To Application.Max([r:r])
For i = 2 To AnzahlZeilen
If Cells(i, 18) = a Then
Cells(i, 21) = Cells(a + 1, 20)
End If
Next i
Next a
Besteht da eine Möglichkeit?
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Wenn Funktion in VBA schreiben


Schritt-für-Schritt-Anleitung

Um eine WENN-Funktion in VBA zu verwenden und dabei die Performance zu optimieren, gehe folgendermaßen vor:

  1. Öffne den VBA-Editor in Excel mit ALT + F11.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBA-Projekt" > Einfügen > Modul.

  3. Schreibe dein Makro, um die WENN-Funktion zu verwenden. Hier ist ein Beispiel:

    Sub WennFunktionVBA()
       Dim i As Long
       Application.ScreenUpdating = False
       For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
           If Cells(i, 1) <> "" Then
               If Cells(i, 13) = 0 Then
                   Cells(i, 15) = 0
               Else
                   If Cells(i, 12) < Date Then
                       Cells(i, 15) = 1
                   Else
                       Cells(i, 15) = 2
                   End If
               End If
           End If
       Next i
       Application.ScreenUpdating = True
    End Sub
  4. Führe das Makro aus, um die Werte in der Spalte 15 entsprechend den Bedingungen zu setzen.


Häufige Fehler und Lösungen

  • Problem: VBA führt langsamer aus als Excel-Formeln.

    • Lösung: Reduziere die Anzahl der Zellzugriffe. Versuche, Berechnungen in einem Array durchzuführen und dann alle Ergebnisse auf einmal zurückzuschreiben.
  • Problem: Die WENN-Funktion in VBA gibt unerwartete Ergebnisse zurück.

    • Lösung: Überprüfe die Bedingungen in deinen If-Anweisungen. Manchmal kann ein Tippfehler oder eine falsche Zellreferenz zu Fehlern führen.

Alternative Methoden

Wenn du die WENN-Funktion in VBA umgehen möchtest, kannst du stattdessen die Select Case-Anweisung verwenden. Hier ist ein Beispiel:

Sub AlternativeMitSelectCase()
    Dim i As Long
    Application.ScreenUpdating = False
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        If Cells(i, 1) <> "" Then
            Select Case Cells(i, 13)
                Case 0
                    Cells(i, 15) = 0
                Case Else
                    If Cells(i, 12) < Date Then
                        Cells(i, 15) = 1
                    Else
                        Cells(i, 15) = 2
                    End If
            End Select
        End If
    Next i
    Application.ScreenUpdating = True
End Sub

Praktische Beispiele

Ein typisches Szenario könnte wie folgt aussehen:

Sub BeispielMakro()
    Dim i As Long
    Application.ScreenUpdating = False
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        If Cells(i, 1) <> "" Then
            If Cells(i, 2) < Date Then
                Cells(i, 3) = "Vergangen"
            Else
                Cells(i, 3) = "Zukünftig"
            End If
        End If
    Next i
    Application.ScreenUpdating = True
End Sub

Hier wird überprüft, ob das Datum in Spalte 2 in der Vergangenheit oder Zukunft liegt und das Ergebnis in Spalte 3 ausgegeben.


Tipps für Profis

  • Nutze Application.Calculation = xlManual zu Beginn deines Makros, um die Neuberechnung zu verhindern, und setze es am Ende wieder auf xlAutomatic.
  • Halte deine Formeln so einfach wie möglich. Komplexe Berechnungen können die Rechenzeit erheblich verlängern.
  • Verwende den Code-Namen der Arbeitsblätter anstelle des sichtbaren Namens, um Fehler zu vermeiden, falls das Blatt umbenannt wird.

FAQ: Häufige Fragen

1. Wie viele WENN-Funktionen sind in Excel möglich? Es gibt eine Begrenzung von bis zu 64 geschachtelten WENN-Funktionen in einer einzigen Formel.

2. Warum ist VBA oft langsamer als Excel-Formeln? VBA führt eine Vielzahl von Hintergrundprozessen durch, während Excel-Formeln direkt in den Zellen berechnet werden, was zu schnelleren Ergebnissen führen kann.

3. Kann ich VBA verwenden, um komplexe Berechnungen zu optimieren? Ja, du kannst die Berechnungen in Arrays durchführen und die Ergebnisse anschließend auf das Arbeitsblatt zurückschreiben, um die Performance zu verbessern.

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