Anzeige
Archiv - Navigation
1444to1448
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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

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?

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige