Clever-Excel-Forum

Normale Version: Eckige Klammer und CurrentRegion
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo VBA Profis,

ich bin auf ein für mich interessantes VBA Codefragment gestoßen:
Code:
MsgBox [a1].CurrentRegion.Address

Nun weiß ich natürlich mittels der MsgBox was dieser Code macht. Ich stoße mich aber an der Klammer. Was symbolisiert die Klammer? Gibt es diesbezüglich vielleicht auch eine Erklärung in der VBA Referenz? Wird die Klammer noch bei anderen Methoden oder Eigenschaften angewendet? Wenn ja, ein Beispiel wäre schön.
Hallo Wulfi,

das ist nur eine vereinfachte Schreibweise für eine Range-Angabe und kann entsprechend verwendet werden.
Hallo André,

danke für die Hilfe.
Hi André,

unser geschätzter Thomas Ramel hat am 21.10.2003 im alten Forum mal folgendes gepostet:

[A1] ist NICHT die
Kurzschreibweise für Range("A1"), und folglich ist
[A1].Value nicht das gleiche wie Range("A1").Value.

[A1] ist die Kurzschreibweise für Evaluate("A1") bzw.
Application.Evaluate("A1"). Mit Evaluate kann ein Ausdruck
in Form einer Zeichenfolge ausgewertet werden. Enthält diese
etwas, was wie eine Zelladresse aussieht (z.B. A1), so wird der
Wert dieser Zelle zurückgegeben. Das Ergebnis ist somit gleich
wie bei Range("A1"), aber die Art und Weise, wie es ermittelt
wird, ist anders. Evaluate bzw. [...] ist übrigens langsamer als
Range, da der übergebene Zeichenfolge-Ausdruck zuerst auf-
gelöst werden muss, bevor der Zellwert geholt wird.

Solange ein Tabellenblatt aktiv ist, verhalten sich [A1] und
Range("A1") identisch (egal ob mit oder ohne .Value). Wenn
jedoch z.B. ein Diagrammblatt aktiv ist, muss man als Pro-
grammierer bei der Variante [A1] höllisch aufpassen, da im
Gegensatz zu Range unterschiedliche Fehler zurückgegeben
werden. Nachfolgend 8 Beispiele.

Eingabe im Direktfenster des VBA-Editors:
?[A1] -> Fehler 2015 (entspricht #WERT!)
?Range("A1") -> Laufzeitfehler 1004 "Anwendungs- oder objektdefinierter
Fehler"
?[A1].Value -> Laufzeitfehler 424 "Objekt erforderlich"
?Range("A1").Value -> Laufzeitfehler 1004 "Anwendungs- oder
objektdefinierter Fehler"

Einsatz im Programmcode (zur Laufzeit):
MsgBox [A1] -> Laufzeitfehler 13 "Typen unverträglich"
MsgBox Range("A1") -> Laufzeitfehler 1004 "Die Methode 'Range' für das
Objekt '_Global' ist fehlgeschlagen"
MsgBox [A1].Value -> Laufzeitfehler 424 "Objekt erforderlich"
MsgBox Range("A1").Value -> Laufzeitfehler 1004 "Die Methode 'Range' für
das Objekt '_Global' ist fehlgeschlagen"

Wie man sieht liefert [A1] drei verschiedene Fehlernummern,
Range dagegen immer den Laufzeitfehler 1004.


Die Onlinehilfe bestätigt dies:

Die Verwendung eckiger Klammern (etwa "[A1:C5]") entspricht dem Aufruf
der Evaluate-Methode mit einem String-Argument. Die folgenden
Ausdruckspaare beispielsweise haben dieselbe Bedeutung:

[a1].Value = 25
Evaluate("A1").Value = 25
Das ist völlig richtig, Klaus-Martin;
zu ergänzen wäre nur noch, wenn man Evaluate (also auch ersatzweise [], auch falls man nur ein Range-Objekt meint) in einer UDF verwendet, dürfte sich diese als Bestandteil eines Formeltextes nicht (oder kaum) auswerten lassen, also ihrerseits mit Evaluate oder XLM-Funktion AUSWERTEN behandeln lassen, weil idR innerhalb einer lfd Auswertung keine 2.Auswertung vorgenommen werden kann. Außerdem ist eine solche Schreibweise auch noch sehr unflexibel, da das String-Argument nicht als solches erscheint und folglich nicht erst zuvor oder bei Einsatz in die [] zusammen­gesetzt werden kann. Sie taugt also nur für einen fertigen Text, keine Text-Variablen oder -Konstanten, und ist damit ziemlich überflüssig.
Gruß, Castor
Hallo zusammen,

bevor das Ganze den Fragesteller verwirrt möchte ich zusammenfassen und betonen, dass im Worksheet die Schreibweise [A1] als Ersatz für Range("A1") angewendet werden kann.


Zusatzinfo:
Effektive Form ist die Schreibweise Cells(1, 1). Excel arbeitet intern mit den numerischen Zelladressen und auch die Form Range("A1") muss von Excel erst ausgewertet werden. Zudem bietet diese Schreibweise den Vorteil, dass man die Position der Zeilen und Spalten in Schleifen numerisch ermitteln und ausdrücken kann, ohne diese erst in Texte umwandeln zu müssen ... usw.

Weiteres zu Evaluate:
Hier ist öfter das Wort "Evaluate" gefallen. Das wird z.B. in Zusammenhang mit der Auswertung von Zellausdrücken oder Funktionen benutzt. Es können sowohl rechnerische Operationan als auch Stringoperationen ausgeführt werden. Man könnte damit z.B. einen Taschenrechner programmieren, bei dem der Anwender die Rechenoperation in ein Textfeld direkt eingibt oder über entsprechende "Tasten".

Sub test()
Cells(1, 1) = "2+3"
MsgBox [A1] 'ergibt 2+3
MsgBox [2+3] 'ergibt 5
MsgBox Evaluate("A1") 'ergibt 2+3
MsgBox Evaluate("=" & [A1]) 'ergibt 5
Cells(1, 1) = """B""&""O"""
MsgBox Evaluate("=" & [A1])'ergibt BO
End Sub

Ein interessanter Artikel dazu ist dieser:
http://fastexcel.wordpress.com/2011/11/0...e-as-fast/
Dieser Artikel ist insofern besonders interessant, André & all,
indem darauf hingewiesen wird, dass Evaluate nicht nur eine Methode der Application, sondern auch speziell von Arbeits- und Diagramm­blättern ist und hier einen Performance-Vorteil mit sich bringt.
Die wichtigsten, der ebenfalls genannten Einschränkungen (bis auf 256 Zeichen) wurden hier bereits genannt, die weiteren könnten aber für Power-Anwender wichtig werden. Insofern ist der Link für diese besonders empfehlenswert.
Gruß, Castor
Nachtrag:
Was ein englischsprachiger Text natürlich nicht besonders erwähnt, ist, dass Evaluate (im Gegensatz zur XLM-Funktion AUSWERTEN) nur Formeltexte in US-Original-Notation verarbeiten kann. So kann der Link natürlich auch nicht auf besondere Spezifika eingehen, die mit der Nutzung lokaler, nicht englisch­sprachiger Xl-Versionen verbunden sind. Die besonderen Effekte, die bei der Evaluierung spezieller UDFs entstehen, werden in den Xl/VBA-Original-Versionen (englisch und wohl auch französisch) nämlich gar nicht bemerkt.
Castor