Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Wie spreche ich eine Tabelle an
zurück: Schleifen weiter: Letzte benutzte Zelle ermitteln Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Information Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Isabelle :-)
Menschin


Verfasst am:
02. Jun 2013, 10:10
Rufname:
Wohnort: Westlicher Spiralarm der Galaxis


Wie spreche ich eine Tabelle an - Wie spreche ich eine Tabelle an

Nach oben
       Version: Office 2k (2000)

Hallöchen,

weil das nicht korrekte ansprechen von Tabellen immer wieder zu Fehlern wollen wir das Ganze mal näher beleuchten.

Wenn du mit dem Makrorekorder etwas aufzeichnest, wird immer das Sheets-Auflistungsobjekt benutzt. Z.B. Sheets("Tabelle1") oder Sheets("Diagramm1").

Daran siehst du schon, das Sheets-Auflistungsobjekt unterscheidet nicht zwischen Tabellen und Diagrammen.

Ein Auflistungs-Objekt ist eine Sammlung gleicher Objekte und endet fast immer mit s. Also: Sheets, Worksheets, Workbooks, Columns, Rows, Shapes, OLEObjects ….. Die Ausnahmen: Range, SeriesCollection, Collection, Dictionary …..

Bei solchen Konstruktionen:

Code:
Public Sub Test1()
    Dim lngIndex As Long
    For lngIndex = 1 To ThisWorkbook.Sheets.Count
        Debug.Print Sheets(lngIndex).Range("A1").Value
    Next
End Sub

Scheppert es dann, wenn sich in der Mappe ein Diagrammblatt befindet. Denn das hat ja bekanntlich keine Zellen.

Du könntest natürlich eine Abfrage einbauen ob das Sheet eine Tabelle oder ein Diagramm ist. Aber das ist nur notwendig, wenn du in dieser Schleife ausschließlich Diagramme ansprechen willst. Das könntest du dann so machen:

Code:
Public Sub Test2()
    Dim lngIndex As Long
    For lngIndex = 1 To ThisWorkbook.Sheets.Count
        If TypeOf Sheets(lngIndex) Is Chart Then _
            Debug.Print Sheets(lngIndex).Name
    Next
End Sub

Willst du nur Tabellen ansprechen, dann benötigst du keine zusätzliche Abfrage, da es für Tabellen ein separates Auflistungs-Objekt gibt:

Code:
Public Sub Test3()
    Dim lngIndex As Long
    For lngIndex = 1 To ThisWorkbook.Worksheets.Count
        Debug.Print Worksheets(lngIndex).Range("A1").Value
    Next
End Sub

Du siehst, ich benutze hier beides mal das Worksheets-Auflistungs-Objekt. Denn hier ist es wieder so, wenn sich zwischen den Tabellen ein Diagrammblatt befindet und du würdest Sheets(lngIndex) benutzen, du wieder in einen Fehler läufst.

Mit For-Next - Schleifen durch Objekte zu laufen ist aber nicht gerade das schnellste, weil dabei ja immer die komplette Auflistung angesprochen wird. Effektiver und schneller sind For-Each - Schleifen um solche Auflistungen zu durchlaufen.

Code:
Public Sub Test4()
    Dim objWorksheet As Worksheet
    For Each objWorksheet In ThisWorkbook.Worksheets
        Debug.Print objWorksheet.Range("A1").Value
    Next
End Sub

Das spielt bei dem Worksheets-Auflistungsobjekt zwar keine große Rolle, da sich in einer Mappe "normalerweise" nicht hunderte Tabellen befinden. Wenn du aber einen Bereich in einer Tabelle mit mehreren hundert Zellen abklapperst, spielt es sehr wohl eine Rolle, denn es ist erheblich schneller.

Jetzt haben wir nur über das abarbeiten von Schleifen gesprochen. Der "Normalfall" ist aber, dass du eine einzelne Tabelle ansprichst. Hier hast du mehrere Möglichkeiten über die Auflistungsobjekte:

    1. Sheets(1)
    2. Worksheets(1)
    3. Sheets("Tabelle1")
    4. Worksheets("Tabelle1")

1. und 2. Über ihren Index. Das ist nicht ungefährlich, denn wenn ein Benutzer die Tabelle verschiebt oder davor eine neue einfügt, dann stimmt der Index nicht mehr.

3. und 4. Über ihren Namen. Ist zwar etwas sicherer, aber auch das kann zu einem Fehler führen, wenn ein Benutzer die Tabelle umbenennt.

Beides lässt sich mit dem Schützen der Arbeitsmappe (nicht verwechseln mit dem Blattschutz oder den Schreib- bzw. dem Lese- Schreibschutzkennwort) verhindern. Hat aber zur Folge, wenn du die Mappe öffnest, ist das Tabellenfenster nicht mehr maximiert. Das lässt sich zwar per VBA beheben, ist aber nicht notwendig.

Du hast nämlich noch eine fünfte Möglichkeit. Du kannst Tabelle über ihren Objektnamen ansprechen.

Der Objektname eines Blattes kann über die schreibgeschützte Eigenschaft CodeName gelesen werden.

Den Objektnamen findest du im Projektexplorer, das kleine Fensterchen links oben im VBA-Editor. Sollte er nicht zu sehen sein, kannst du ihn mit dem Shortcut CTRL+R einblenden. Im Projektexplorer findest du die Tabellen- und Diagrammblätter unter dem Punkt "Microsoft Excel Objekte". Da siehst du immer als erstes den Objektnamen und dahinter, in Klammern, den Namen auf der Exceloberfläche.

Im Normalfall sind die Objektnamen und die Namen auf der Exceloberfläche gleich:

    Tabelle1 (Tabelle1)
    Tabelle2 (Tabelle2)
    usw.

Benennst du die Tabellen auf der Exceloberfläche um, dann könnte es so aussehen:
    Tabelle1 (Angebot)
    Tabelle2 (Bestand)
    usw.

Du kannst die Tabelle z.B. so ansprechen:

Code:
Tabelle1.Range("A1").Value

Übersichtlicher ist es aber, den Tabellen und Diagrammen, über das Eigenschaftsfenster, sprechende Namen zu geben. Z.B. tblOffer für Angebot, tblInventory für Bestand. Dann sieht das Ganze so aus:

Code:
tblOffer.Range("A1").Value

Damit kann der Benutzer die Tabellen und Diagramme benennen und verschieben wie er will, dein Programm arbeitet trotzdem mit dem richtigen Blatt. Zudem ist es so schneller, da nicht mehr das große Auflistungsobjekt angesprochen werden muss, sondern das Blatt direkt.

Das funktioniert aber nur in der Mappe, in welcher sich unser Code befindet. Es ist nicht möglich, so auf die Tabellen oder Diagramme in anderen Mappen zuzugreifen. Um auch da auf Nummer sicher zu gehen, benutze ich eine Funktion welche mir aufgrund des Objektnamens das entsprechende Blatt zurück gibt:

Code:
Public Function Get_Sheet_By_Codename( _
    ByRef probjWorkbook As Workbook, _
    ByVal pvstrCodename As String) As Object
    Dim objSheet As Object
    For Each objSheet In probjWorkbook.Sheets
        If objSheet.CodeName = pvstrCodename Then
            Set Get_Sheet_By_Codename = objSheet
            Set objSheet = Nothing
            Exit For
        End If
    Next
End Function

Die Deklaration "As Object" deshalb, weil ich über diese Funktion auch auf Diagramme in anderen Mappen zugreifen will. Das ist natürlich etwas langsamer wie wenn ich über das Auflistungs-Objekt der anderen Mappe auf Tabellen oder Diagramme zugreife, aber mir sind ein paar Millisekunden Laufzeit lieber als ein Fehler, nur weil eine Tabelle oder ein Diagramm umbenannt oder verschoben wurde.

_________________
LG Isi

Die Mitgliedschaft im Forum erhöht deine Chance auf eine Antwort von mir um 99,999%
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Formeln: Tabelle in Formel filtern 6 Stefanowitsch 792 12. Aug 2005, 10:51
Stefanowitsch Tabelle in Formel filtern
Keine neuen Beiträge Excel Formeln: Daten aus Tabelle durch key herausholen 11 User003 1309 26. Jul 2005, 11:20
Gast Daten aus Tabelle durch key herausholen
Keine neuen Beiträge Excel Formeln: Werte einer Tabelle auslesen 4 bobi 1930 29. Jun 2005, 13:36
bobi Werte einer Tabelle auslesen
Keine neuen Beiträge Excel Formeln: Aktuelle (fortlaufende Uhrzeit) in Tabelle/ Formular 4 CBR900RR 2354 10. Jun 2005, 09:18
CBR900RR Aktuelle (fortlaufende Uhrzeit) in Tabelle/ Formular
Keine neuen Beiträge Excel Formeln: Werte von einer Tabelle in eine andere Übernehmen 11 Blue_Whirlwind 2311 22. Mai 2005, 17:18
Blue_Whirlwind Werte von einer Tabelle in eine andere Übernehmen
Keine neuen Beiträge Excel Formeln: Kann man 4 Übereinstimungen in einer 2 Tabelle ausgeben?? 2 Blue_Whirlwind 790 03. Mai 2005, 20:08
Arnim Kann man 4 Übereinstimungen in einer 2 Tabelle ausgeben??
Keine neuen Beiträge Excel Formeln: Abfrage von diversen Werten aus einer Tabelle / Suche Formel 1 Sono 956 15. Apr 2005, 19:12
fl618 Abfrage von diversen Werten aus einer Tabelle / Suche Formel
Keine neuen Beiträge Excel Formeln: Frontpage soll per link in eine excel tabelle verweisen 3 Darkspawn 1636 04. März 2005, 16:46
Hübi Frontpage soll per link in eine excel tabelle verweisen
Keine neuen Beiträge Excel Formeln: Sortieren einer Tabelle 5 sandihau 635 05. Feb 2005, 11:24
Nepumuk Sortieren einer Tabelle
Keine neuen Beiträge Excel Formeln: Dropdownliste mit Daten aus anderer Tabelle 9 Arri 2357 31. Jan 2005, 18:34
Arri Dropdownliste mit Daten aus anderer Tabelle
Keine neuen Beiträge Excel Formeln: Text von Tabelle1 auch in Tabelle 2 kopieren 7 Pinguin1977 2848 30. Jan 2005, 16:56
Pinguin1977 Text von Tabelle1 auch in Tabelle 2 kopieren
Keine neuen Beiträge Excel Formeln: Werte aus Projekttabelle 1 automatisch in Tabelle 2 + 3 ? 7 DerDoktor 3771 15. Jan 2005, 14:41
DerDoktor Werte aus Projekttabelle 1 automatisch in Tabelle 2 + 3 ?
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Access Tabellen