Ich zähle mich zwar nicht mehr gerade zu den Excel-Einsteigern, aber die
Cells-Eigenschaft gibt mir Rätsel auf. Ich verwende Excel 97 SR-1.
Ausgangslage ist eine neue Arbeitsmappe mit leeren Tabellenblättern.
Wenn ich im Direktfenster
?Cells.Count
eingebe, erhalte ich den Wert 16777216, was soweit klar ist (256 Spalten x
65536 Zeilen = 16777216 Zellen).
FRAGE 1:
Gebe ich
?Cells.Cells.Count
ein, erhalte ich ebenfalls das Ergebnis 16777216. Hier ist mir nicht klar,
weshalb Cells wiederum eine Cells-Eigenschaft besitzt. Im Objektmodell habe
ich keine Erklärung gefunden. (Siehe auch meine Frage 3).
FRAGE 2:
Gebe ich nur
?Cells
ein, erhalte ich einen Laufzeitfehler 7 (Nicht genügend Speicher). So wie es
aussieht ist Count nicht die Default-Eigenschaft von Cells. Doch wie heisst
die Default-Eigenschaft (falls es diese überhaupt gibt) und weshalb wird
gleich der Fehler "Nicht genügend Speicher" gemeldet und nicht z.B.
"Objektvariable oder With-Blockvariable nicht festgelegt" (Fehler 91) oder
"Objekt unterstützt diese Eigenschaft oder Methode nicht" (Fehler 438)?
Den gleichen Laufzeitfehler erhalte ich, wenn
?Cells.Rows
oder
?Cells.Columns
eingegeben wird. Das ist mehr oder weniger verständlich, da Count nicht
angegeben wurde und daher der gleiche Laufzeitfehler wie bei "?Cells"
erscheint. Die Abfrage "?Cells.Rows.Count" funktioniert wieder.
FRAGE 3:
Unverständlich ist mir auch, weshalb
?Cells.Rows.Rows.Rows.Rows.Rows.Count
funktioniert und den erwarteten Wert 65536 ausgibt. OK, sowohl Cells als
auch Rows geben ein Range-Objekt zurück. Aber ist das Objektmodell
tatsächlich so gebaut, dass die beliebige Wiederholung von bestimmten
Eigenschaften respektive Objekten zulässig ist?
Besten Dank für Eure Antworten.
Gruss
Philipp
leider habe ich keine Lösung aber ich habe es auf meinem System PIV, WinXp,
XL2002 mal ausprobiert und ...
"Philipp von Wartburg" <philipp.vo...@bluewin.ch> schrieb im
Newsbeitrag news:3c93b...@news.bluewin.ch...
> Hallo NG
>
> Ich zähle mich zwar nicht mehr gerade zu den Excel-Einsteigern, aber die
-snip
ja das habe ich schon bemerkt, auch finde ich Deine ausführlichen
Erleuterungen die Du hier in der NG oft gibst schon Klasse
> Wenn ich im Direktfenster
> ?Cells.Count
> eingebe, erhalte ich den Wert 16777216, was soweit klar ist (256 Spalten x
> 65536 Zeilen = 16777216 Zellen).
>
> FRAGE 1:
> Gebe ich
> ?Cells.Cells.Count
> ein, erhalte ich ebenfalls das Ergebnis 16777216. Hier ist mir nicht klar,
- snip
ich kann beliebig viele Cell.Cell.Cell.. eingeben das Ergebnis ist immer
wie bei Dir
> weshalb Cells wiederum eine Cells-Eigenschaft besitzt. Im Objektmodell
habe
> ich keine Erklärung gefunden. (Siehe auch meine Frage 3).
>
> FRAGE 2:
> Gebe ich nur
> ?Cells
> ein, erhalte ich einen Laufzeitfehler 7 (Nicht genügend Speicher). So wie
es
> aussieht ist Count nicht die Default-Eigenschaft von Cells. Doch wie
heisst
-snip
hier war ENDE der Task hing, nach 2Min hat Windows das gemeldet, dann konnte
ich Exce noch beenden, aber der Recner lief sehr langsam obwoh KEIN anderes
Proramm im TaskManager angezeigt wurde. Neustart war erforderlich .. toll
jetzt brauche ich mich auch nicht mehr zuärgern wenn ich mit meinem VBA Code
den Rechner zum Absturz bringe wenn schon ?cell reicht :-)
mfG Wolfgang
Ein wenig klarer?
Matthias wünscht einen schönen Sonntag!
"Philipp von Wartburg" <philipp.vo...@bluewin.ch> schrieb im
Newsbeitrag news:3c93b...@news.bluewin.ch...
--
Mit freundlichen Grüßen
Eckehard Pfeifer
www.dr-e-pfeifer.de
Ein Blick lohnt sich immer: www.vba-magazin.de
MsgBox Tabelle1.Cells.Value(xlRangeValueXMLSpreadsheet)
gibt (ab XP) die XML-Variante des Spreadsheets aus (also Value kennt hier
noch einen Parameter). Wie das unter 2000 und frueher ist, kann ich im
Moment nicht testen.
Vielen Dank für die interessanten und aufschlussreichen Antworten. Ich
konnte mit den Hinweisen sehr viel anfangen und habe es tatsächlich nach ein
paar Tests geschafft, auf alle Fragen eine Antwort zu finden! Ganz nebenbei
habe ich wie es scheint einen schweren Bug entdeckt (siehe neues Posting).
Auch die Ursache des Laufzeitfehlers 7 (Speicherüberlauf) konnte ich
herausfinden (siehe neues Re: Posting).
Hier meine Erkenntnisse:
1. Cells ist meines Erachtens kein "echtes" Objekt und auch keine Klasse, da
ich davon ausgehe, dass ein Objekt immer eine Instanz einer Klasse ist (so
die Theorie, falls ich richtig aufgepasst habe). Da ich keine Cells-Klasse
im Objektkatalog finde, kann Cells folgedessen kein "echtes" Objekt sein.
Allerdings: Die Abfrage "?IsObject(Cells)" ergibt True, was bedeuten würde,
dass Cells eben doch ein Objekt ist.
2. Cells ist eine Eigenschaft (das aufgrund der Property-Definition im
Objektmodell), welche immer ein Range-Objekt zurückgibt.
3. Cells kann wie Range eine Auflistung sein. Ich habe kurz die Theorie
aufgefrischt. Diese besagt, dass Elemente einer Auflistung über einen Index
oder Schlüssel angesprochen werden. Bei Range ist es entweder ein Index als
Typ Cell (=Zell-Adresse) oder zwei Indizes als Cell1 und Cell2. Bei Cells
sind es zwei Indizes, nämlich RowIndex und ColumnIndex, welche jedoch beide
optional sind (daher funktioniert "?Cells.Value" im Gegensatz zu
"?Range.Value"!). => Siehe auch Punkt 7.
4. Die Default-Eigenschaft von Cells ist tatsächlich Value. Erscheint mir im
Nachhinein logisch, da die Default-Eigenschaft von Range ebenfalls Value ist
und Cells wie erwähnt ein Range-Objekt zurückgibt.
5. Da Cells genau gleich wie Range funktioniert, kennt Cells dieselben
Eigenschaften wie Range.
6. Range ist sowohl eine Klasse (welche Objekte instanzieren kann) als auch
eine Eigenschaft, die ein Range-Objekt zurückgibt.
7. Range kann als Auflistung verwendet werden. Der Grund: Range besitzt eine
Item-Eigenschaft und eine verborgene Eigenschaft "_NewEnum (As Unknown)".
8. ANTWORT ZUR FRAGE 1 UND 3:
Die Klasse Range besitzt gemäss Objektmodell eine Range-Eigenschaft! Das
erklärt, weshalb "Cells.Cells.Cells.Count" ohne Fehlermeldung funktioniert.
Sprich: Alle Eigenschaften, die ein Range-Objekt zurückgeben, können auf
diese Art beliebig wiederholt werden. Und von diesen gibt es jede Menge
(z.B. Rows und Columns). Zum Vergleich: Application besitzt auch eine
Eigenschaft Application! Die Eingabe "?Application.Application.Application"
funktioniert problemlos. FRAGE 1 und 3 sind somit beantwortet.
9. ANTWORT ZUR FRAGE 2:
- Wenn ich "?Range("A1")" mit oder ohne Default-Eigenschaft Value eingebe,
wird wie erwartet Wert der Zelle A1 des aktiven Arbeitsblattes der aktiven
Arbeitsmappe ausgegeben. Die Eingabe funktioniert, weil Range eine
Eigenschaft von "Global" ist und sich auf die aktiven Elemente
(ActiveWorkbook,
ActiveSheet) bezieht.
- Wenn "?Range("A1:A2")" abgefragt wird, erhalte ich den Laufzeitfehler 13
"Typen unverträglich". Das ist nachvollziehbar, denn Value kann für Range -
als Auflistung verwendet - nicht ermittelt werden. Ich konnte es nicht
lassen, mal "?Range("A1:IV65536")" einzugeben. Das Ergebnis war der
Laufzeitfehler 7! Wenn ich das richtig interpretiere, versucht VBA
tatsächlich zuerst Value zu ermitteln (-> Fehler 7) bevor die
Typenverträglichkeit geprüft wird (-> Fehler 13)!!! Analog verhält es sich
bei Cells, nur dass bei "?Cells" immer der Laufzeitfehler 7 erscheint, da
bei Weglassen der beiden optionalen Indizes alle Zellen angesprochen werden.
FRAGE 2 ist somit beantwortet.
10. Bei der Gelegenheit habe ich untersucht, weshalb nach Eintippen von
"Cells("
die Parameterinfo "_Default([RowIndex], [ColumnIndex])" eingeblendet wird.
Das ist nämlich für ein Range-Objekt ungewöhnlich und im Objektkatalog auch
nicht erwähnt. Die Ursache konnte ich finden: Range besitzt die verborgene
Eigenschaft "_Default", welche als Default-Eigenschaft definiert ist. Es
scheint, dass bei sämtlichen "Range-ähnlichen" Objekten immer diese
Eigenschaft angezeigt und verwendet wird (u.a. auch bei Rows und Columns).
Ungewöhnlich ist (für mich), dass der Datentyp der Eigenschaft nicht
deklariert ist (d.h. das "As xxx" fehlt).
Wolfang Habernoll hat geschrieben, dass der Speicherüberlauf-Fehler auch
unter Excel 2002 auftritt (mit anschliessendem Systemstillstand!). Das
zeigt,
dass auch in neuer Excel-Versionen das Range-Objekt nicht gerade sauber
ist.
PS: Lest unbedingt mein Posting zum Cells-Bug!
Gruss an alle!
Philipp von Wartburg
Range("C3:G9").Select arbeite wie von dir erwartet, genauso
Range("A1:B2").Select aber sieh dir mal
Range("C3:G9").Range("A1:B2").Select an. Man kann das so weiterführen.
Laut Oh ist Item die Standardeigenschaft von Cells und benötigt Zeilen- und
Spaltenindex. Ohne diese Angabe sind alle Zellen gemeint, also eine
Vereinfachung der Schreibweise.
Mfg, Franz
"Philipp von Wartburg" <philipp.vo...@bluewin.ch> schrieb im
Newsbeitrag news:3c93b...@news.bluewin.ch...