'Worksheets' gegen 'Worksheet'

Hallo Experten,

was mir auch nach einigen Jahren Programmierung in VBA nicht in den Kopf will:

Wieso kann eine „Sache“ mal Objekt sein, mal eine Eigenschaft, dann hänge ich ein „s“ an und es ist eine Auflistung…

Mit Auflistungen habe ich eigentlich öfters zu tun, aber der Umgang mit den dazugehörigen „Einzelobjekten“ (wie z.B. „Worksheet“) ist mir total fremd. Wenn ich sie mal zu verwenden suche, dann bekomme ich immer Fehlermeldungen.

Ein Element der „Worksheets“-Auflistung bezieht sich doch immer auf ein einzelnes Tabellenblatt. Wieso gibt es dann Eigenschaften, Methoden & Ereignisse beim einen, beim anderen aber nicht?

Vielleicht kann mir das mal jemand an einem Beispiel erklären?

Martin

Hallo Martin,

Worksheet ist ein Tabellenblatt, Worksheets sind Tabellenblätter.

Beispiel ohne Programmiersprache:

Geh bitte zu Deinem Bücherregal und sieh nach, ob jedes Element der Menge ‚Bücher‘ ein Buch ist und ob jedes Buch die Eigenschaft ‚Titel‘ besitzt, ich vermute ja. :smile: Deine Bibliothek wird die Eigenschaft Titel aber nicht besitzen, wenn es nicht gerade eine berühmte Sammlung ist.

Wenn Du VB sagen wolltest, es soll das mal für Dich tun und die Titel auflisten würdest Du wohl schreiben …

Dim Werk As Buch

For Each Werk in Buecher
 Liste.Additem Werk.Titel
Next

Habe ich die Frage richtig verstanden?

Gruß, Rainer

Hi Rainer,

Habe ich die Frage richtig verstanden?

Wahrscheinlich :o)

Kann ich dann das einzelne Element „Worksheet“ irgendwie ansprechen? Oder existiert das nur im übertragenen Sinn als Element der Menge „Worksheets“?

Martin

Hallo Martin,

Kann ich dann das einzelne Element „Worksheet“ irgendwie
ansprechen? Oder existiert das nur im übertragenen Sinn als
Element der Menge „Worksheets“?

ja, das kannst Du ansprechen. Zurück zum Bücherregal.
Wenn Du mir keine Liste Deiner Bücher machen sollst, ich gern ein bestimmtes Buch hätte, geht das nur, indem ich Dir den Titel sage. ‚Gib mir doch bitte mal den Faust‘. :smile:

Die Worksheets haben Namen und sind darüber ansprechbar und Du kannst dann auch auf die Eigenschaften zugreifen.

Wenn ich nichts verändere, habe ich z.B. eine Tabelle1.
Mit ‚For Each Tbl in Worksheets‘ bekomme ich mit ‚Tbl.Name‘ unter anderem auch ‚Tabelle1‘ angezeigt. Ohne Schleife kann ich auch mit
Bezeichnung = Tabelle1.Name auf den Namen zugreifen und bekomme wieder ‚Tabelle1‘. Das macht hier nur wenig Sinn, weil ich den Namen ja kenne. :smile:

Gruß, Rainer

Hallo Martin,

oder so:

 Dim ws As Worksheet
 If (Application.ActiveWorkbook.Worksheets.Count \> 1) Then
 Set ws = Application.ActiveWorkbook.Worksheets(2)
 ws.name = "mein Sheet"
 End If

mfg

Dirk.Pegasus

Hallo Dirk,

Set ws = Application.ActiveWorkbook.Worksheets(2)

Da verwendest Du jetzt aber auch die Auflistung „Worksheets“. Was ich aber nicht verstehe:

Wenn es laut Objektkatalog ein Objekt „Worksheet“ gibt, dann muß ich das im laufenden Code auch einsetzen können, oder?

Ich darf mich zitieren:

Kann ich dann das einzelne Element „Worksheet“ irgendwie ansprechen? Oder existiert das nur im übertragenen Sinn als Element der Menge „Worksheets“?

Danke an Rainer. Er hat mit seinem „Buch“ das Dunkel schon ein wenig gelichtet…

Martin

Hallo,

Wenn es laut Objektkatalog ein Objekt „Worksheet“ gibt, dann
muß ich das im laufenden Code auch einsetzen können, oder?

wenn ich Excel starte und VBA öffne, sehe ich den Projekt-Explorer und das Eigenschaften Fenster.

Sehe ich mir im Eigenschaftenfenster die Eigenschaften von ‚Tabelle1‘ an, steht da in der DropDown Liste: Tabelle1 Worksheet.

Die einzelnen Worksheets sind die Tabellen und lassen sich über ihre Namen ansprechen.

Wenn Du andere Kriterien verwendest und festlegen kannst, welche Tabelle gemeint ist, (die aktive zum Beispiel) kannst Du auch mit dem Schlüsselwort ‚Worksheet‘ darauf zugreifen, wenn es Dir darauf an kommt. Beispeil:

Private Sub CommandButton1\_Click()
 CommandButton1.Caption = ActiveCell.Worksheet.Name
End Sub

Gruß, Rainer

1 Like

Hallo Martin,

genau.

mit der Anweisung

Set ws = Application.ActiveWorkbook.Worksheets(2)

weise ich dem zunächst leeren Objekt ws das zweite sheet aus der Sammlung der Sheets zu. Damit ist ws genau ein Worksheet. Nach der Operation gilt:

ws entspricht Application.ActiveWorkbook.Worksheets(2)

die beiden Aufrufe

ws.name = "test"
Application.ActiveWorkbook.Worksheets(2).name = "test"

sind damit identisch. Sie ändern beide das selbe (!) Objekt.

Warum das Ganze? Die Auflistung der Sheets existiert immer, kann allerdings eine Länge 0 haben, währe dann also leer. Aber die Liste existiert. (Leere Bücherei)

Für den Zugriff ist es aber einfacher sich genau ein Buch, so welche da sind, zu nehmen:

Set ws = Application.ActiveWorkbook.Worksheets(2)
#oder auch das aktuelle Buch
Set ws = Application.ActiveWorkbook.ActiveSheet

dann kann man damit schneller arbeiten (siehe oben), da man nicht ständig dem Bibliothekar sagen muss: „Gib mal Buch 2!“

Deswegen auch meine Kontrolle, ob es denn auch ein Sheet am Index 2 der Liste gibt!

mfg

Dirk.Pegasus

Morgen Rainer,

wenn ich auch bei meinem eigentlichen Anliegen noch nicht ganz am Ziel bin, so habe ich doch etwas Anderes, Wesentliches gelernt (drum das *): daß und wozu man in der Objekthierarchie auch nach oben springen kann:

CommandButton1.Caption = ActiveCell.Worksheet.Name

Ich habe schon öfter verzweifelt nach einer Möglichkeit gesucht, den Namen der Mappe der „ActiveCell“ zu ermitteln. Irgendwie kam ich immer ans Ziel, wenn auch über haarsträubende Umwege. Aber daß ich hinter dem „ActiveCell“ auch die Hierarchie nach oben gehen kann zum Objekt „Application“ oder „Worksheet“ oder was auch immer, auf DIE Idee bin ich nie gekommen. Ich habe mich nur immer gewundert, warum im Objektkatalog auch übergeordnete Objekte drinstehen…

Jetzt werde ich damit ein bisserl rumspielen und wenn ich sicherer geworden bin damit, dann werde ich meine ganzen Programme darauf untersuchen, ob sich mit dieser Sache nicht hier und da eine Verbesserung erzielen läßt.

Uff! Da kommt richtig Arbeit auf mich zu… ;o)

Danke!

Martin