Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Laufzeitfehler 438

Laufzeitfehler 438
16.12.2014 17:43:32
Lisa
Hallo ihr Lieben.
ich komme einfach nicht weiter.
nachfolgend soll die Variable "Heute" mit z.B. "Fr 51" befüllt werden, dieses Format befindet sich im Blatt "IST_Master" in Zelle A1 -> =TEXT(***;"TTT")& " " & KALENDERWOCHE(***;21)
allerdings will er einfach die Variable nicht "befüllen" -.-

Dim Prognose As Workbook
Dim Datenbasis As Workbook
Dim IST As Worksheet
Dim Heute As Range
Workbooks("Dokumentation.xlsm").Activate
Workbooks("2014_04_01_Tagesprognose.xlsm").Activate
Set Prognose = ActiveWorkbook
Sheets("IST_Master").Activate
Set IST = ActiveSheet
'Set Heute = Prognose.IST.Range("a1")
Set Heute = ThisWorkbook.Sheet("IST_Master").Range("a1")
Die letzte Zeile will einfach nicht.
Es kommt der Fehler
Laufzeitfehler '438:
Objekt unterstützt diese Eigenschaft oder Methode nicht
Woran liegt das?
Mittlerweile habe ich den selben Fehler nicht nur ein mal, daher wäre ich sehr dankbar, wenn jemand mir das erklären kann, was ich falsch mache, sodass dies künftig nicht mehr geschieht :/
Viiiiiieeeelen Dank =)

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 438
16.12.2014 18:20:47
Daniel
Hi
der Fehler ist, dass da ein s fehlt:
Set Heute = ThisWorkbook.Sheets("IST_Master").Range("a1")
an dem Code: 'Set Heute = Prognose.IST.Range("a1") ist falsch, dass die Worksheetvariable IST schon fest an ein Workbook gebunden ist! das Prognose ist überflüssig und unnötig ist, Set Heute = IST.Range("a1") reicht.
desweiteren solltest du nicht Selektiern und aktivieren, sondern wenn möglich vollständig referenzieren:
schlecht:
Workbooks("2014_04_01_Tagesprognose.xlsm").Activate
Set Prognose = ActiveWorkbook
Sheets("IST_Master").Activate
Set IST = ActiveSheet

besser:
Set Prognose = Workbooks("2014_04_01_Tagesprognose.xlsm")
Set IST = Prognose.Sheets("IST_Master")

oder gleich direkt:
Set IST = Workbooks("2014_04_01_Tagesprognose.xlsm").Sheets("IST_Master")
Gruß Daniel

Anzeige
AW: Laufzeitfehler 438 ->o.T.
17.12.2014 08:25:56
Lisa
Du hast mich gerettet!
Das fehlende "s" war tatsächlich die Lösung.
allerdings frage ich mich, warum dann nicht
Set Heute = Prognose.IST.Range("a1")
funktioniert hat...
ich habe es jetzt einfach ganz ausführlich mit
Set Heute = Workbooks("2014_04_01_Tagesprognose.xlsm").Sheets("IST_Master").Range("a1")

gemacht
zu der Thematik mit den Referenzen hast du Recht,
das wusste ich so auch nicht.
allerdings müssen die verschiedenen Dateien und Blätter ohnehin aktiviert werden, daher ist es in diesem Fall ganz passend.
Nichtsdestotrotz werde ich an anderen Stellen die "Bessere Variante" einbauen =)
nochmals danke =)

Anzeige
AW: Laufzeitfehler 438 ->o.T.
17.12.2014 08:47:31
Daniel
hi,
hatte ich doch geschrieben:
an der Worksheetvariablen IST hängt das Workbook schon automatisch mit dran, deswegen darfst du da nicht nochmals eines davor setzen.
Gruß Daniel

Set XXX = XYX -> Nothing
17.12.2014 13:48:21
Lisa
Oh, so ist das zu verstehen. Alles klar :) schon wieder was dazu gelernt, wie man es vereinfachen kann!
Ich habe jedoch noch ein weiteres anliegen, das eben falls mit dem Set = Befehl zu tun hat.
und zwar habe ich folgenden code:
Private Sub Suchen_Eintragen_Click()
Dim Prognose As Workbook
Dim Datenbasis As Workbook
Dim Prognose_Blatt As Worksheet
Dim Anfang_Zeitraum As Range
Dim PW_Tag1 As Variant
Dim Eingabezeile As Variant
Sheets("Prog_Master").Activate
Set Anfang_Zeitraum = ThisWorkbook.Sheets("Prog_Master").Range("a16") 'Zeile mit der ersten  _
Uhrzeit! -> 00:15
Set PW_Tag1 = ThisWorkbook.Sheets("PW").Range("H2") 'Do 49
Set PW_Tag2 = ThisWorkbook.Sheets("PW").Range("L2")
Set PW_Tag3 = ThisWorkbook.Sheets("PW").Range("P2")
Worksheets("Daten").Activate
ActiveSheet.Range("a:f").Select
'PW als Spalte definieren
Set PW = Selection.Find(What:="PW", after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False)
'###~~~~~~~~~~~Beginn der SUCHEN~~~~~~~~~~~~###
'NEUE SUCHE PW
'Tag1 als Zeile definieren
Set PW_Tag1 = Selection.Find(What:=PW_Tag1.Value, after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False)
ActiveSheet.Cells(PW_Tag1.Row + 1, PW.Column).Select
ActiveSheet.Range(Selection, ActiveSheet.Cells(Selection.Row + 95, Selection.Column)).Select
Selection.Copy
Sheets("PW").Select
ActiveSheet.Range("A:X").Select
'Set Eingabezeile = Selection.Find(What:=Anfang_Zeitraum, after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False)
'Eingabezeile wird kein Wert zugewiesen
Set Eingabezeile = Selection.Find(What:=Anfang_Zeitraum.Value, after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False)
Set PW_Eingabespalte_Tag1 = Selection.Find(What:=PW_Tag1.Value, after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False)
ActiveSheet.Cells(Eingabezeile.Row, PW_Eingabespalte_Tag1.Column).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
zuerst werden 96 Werte kopiert, die dann im Blatt "PW" in der richtigen Stelle eingefügt werden sollen.
Die Spalte wird richtig erkannt, allerdings nicht aber die Zeile, in der das Kopierte eingefügt werden soll.
Bei der Überwachungsfunktion spuckt es nach folgendem Schritt für Eingabezeile immer "Nothing" aus,
obwohl für Anfang_Zeitraum der richtige Wert eingelesen wurde.
Set Eingabezeile = Selection.Find(What:=Anfang_Zeitraum.Value, after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False)
Das hieße ja, dass er den Wert (Anfang_Zeitraum) in dem selektierten Bereich einfach nicht findet, oder?
aber warum?
der Zeitraum ist eine Reihe von Viertelstunden, also
00:15
00:30
00:45
01:00
01:15
...
die Variable Anfang_Zeitraum ließt dementsprechend 00:15 aus.
Egal wie ich Anfang_Zeitraum definiere, ob als Range, Variant oder Double (weil 00:15 als 1,04166666E-02 gelesen wird), es will einfach nichts finden -.-
Das schlimmste:
ein paar Zeilen darüber funktioniert es bei:
Set PW_Tag1 = Selection.Find(What:=PW_Tag1.Value, after:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False)
was habe ich hier nur übersehen ?

Anzeige
AW: Set XXX = XYX -> Nothing
17.12.2014 14:07:17
Daniel
Hi
da .FIND nach genauer Übereinstimmung sucht, könnte hier die kleinen Ungenauigkeiten der Gleitkommazahlen eine Rolle spielen, das ist ein generelles Problem.
ein Workaround wäre beispielsweise dass du eine Hilfsspalte anlegst, in welcher du dir die Zeit mit der Formel =Text(...;"hh:mm") als Text anzeigen lässt und dann mit .FIND auch konkret nach dem Text "00:15" suchst.
Gruß Daniel

Anzeige
Korrekt und vollständig referenzieren
16.12.2014 18:26:36
Christian
hallo Lisa,
bei "VBA gut" ist dir das Objekt-Modell doch sicher bestens bekannt.
Tipp:
- verzichte auf Activate, sondern referenziere korrekt und vollständig
- schau dir in der VBA-Hilfe mal den Unterschied zw. ThisWorkbook und ActiveWorkbook an
Hier ein Bsp in Anlehnung an deinen Code:
Option Explicit
Sub TestIt()
Dim wkb As Workbook
Dim wks As Worksheet
Dim rng As Range
Set wkb = Workbooks("Dokumentation.xlsm")
Set wks = wkb.Sheets("IST_Master")
Set rng = wks.Cells(1, 1)
' hier dein Aktionen, zB:
MsgBox rng.Value
Set rng = Nothing
Set wks = Nothing
Set wkb = Nothing
End Sub
Gruß
Christian

Anzeige
AW: Korrekt und vollständig referenzieren -> o.T.
17.12.2014 08:28:21
Lisa
Hallo Christian.
Das war mir bisher gar nciht so bewusst.
Da die Dateien und Blätter hier ohnehin angesteuert und aktiviert werden müssen, passt es hier ganz gut.
An anderen Stellen allerdings werde ich wie du vorgeschlagen hast den "direkteren" Weg einbauen =)
Außerdem habe ich mich jetzt auch über ThisWorkbook und ActiveWorkbook schlau gemacht.
Vielen Dank für die Hilfe =)

Anzeige
AW: Laufzeitfehler 438
17.12.2014 06:10:06
Olek
Hi Lisa,
hast Du aktuell ein Windows Update gemacht? Wenn ja, dort ist ein Bug drinnen, der diesen Laufzeitfehler verursacht, so ist es zumindest bei all unseren Makros gewesen.
Im WWW hab ich einen Batch mit Erklärung gefunden.
Den Ausführen und dann sollte es wieder klappen.
http://www.haserodt.de/index.php?site=505 (hier haben wir den Batch gefunden)
Gruß Olek

Anzeige
AW: Falscher Thread...
17.12.2014 09:38:18
Olek
Hi Boris,
nee war schon bewußt auf Lisa geantwortet. Da sie ja schireb dass sie das Problem nu mehrfach hatte....
Grüße olek

Anzeige
Nun denn...
17.12.2014 09:40:48
{Boris}
Hi Olek,
...alles klar. Aber Lisas Problem war nur ein fehlendes "s" bei Sheets - mehr nicht ;-)
VG, Boris
;
Anzeige
Anzeige

Infobox / Tutorial

Laufzeitfehler 438 in Excel VBA beheben


Schritt-für-Schritt-Anleitung

  1. Überprüfe den Code auf Syntaxfehler: Achte darauf, dass alle Variablen und Objekte korrekt deklariert und zugewiesen sind. Beispiel:

    Set Heute = ThisWorkbook.Sheets("IST_Master").Range("A1")

    Stelle sicher, dass der Blattname korrekt ist.

  2. Vermeide die Verwendung von Activate und Select: Referenziere Objekte direkt. Anstelle von:

    Workbooks("2014_04_01_Tagesprognose.xlsm").Activate
    Set Prognose = ActiveWorkbook

    Verwende:

    Set Prognose = Workbooks("2014_04_01_Tagesprognose.xlsm")
  3. Behebe den fehlenden Plural bei Sheets: Wenn Du auf ein Arbeitsblatt zugreifst, achte darauf, dass der Name korrekt geschrieben ist:

    Set Heute = ThisWorkbook.Sheets("IST_Master").Range("A1") ' Hier ist das "s" wichtig!
  4. Nutze das Objektmodell effektiv: Reduziere die Anzahl der Schritte, die Du benötigst, um auf ein bestimmtes Objekt zuzugreifen. Zum Beispiel:

    Set IST = Workbooks("2014_04_01_Tagesprognose.xlsm").Sheets("IST_Master")

Häufige Fehler und Lösungen

  • Fehler 438: Objekt unterstützt diese Eigenschaft oder Methode nicht: Dieser Fehler tritt häufig auf, wenn Du versuchst, eine Methode oder Eigenschaft auf einem Objekt zu verwenden, das diese nicht unterstützt. Überprüfe, ob die Objekte korrekt deklariert sind und die richtige Methode verwendet wird.

  • Problem mit Gleitkommazahlen: Wenn Du mit Zeitwerten arbeitest, kann es zu Ungenauigkeiten kommen. Verwende eine Hilfsspalte, um die Zeit als Text zu formatieren, bevor Du sie suchst:

    Set Eingabezeile = Selection.Find(What:=Format(Anfang_Zeitraum, "hh:mm"), ...)

Alternative Methoden

  • Direktes Referenzieren: Anstatt ActiveSheet zu verwenden, kannst Du die Worksheets direkt ansprechen, um Laufzeitfehler zu vermeiden:

    Set PW_Tag1 = ThisWorkbook.Sheets("PW").Range("H2")
  • Verwendung von Find: Um den richtigen Wert zu finden, stelle sicher, dass Du den Suchbereich korrekt definierst und die richtigen Parameter verwendest. Beispiel:

    Set PW_Tag1 = Selection.Find(What:=Format(PW_Tag1.Value, "hh:mm"), ...)

Praktische Beispiele

Hier sind einige Beispiele, die Dir helfen können, Laufzeitfehler 438 in Excel VBA zu vermeiden:

Sub Beispiel()
    Dim wkb As Workbook
    Dim wks As Worksheet
    Dim rng As Range

    Set wkb = Workbooks("Dokumentation.xlsm")
    Set wks = wkb.Sheets("IST_Master")
    Set rng = wks.Range("A1")

    MsgBox rng.Value
End Sub

In diesem Beispiel wird auf die Range direkt zugegriffen, ohne Aktivierung des Arbeitsblatts oder der Arbeitsmappe.


Tipps für Profis

  • Halte Deinen Code sauber und konsistent, indem Du immer die vollständigen Referenzen für Objekte verwendest. Das reduziert die Wahrscheinlichkeit von Laufzeitfehlern erheblich.

  • Nutze die VBA-Hilfe, um den Unterschied zwischen ThisWorkbook und ActiveWorkbook zu verstehen. ThisWorkbook bezieht sich auf die Arbeitsmappe, die den Code enthält.

  • Vermeide es, Variablen und Objekte mehrmals zu deklarieren. Das sorgt für Klarheit und hilft, Fehler zu vermeiden.


FAQ: Häufige Fragen

1. Was bedeutet Laufzeitfehler 438? Dieser Fehler tritt auf, wenn ein Objekt in VBA eine Methode oder Eigenschaft nicht unterstützt, die Du zu verwenden versuchst.

2. Wie kann ich Laufzeitfehler 438 in Excel VBA vermeiden? Stelle sicher, dass Du die Objekte korrekt referenzierst, vermeide die Verwendung von Activate und Select und überprüfe, ob alle Variablen richtig deklariert sind.

3. Was kann ich tun, wenn eine Gleitkommazahl nicht gefunden wird? Du kannst eine Hilfsspalte erstellen, die den Wert als Text formatiert, um Ungenauigkeiten zu vermeiden, oder die Format-Funktion verwenden, um sicherzustellen, dass die Suche nach dem richtigen Textwert erfolgt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige