Excel VBA: Schöner Coden

Hallo
was ist den Eure Meinung, welcher Code ist besser/eleganter?

Sub u1
Dim strTest as string
dim btest as boolean
...
If btest Then
 strTest = "abcd"
else 
 strTest =""
End if
...
end sub

Sub u1
Dim strTest as string
dim btest as boolean
...
strTest =""
...
If btest Then
 strTest = "abcd" 
End if
...
end sub

Und warum?
Danke für Eure Zeot und Aufmerksamkeit.
Winter

Hallo Winterritter,

mir gefällt beides nicht so recht. ich würd’s noch anders schreiben:

Sub u1
Dim strTest as string
Dim btest as boolean
...
strTest = IIf(btest, "abcd","")
...
End sub

Gruß, Andreas

Hi,

IIf verwende ich auch manchmal. Ich habe aber gelesen, daß IIf im Gegensatz zu If-EndIf stets auch die SONST-Klausel prüft und es so zu Fehlern kommen kann, wenn etwas im SONST (noch) nicht existiert. Ob das auf das betreffende System zutrifft, kann man prüfen, indem man eine Division erzeugt, die im SONST durch null dividieren würde (hab ich jetzt nicht gemacht).

Aber ich mache dem zweiten Ansatz im OP auch gerne: eine Variable vorbelegen und dann überschreiben. Ich hab’ mir das auch angewöhnt, weil ich absoluter Laie bin und mir VBA autodidaktisch beigebracht habe. Ich habe gelesen, daß man in anderen Programmiersprachen Variablen auch erst initialisieren muß. Also dachte ich: wenn Du die vorbelegst, gewöhnst Du Dir gleich einen Stil an, mit dem Du auch (irgendwann 'mal…) eine höhere (am besten objektorientierte) Programmiersprache lernen kannst.

HTH.

Markus

Hi,

Hallo Markus,

IIf verwende ich auch manchmal. Ich habe aber gelesen, daß IIf
im Gegensatz zu If-EndIf stets auch die SONST-Klausel prüft
und es so zu Fehlern kommen kann, wenn etwas im SONST (noch)
nicht existiert. Ob das auf das betreffende System zutrifft,
kann man prüfen, indem man eine Division erzeugt, die im SONST
durch null dividieren würde (hab ich jetzt nicht gemacht).

Ja, das steht so in der VBA-Hilfe von IIf.
Im UP geht es aber um 2 Strings, die je nach Wahr oder Falsch zurückgegeben werden. Die können imo keinen Fehler erzeugen.

Aber ich mache dem zweiten Ansatz im OP auch gerne: eine
Variable vorbelegen und dann überschreiben. Ich hab’ mir das
auch angewöhnt, weil ich absoluter Laie bin und mir VBA
autodidaktisch beigebracht habe. Ich habe gelesen, daß man in
anderen Programmiersprachen Variablen auch erst initialisieren
muß.

Ja, das ist z.B. in C wichtig. Dort haben Variablen, die nicht initialisiert werden keinen definierten Anfangswert.

Also dachte ich: wenn Du die vorbelegst, gewöhnst Du Dir
gleich einen Stil an, mit dem Du auch (irgendwann 'mal…)
eine höhere (am besten objektorientierte) Programmiersprache
lernen kannst.

Funktionieren tut der 2. Ansatz im UP natürlich genau so gut wie der erste.
Für mein Empfinden ist es aber irgendwie unlogisch, eine Variable mit einem Wert zu belegen, den sie ja eigentlich erst nach Auswertung der Bedingung erhalten sollte.
Da gefällt mit der erst Anstz schon besser.
Aber ich gebe zu, das ist Krümelsucherei.

HTH.

Markus

Gruß, Andreas

Danke für Euer Feedback.

Das IIF funktioniert nicht, da ich noch andere code in der If bedingunen verarbeiten muss. Das habe ich aussgelassen, weil ich mich aufs nötigste beschränkt habe.
Auch habe ich Bauschmerzen gegen das IIF wie Markus.

Das If steht auch in einer Schleife und wird mehrmals abgefragt.
daher die NULL setztung.

Das IIF funktioniert nicht, da ich noch andere code in der If
bedingunen verarbeiten muss. Das habe ich aussgelassen, weil
ich mich aufs nötigste beschränkt habe.
Auch habe ich Bauschmerzen gegen das IIF wie Markus.

Das If steht auch in einer Schleife und wird mehrmals
abgefragt.
daher die NULL setztung.

Hallo Winter,

der Feedback bezog sich auf das was du geschrieben hast.
Hättest du die anderen Bedingungen genannt wären die Antworten ggfs.
anderst ausgefallen.
Zeig mal wenn du magst ein lauffähigen Code dazu.

Grundsätzlich/erstmal schreibe ich sowas nach Bauchgefühl.
Hier ging es ja nur um „“ oder „abcd“.
Da hätte ich auch eine deiner Varianten oder IIF genommen.
IIF macht mir keine Bauchschmerzen.

Sind aber mehr Bedingungen abzuarbeiten kommen auch andere Funktionen
ins Spiel, z:B. Select Case

Gelegentlich bastle ich Code der extrem schnell sein muß, bei
Stochastik, Kombinationen u.ä., dann ist die Schnelligkeit oberstes
Ziel.
Bei Interesse, schau dir mal bitte den untenstehenden Code an.

PS: Wie ich immer sage, in Foren lernt man am meisten.
Ohne deine Anfrage wäre ich nicht zufällig über „Switch“
gestolpert, kannte ich bis gestern nich.

Gruß
Reinhard

Option Explicit

Public btest As Boolean, strTest As String

Sub Test()
Dim T As Single, N As Long, dummy
Columns("B:C").NumberFormat = "0.000"
Const Anz As Long = 3000000

Range("A1").Value = "u1"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u1()
Next N
Range("B1").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u1()
Next N
Range("C1").Value = Timer - T

Range("A2").Value = "u2"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u2()
Next N
Range("B2").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u2()
Next N
Range("C2").Value = Timer - T

Range("A3").Value = "u3"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u3()
Next N
Range("B3").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u3()
Next N
Range("C3").Value = Timer - T

Range("A4").Value = "u4"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u4()
Next N
Range("B4").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u4()
Next N
Range("C4").Value = Timer - T

Range("A5").Value = "u5"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u5()
Next N
Range("B5").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u5()
Next N
Range("C5").Value = Timer - T

Range("A6").Value = "u6"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u6()
Next N
Range("B6").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u6()
Next N
Range("C6").Value = Timer - T

Range("A7").Value = "u7"
btest = True
T = Timer
For N = 1 To Anz
 dummy = u7()
Next N
Range("B7").Value = Timer - T
btest = False
T = Timer
For N = 1 To Anz
 dummy = u7()
Next N
Range("C7").Value = Timer - T

End Sub

Function u1()
If btest Then
 strTest = "abcd"
Else
 strTest = ""
End If
u1 = strTest
End Function

Function u2()
strTest = ""
If btest Then strTest = "abcd"
u2 = strTest
End Function

Function u3()
strTest = Left("abcd", (btest = True) \* -4)
u3 = strTest
End Function

Function u4()
strTest = IIf(btest, "abcd", "")
u4 = strTest
End Function

Function u5()
strTest = Switch(btest = True, "abcd", btest = False, "")
u5 = strTest
End Function

Function u6()
strTest = Application.Choose(1 + (btest = True) \* -1, "", "abcd")
u6 = strTest
End Function

Function u7()
Select Case btest
 Case True
 strTest = "abcd"
 Case False
 strTest = ""
End Select
u7 = strTest
End Function
1 Like

Jetzt muss ich aber doch noch mal
Hallo Reinhard,

das sind ja unglaublich viele Möglichkeiten, eine Auswahl zu treffen. Ich kannte bisher weder Switch noch Choose.
Auch wenn ich deinen Code noch nicht habe laufen lassen. Allein wie du ihn aufgebaut hast, zeugt von deiner Klasse. Chapeau und (auch wenn du keinen Wert darauf legst) Stern.

Gruß, Andreas

PS: Wie du ganz richtig sagtest: Hier mitlesen bildet.