Microsoft Excel

Herbers Excel/VBA-Archiv

Reihenfolge der Variablendeklaration wichtig?

Betrifft: Reihenfolge der Variablendeklaration wichtig? von: Stefan
Geschrieben am: 19.11.2014 11:54:41

Hallo zusammen,
bei der Erstellung eines kleinen VBA Codes bin ich auf ein Problem gestoßen, dass mir so bislang noch nicht passiert ist und ich mir nicht erklären kann.
Wenn ich per F8 schrittweise durch untenstehen Code gehe, kommt nach der letzen Zeile im Code folgende Fehlermeldung: "Laufzeitfehler 91:Objektvariable oder With-Blockvariable nicht festgelegt."

Und jetzt das Seltsame: Wenn ich die Reihenfolge in der Dim Zeile verändere und Lzelle an den Anfang stelle (Dim LZelle, Kopfzeile, Zelle, Startintervall, Endintervall As Range), wird keine Fehlermeldung angezeigt und der code läuft korrekt durch.

Hat irgendjemand eine Idee warum das so ist?

Vielen Dank und Grüße

Sub Glättung_automatisieren()
Dim Kopfzeile, Zelle, Startintervall, Endintervall, LZelle As Range
Dim i, LängeAuswahl As Integer

Sheets("Tabelle1").Select
Set Kopfzeile = Range("A1:Z1")
LZelle = Sheets("Tabelle1").Cells(1048576, 1).End(xlUp).Address

  

Betrifft: Nein, aber.. von: robert
Geschrieben am: 19.11.2014 12:07:16

Hi,

bei Dir ist nur LZelle als Range definiert.

LZelle als Ergebnis ist aber kein Range.

Daher jede Variable definieren, wie Du sie brauchst.

zB.: Dim Kopfzeile As Range, LZelle As String, usw...

Gruß
robert


  

Betrifft: Nur der übliche Anfänger-Deklarationsfehler, ... von: Luc:-?
Geschrieben am: 19.11.2014 14:51:54

…robert (& Stefan),
- ich nehme an, du meinst den -, ein Komma bei der Deklaration als Aufzählungs­trenner zu (miss-)inter­pretieren. Es ist aber der Trenner zwischen voll­ständigen Einzel­Deklarationen, die so nur aneinander­gereiht wdn können. Alles, dem kein As … folgt, ist automatisch als Variant deklariert und der kann alles enthalten, auch Range-Objekte (nur wdn die dann nicht vom VBE-Intellisense unterstützt). Nebenbei, es gibt auch noch direkt nach­stell­bare Kurz­Deklarations­zeichen wie bspw $ für String-Variablen (anstelle von As String), die aber nur bei der Deklaration verwendet wdn dürfen ($ nach Text­Fktsnamen hat eine etwas andere Bedeutung!).
Gruß, Luc :-?


  

Betrifft: Luc-aber LZelle as Range ist schon falsch-oder? oT von: robert
Geschrieben am: 19.11.2014 16:24:32




  

Betrifft: AW: Luc-aber LZelle as Range ist schon falsch-oder? oT von: Rudi Maintaire
Geschrieben am: 19.11.2014 16:40:21

Hallo,
in dem Fall ja, da der lZelle durch = .Address ein String zugewiesen wird.
Richtig wäre Set lZelle = Cells(rows.count,1).end(xlup), da das ein Range-Objekt ergibt.

Gruß
Rudi


  

Betrifft: Danke,Frage ist, was wollte er wirklich mit LZelle von: robert
Geschrieben am: 19.11.2014 16:49:03

Hi,

leider ist nicht immer klar, was der Fragende will.

Und zu den Variablen:

ist es nicht korrekter diese so zu definieren, wie sie
gebraucht werden ?

Gruß
robert


  

Betrifft: IdR ja, nur denken Manche, das ginge auch ... von: Luc:-?
Geschrieben am: 19.11.2014 17:51:05

…per einfacher Aufzählung, robert,
und bei LZelle hat er dann schlicht was durcheinandergebracht.
Übrigens auch ein Grund, warum die UN-Präfix­Anwendung unpraktisch ist, denn dort müsste man dann ja in einem solchen Fall immer nicht nur die Deklaration, sondern auch alle VariablenNamen ändern, sonst ist diese Kennzeichnung nicht nur völlig wertlos, sondern auch irreführend. Letztlich ist ein solcher Name auch eine Art Schlüssel und ich habe schon vor 40 Jahren gelernt, das sog sprechende Schlüssel unpraktisch sind und auch erlebt, wie unpraktisch → permanenter Änderungs­dienst nur dafür (noch dazu bei DB-Relevanz!) und die FolgeKosten…
Gruß, Luc :-?

Besser informiert mit …


  

Betrifft: AW: Reihenfolge der Variablendeklaration wichtig? von: Daniel
Geschrieben am: 19.11.2014 17:09:12

Hi
ums nochmal zusammenzufassen:

der Ausdruck: "Sheets("Tabelle1").Cells(1048576, 1).End(xlUp).Address"
derzeugt als Ergebnis die Zelladrese, dh einen Textstring.

einen Textstring kannst du entweder einer Variable vom Typ STRING zuweisen (das wäre der passende Typ) oder einer Variable vom Typ VARIANT. Dieser Variablentyp ist allgemein und kann alles aufnehmen.

Deklarierst du mit:

Dim Kopfzeile, Zelle, Startintervall, Endintervall, LZelle As Range

so ist LZelle eine Range-Variable, weil du ihr diesen Typ mit "As Range" explizit zuweist.
Der Variablen vom Typ Range kannst du nur die Zellen direkt zuweisen, aber keine Texte oder sowas.
Dh. deine Zuweisung der Zelladresse erzeugt einen Fehler, weil die Adresse ein Text ist.


Tauschst du die Reihenfolge und stellst LZelle an den Anfang:
Dim LZelle, Kopfzeile, Zelle, Startintervall, Endintervall

so gibst du für LZelle keinen speziellen Variablentyp an, sondern erzeugst eine Variantvariable, welche sich automatisch an den zugewiesenen Wert anpasst.
Dieser Variantvariable kannst du dann den Adress-Text problemlos zuweisen.

Gruß Daniel


 

Beiträge aus den Excel-Beispielen zum Thema "Reihenfolge der Variablendeklaration wichtig?"