[VBA] Excel - Wenn-Dann-Formel

Wannabe

Well-known member
ID: 129824
L
20 April 2006
5.022
418
Hallo,

ich versuche gerade in Excel eine Wenn-Dann-Formel unter VBA zu machen, da man in der normalen Funktion ja nur eine 7-fache Verkapselung hinbekommt. Leider habe ich von VBA keinerlei Ahnung und habe mir nun anhand von Beispielen versucht eine Lösung zu basteln, die wie folgt aussieht

Sub test()
Select Case Range("C3")
Case "Januar"
Range("A6") = 1
Case "Februar"
Range("A6") = 2
Case "März"
Range("A6") = 3
Case "April"
Range("A6") = 4
Case "Mai"
Range("A6") = 5
Case "Juni"
Range("A6") = 6
Case "Juli"
Range("A6") = 7
Case "August"
Range("A6") = 8
Case "September"
Range("A6") = 9
Case "Oktober"
Range("A6") = 10
Case "November"
Range("A6") = 11
Case "Dezember"
Range("A6") = 12
Case Else
Range("A6") = "Fehler"

End Select
End Sub


Wenn ich das Makro ausführe, dann bekomme ich die Meldung "Typen unverträglich".

Im Grunde soll das Makro auch jedesmal wenn sich die Arbeitsmappe neu berechnet mit aktualisieren, ohne das ich über Makros->Ausführen gehen muss.
 
Warum nimmst du nicht einfach einen Sverweis?

SVERWEIS(Suchkriterium;Matrix;Spaltenindex;Bereich_Verweis)

Das einzige was du dann brauchst ist einen Platz irgendwo für die Monate....
Genaueres findest aber sicher auch: https://www.online-excel.de/excel/singsel.php?f=9

Dann hast du weder Makro noch musst du das Manuell durchführen,....
Ach und selbst VBA brauchst dazu nicht.

Sry muss wieder weg sonst hätte ich dir das genauer geschrieben, aber auf der Seite findest eigentlich alles was du brauchst ;)

lg Doris
 
du gibst im Select eine Range an und prüfst auf einen String?
versuchs mal mit
select case Range("C3").Text
..

alternativ müsste gehen:
select case Range("C3").Value
..
 
Zuletzt bearbeitet:
Als das Vorgeschlagene hat funktioniert. Nun wäre noch interessant, ob man das ganze so machen kann, dass sich die Zelle bei der Berechnung automatisch mit neu berechnet?
 
was heißt denn "wenn sich die Arbeitsmappe neu berechnet"?
Im Prinzip brauchst du nur eine Zelle verlinken die sich bei der Neuberechnung ändert.

Das erreichst du entweder darüber dass du der Funktion die Zelle als Aufrufparameter übergibst,
oder über folgende Krücke
Code:
=WENN(ODER($A$2=$A$2;$B$2=$B$2;$C$3=$C$3);BerechneDauer(B14))

Ich habe bei mir einfach alle benutzten Felder mit einer Oder-Bedingung abgefragt (die immer wahr ist). Dadurch berechnet Excel bei Änderung der Werte die Formel neu und ruft die Funtion auf.
Vorteil: Du musst deine Funktion nicht anpassen.
Nachteil: Schaut scheiße aus.

Wie gesagt kannst du auch die Zellen als Aufrufparameter übergeben, hat mehr Stil ist aber mehr Arbeit.
 
Naja mit F9 sagt man doch, dass die Arbeitsmappe sich neu berechnen soll. Das mein ich damit.

Und wie mache ich deine Lösung mit mehr Stil? :)
 
Simples Beispiel für oben:
Code:
Function BerechneDauerParameter(Dauer1, Dauer2, Dauer3)
   BerechneDauerParameter = Dauer1 + Dauer2 + Dauer3
End Function

Aufruf:
Code:
=BerechneDauerParameter(A2;B2;C3)
 
Sorry, aber was meinst du nun mit Dauer1,Dauer2 und Dauer 3? Und was suchen A2 und B2 in der Formel? Die haben doch garnichts damit zu tun oder?
 
Das ist ne Funktion von mir, die ich grad als Beispiel zusammengeschrieben habe.

Soll nichts anderes heißen als:
- definiere in deiner VBA-Funktion beliebig viele Argumente
- übergebe als Argument die Werte die sich bei einer Neuberechnung ändern
--> Excel berechnet die Funktion daraufhin bei einer Neuberechnung (F9) mit.


In meinem Beispiel habe ich einfach ein Sheet in dem in den o.g. Zellen die Benutzerparameter stehen. Nachdem die Benutzer die Parameter eingegeben hatten, mussten sie die Funktion erneut aufrufen. Durch Übergabe der Zelle an die Funktion wird schlicht und ergreifend eine Neuberechnung erzwungen sobald sich eins der Argumente ändert.

Dauer1-3 sind meine Argumente mit denen ich dann in der Funktion arbeiten kann. In der Zelle selber steht dann die ganz normale Verlinkung
=Funktion(Zelle1;Zelle2;Zelle3)
 
Ok, war mir jetzt zu abstrakt *g*

nehmen wir dein Beispiel von oben.
Funktion im VBA-Editor, hierfür in deiner Arbeitsmappe ein neues Modul erstellen:
PHP:
Function Test(Monat)
    Dim Int_Monat
    Select Case Monat
        Case "Januar"
            Int_Monat = 1
        Case "Februar"
            Int_Monat = 2
        Case "März"
            Int_Monat = 3
        Case "April"
            Int_Monat = 4
        Case "Mai"
            Int_Monat = 5
        Case "Juni"
            Int_Monat = 6
        Case "Juli"
            Int_Monat = 7
        Case "August"
            Int_Monat = 8
        Case "September"
            Int_Monat = 9
        Case "Oktober"
            Int_Monat = 10
        Case "November"
            Int_Monat = 11
        Case "Dezember"
            Int_Monat = 12
        Case Else
            Int_Monat = "Fehler"
    End Select

    Test = Int_Monat
End Function

Inhalt der Zelle A6
PHP:
=Test(C3)

fertig :D
 
Zuletzt bearbeitet:
Danke, werd ich gleich mal testen und dann hier editieren ob das so geht ^^

Super Danke, das geht wunderbar ^^