AW: Hat zwei Nachteile
24.08.2022 12:10:03
Daniel
1. Ist richtig,
2. kommt jetzt darauf an, was du meinst.
Sheets("Einstellungen").Range("B1") ist jetzt genauso "hart" vercodet wie [Einstellungen!B1]
Variabilisrung der Inhalte meint, dass man die Werte erst einer Variablen zuweist und im weiteren Code dann diese Variable verwendet
Also nicht:
Sheets("Daten").Range("A1:Z" & Sheets("Einstellungen").Range("B1"). Value).Copy
Sondern:
DatenEnde = Sheets("Einstellungen").Range("B1"). Value
Sheets("Daten").Range("A1:Z" & DatenEnde).Copy
Dies funktioniert mit den [ ] aber genauso und einmal im Code muss man hart vercoden, nur mehrfaches sollte man vermeiden und dann Variablen einsetzen, so dass bei einer Änderung nur eine Stelle im Code angepasst werden muss und nicht mehrere , außerdem hat man damit das Geschwindigkeitsproblem gelöst, die einmalige Verwendung von [ ] bei der Variablenzuweisung wird man nicht merken.
Was das Problem der [ ] ist, dass innerhalb der Klammern der Code fix sein muss und keine Variablen oder sonstiger VBA-Code verwendet werden kann (nach dem [ befindet man sich in einer Zelle und nicht mehr in VBA), dh sowas wie
x = "Einstellungen"
y = "B1"
DatenEnde = Sheets(x).Range(y)
Ist mit den [ ] nicht möglich, hier muss man innerhalb der [ ] hart vercoden.
Allerdings kann man dann alternativ die Funktion Evaluate verwenden. Bei [ ] muss man die Formel direkt in den Code schreiben, bei Evaluate ist die Formel ein Textstring, der dan auch eine Variable sein darf oder mit VBA-Methoden zusammengebaut wird.
das hier funktioniert:
x = "Einstellungen"
y = "B1"
DatenEnde = Evaluate(x & "!" & y)
Evaluate ist also die "variable" Alternative zu [ ].
Es ist sicherlich richtig, dass die Objektreferenzierung auf Zellen mit Sheets().Range() bzw .Cells() den [ ] überlegen und vorzuziehen ist.
Es gibt allerdings Fälle, in denen [ ] bzw Evaluate notwendig oder zumindest hilfreich sind.
1. man will den Wert eines Excel-Namens ermittelt, der nicht auf eine Zelle verweist sondern direkt einen Wert zurück gibt.
2. man will in VBA eine Excelformel mit Matrix nachbilden , bspw eine Formel wie:
=Summenprodukt(1*(A1:A10=B1:B10))
Hier versagt
WorksheetFunction.Sumproduct(1 * (Range("A1:A10") = Range("B1:B10")))
weil VBA diese Matrixoperation nicht ausführen kann, hier müsste eine Schleife programmiert werden.
Oder man verwendet
Evaluate("Sumproduct(1*(A1:A10=B1:B10))")
Oder falls der Bereich fix ist
[Sumproduct(1*(A1:A10=B1:B10))]
Gruß Daniel