Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Tutorials

Objekte (2) - Laufzeitfehler 438

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --Gruppenthema: 4 Folgen 1 2 3 4 Sie sind in Folge:2
Laufzeitfehler '438'
Objekt unterstützt diese Eigenschaft oder Methode nicht

Ein Fehler der immer wieder mal gemeldet wird und manchen zum Psychater treibt.
Dabei ist der Fehler leicht erklärbar und wie fast meistens, wird er nicht vom Computer verursacht, sondern von dem, der davor sitzt, bzw, programmiert hat.

Bevor ich lange erkläre, bauen wir uns schnell eine Testumgebung auf:

Eine leere Mappe, dass erste Tabellenblatt soll das Aktive sein und auf dem Blatt ein Kreis gezeichnet (aus der Zeichnensymbolleiste)

Markieren Sie nun die Zelle A1.

In einem allgemeinen Modul nachfolgender Code:

Option Explicit
 
Public Sub KeineUnterstuetzung()
 Selection.Value = 15
End Sub

Führen Sie nun den Code aus, und nun sollte in der Zelle A1 die Zahl 15 stehen.

Wählen Sie nun den Kreis aus ( er soll selektiert sein).

Starten Sie nun wieder den Code und und und und und ??????
Unser Laufzeitfehler kommt.

Was ist passiert?


Wir haben mit dem Objekt Selection gearbeitet. Dieses stellt uns Eigenschaften und Methoden zur Verfügung, kann aber erst zur Laufzeit ermitteln, ob diese auch angewendet werden können.
Im ersten Fall (Selektiert ist die Zelle A1) steht die Eigenschaft Value zur Verfügung.
Im zweiten Fall, ein Shape selektiert, nicht. Ein Shape besitzt die Eigenschaft Value nicht.

Das Objekt Selection wird zu dem Object, welches gerade selektiert ist. Erst dann kann VBA auswerten, ob die Eigenschaft zur Verfügung steht. Und wenn dies nicht der Fall ist, kommt die Fehlermeldung.


Hinweis:

Mit dem Selection Objekt zu arbeiten, ist in den allermeisten Fällen nicht notwendig.
Der Code dient nur zur Veranschaulichung.


Interner Tipp:
Eine Excel Schulung von einem Profi ist Gold wert!
Peter Haserodt bietet Ihnen das und noch viel mehr...
Mehr dazu unter: Schulung

Ein häufiges Szenario

Dieser Fehler wird von vielen Makrojüngern gerne über das Sheetsobjekt ausgelöst.

Ein kleines Beispiel, in welchem in jedes Blatt ??? in die Zelle A1 der Blattname hineingeschrieben wird:

 
Public Sub AlleBlatterA1SetzenKatastrophe()
 Dim i As Integer
 For i = 1 To ThisWorkbook.Sheets.Count
  ThisWorkbook.Sheets(i).Range("a1").Value = ThisWorkbook.Sheets(i).Name
 Next i
End Sub


Dies geht lange gut. Bis ???

Ja, richtig, ein Diagrammblatt wird eingefügt in die Mappe. Also ein Diagramm als eigenständiges Blatt. Fügen Sie eins ein und lassen Sie den Code wieder laufen.
Und da ist er wieder, unser Lieblingsfehler.
Wir haben gesagt, durchlaufe alle Blätter der Arbeitsmappe und schreibe in die Zelle A1 den Blattnamen. Wir waren rücksichtslos gegenüber dem Blatttypen. Ein Diagrammblatt hat keine Zellen.

Das Sheetsobject spricht nunmal alle Blätter an, egal welchen Types. Wir haben ganz einfach mit dem falschen Objekt gearbeitet. Eine kleine Änderung im Code und schon können Diagrammblätter vorhanden sein, wie sie wollen, aber es stört uns nicht:

 
Public Sub AlleBlatterA1SetzenKatastropheVermieden()
 Dim i As Integer
 For i = 1 To ThisWorkbook.Worksheets.Count
  ThisWorkbook.Worksheets(i).Range("a1").Value = _
   ThisWorkbook.Worksheets(i).Name
 Next i
End Sub


Zusammenfassung:

Ursache dieses Fehlers ist meistens der Zugriff auf das falsche Objekt, bzw. dass ich mit übergeordneten Objekten arbeite, die nicht eindeutig sind.

Verursacht werden solche Codes hauptsächlich durch 2 Dinge:

Der Makrorekorder:
Dieser arbeitet gerne mit solchen übergeordneten Objekten. Und der Anfänger übernimmt dann diese Schreibweisen, bzw. diese Objekte. Es gibt einige Beiträge in Online Excel, die sich damit beschäftigen.

Schlechte Literatur:
Es gibt leider einiges auf dem Markt, was nicht auf diese Problematik eingeht, bzw. genau solch einen Murks schreibt. Solche Autoren schreiben ihre Bücher mit dem Makrorekorder, ohne den Code zu bereinigen.

Und ganz zum Schluss:

Man kann diesen Fehler auch bewusst produzieren, bzw. auf ihn testen.
Wenn man z.B. prüfen will ob ein Objekt eine Eigenschaft besitzt. Wenn der Laufzeitfehler auftaucht,
kann ich weitgehend davon ausgehen: Es besitzt sie nicht.


Dieses Thema hat weitere Beiträge

Objekte (1) - Punktfrustration
Objekte (2) - Laufzeitfehler 438
Objekte (3) - Me
Objekte (4) - Parent

Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben