Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

3 Fragen zur Cells-Eigenschaft

48 views
Skip to first unread message

Philipp von Wartburg

unread,
Mar 16, 2002, 4:50:55 PM3/16/02
to
Hallo NG

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


Wolfgang Habernoll

unread,
Mar 16, 2002, 6:05:31 PM3/16/02
to
Hallo 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


MRR

unread,
Mar 17, 2002, 11:34:47 AM3/17/02
to
Frage 1: Einige Objekte sind rekursiv aufgebaut: Cells, Application etc.,
d.h., Du kommst immer wieder auf das selbe Objekt oder seinen
Elternbestandteil zurück. Warum das so ist (oder wofür man das braucht),
frage ich mich auch.
Frage 2: Cells ist (wie auch Worksheets, Sheets, Controls, Rows, Columnms
etc.) ein Auflistung, die über keine Standard-Eigenschaft verfügen. Wir
benötigen hier irgendein Objekt, das wir näher betrachten wollen. Im
Direktfenster ist die Meldung in der Tat hässlich; im Coder weigert er sich,
diese überhaupt zu kompilieren.
Frage 3: Ich denke mal, man könnte sich tot-Rowsen. Das ist wie eine Art von
Stottern. Es ist verständlich, aber nicht nicht nicht nötig, ein- und
dasselbe Objekt mehrfach mehrfach mehrfach zu wiederholen, da wir uns
sowieso immer nur wieder auf die ZeilenZeilenZeilen beziehen. Da Rows alle
Zeilen von Cells ausmacht und Du davon alle Zeilen ansprichtst, von denen
Dich alle Zeilen interessieren, im Speziellen dann allerdings alle Zeilen,
kommen wir auch dahin, deren Zeilenanzahl zu erfahren.

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...

Dr. Eckehard Pfeifer

unread,
Mar 17, 2002, 12:58:09 PM3/17/02
to
Hallo, ich schliesse mich dem fast an. Allerdings wuerde ich noch ein
bisschen korrigieren.
Nach meinem Gefuehl ist Cells keine Auflistung, sondern ein Range-Objekt
(was ggf. aus verschiedenen Range-Objekten besteht, weshalb for each
funktioniert).
Worksheets z.B. ist ein Sheets-Objekt.
Als Range-Objekt kennt Cells natuerlich alles, was Range kennt, und somit
auch die Eigenschaft (!) Cells. Es wird als Eigenschaft also gelegentlich
ein Objekt zurueck gegeben. Cells.Cells bedeutet dabei also, es wird ein
Range-Objekt gegeben, welches der Eigenschaft Cells eines vermeintlich
"anderen" entspricht - im Ergebnis kann hier aber nur Cells selbst entstehen
(das ist m. E. auch nicht rekursiv).
Ob das Stottern hier notwendig gebraucht wird, wuerde ich verneinen (also
keinen Sinn suchen). Aber: Vermeiden kann man es bei dem Konzept der
"Vererbung", welches hier umgesetzt wird, wohl kaum.
Range-Objekte haben eine Standard-Eigenschaft, es ist wohl Value. Aber das
ist sinnvoll nur fuer den Fall, dass das Atom (sprich eine einzelne Zelle)
angesprochen wird. Im uebrigen vewende ich die Standardeigenschaft nur, wenn
ich beim Testen zu faul zum Schreiben bin.

--
Mit freundlichen Grüßen
Eckehard Pfeifer

www.dr-e-pfeifer.de
Ein Blick lohnt sich immer: www.vba-magazin.de

Dr. Eckehard Pfeifer

unread,
Mar 17, 2002, 2:07:31 PM3/17/02
to
Hallo, nochmal ich. Ich habe eben in der Hilfe von XP noch ein bisschen
geschmoekert und korrigiere mich:
1. Range als Klasse ist eine Auflistung
2. Range kann eine Eigenschaft sein, die ein Range-Objekt liefert
3. Value ist Standard und gibt auch immer was zurueck. Bei mehreren Zellen
im Range ist es ein Array, was durch MsgBox nicht angezeigt werden kann (nur
einzeln). Und

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.

Philipp von Wartburg

unread,
Mar 18, 2002, 4:35:57 PM3/18/02
to
Hallo zusammen

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


f.risling

unread,
Mar 17, 2002, 9:50:36 AM3/17/02
to
Tach,
das mit Cells.Cells ist by Design so, weil der zweite Bereich relativ zu dem
ersten ist. Beispiel:

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...

0 new messages