PDA

Vollständige Version anzeigen : Laufzeitfehler 438 für Set bei Workbook+Worksheet


Hauptnewb
15.07.2014, 08:07
Hallo Zusammen,

ich versuche grade meinen Code etwas übersichtlicher zu gestalten und habe die genutzten Workboks und Worksheets über Set kurzen Variablen zugewiesen. Dabei bin ich aber auf "Laufzeitfehler 438: Objekt unterstützt diese Eigenschaft oder Methode nicht" gestoßen, wenn ich ein Workbookl und ein Worksheet gleichzeitig innerhalb eines einzelnen Befehls verwende. Hier ein Beispeiel:

Workbooks.Open (ThisWorkbook.Path & "\" & "MappeA.xlsm")

Set wbA = Workbooks("MappeA.xlsm")
Set ws1 = Worksheets("Tabelle1")

wbA.ws1.Range("A1") = "Hallo Welt"


Wie kann ich diesen Fehler verhindern? Oder ist es einfach nicht möglich eine solche Anweisung zu erstellen?

Zusätzlich hätte ich die frage, ob es möglich ist, bestimmte Mappen, welche ich mit meinem Makro geöffnet habe, automatisch schließen zu lassen, sobald eine Fehlermeldung wie die hier genannte auftritt?

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.

Vielen Dank und Gruß

EarlFred
15.07.2014, 08:18
Hallo und Gruß,

Du weist der Variable ws1 ein Tabellenblatt zu. Das Tabellenblatt "weiß", zu welcher Mappe es gehört. Es bedarf also keiner Benennung der Mappe bzw. es ist sogar falsch.
Anders wäre es, wenn Du ein bestimmtes Worksheet aus der Worksheets-Auflistung einer bestimmten Mappe herausgreifen willst: Dann ist zur eindeutigen Identifizierung auch die Angabe der Mappe notwendig, auf deren Auflistung Du zugreifen willst.

Worksheets("Tabelle1") Da keine Mappe benannt, wird auf die Auflistung der aktiven Mappe zurückgegriffen

Ähnlich geht es dann eine Ebene tiefer weiter bei den Arbeitsblattbereichen (Range). Siehe Mustercode.

Option Explicit

Sub meinstduso()
Dim wbA As Workbook
Dim ws1 As Worksheet
Dim rngA1 As Range

'Mappe zuweisen
Set wbA = Workbooks.Open(ThisWorkbook.Path & "\" & "MappeA.xlsm")

'Worksheet zuweisen
Set ws1 = wbA.Worksheets("Tabelle1")
'nur zum Testen:
MsgBox ws1.Parent.Name

'Range zuweisen:
Set rngA1 = ws1.Range("A1")
'nur zum Testen:
MsgBox rngA1.Parent.Name
'oder
MsgBox rngA1.Worksheet.Name

rngA1.Value = "Hallo Welt"

'weiterer Code

Set rngA1 = Nothing
Set ws1 = Nothing
Set wbA = Nothing

End Sub

Grüße
EarlFred

Hauptnewb
15.07.2014, 08:41
Super, funktioniert einwandfrei! Vielen Dank!

Kann mir irgendjemand zu meiner zweiten frage helfen?

Zusätzlich hätte ich die frage, ob es möglich ist, bestimmte Mappen, welche ich mit meinem Makro geöffnet habe, automatisch schließen zu lassen, sobald eine Fehlermeldung wie die hier genannte auftritt?

EarlFred
15.07.2014, 08:43
Hallo,

man sollte Fehler vermeiden und nicht panikartig alles schließen, wenn einer auftritt.

Ansonsten ist die Frage zu pauschal für eine konkrete Antwort - und eine genauso pauschale Antwort lautet: Ja.

Option Explicit

Sub meinstduso()
Dim wbA As Workbook
Dim ws1 As Worksheet
Dim rngA1 As Range

On Error GoTo Panicdoor

'Mappe zuweisen
Set wbA = Workbooks.Open(ThisWorkbook.Path & "\" & "MappeA.xlsm")

'Fehler provozieren
Dim hoppala As Integer
hoppala = 1 / 0
'Fehler provozieren


'Worksheet zuweisen
Set ws1 = wbA.Worksheets("Tabelle1")
'nur zum Testen:
MsgBox ws1.Parent.Name

'Range zuweisen:
Set rngA1 = ws1.Range("A1")
'nur zum Testen:
MsgBox rngA1.Parent.Name
'oder
MsgBox rngA1.Worksheet.Name

rngA1.Value = "Hallo Welt"

'weiterer Code

Panicdoor:
If Err Then
MsgBox "Es ist ein Fehler aufgetreten: " & vbLf & "Fehler " & Err.Number & ": " & Err.Description
End If
If Not wbA Is Nothing Then wbA.Close savechanges:=False 'zu machen, nichts speichern!
Set rngA1 = Nothing
Set ws1 = Nothing
Set wbA = Nothing

End Sub

Grüße
EarlFred

Hauptnewb
15.07.2014, 08:54
Hallo,

mit meinem Makro öffne ich sechs Mappen, welche bei erfolgreicher Ausführung auch am Ende wieder geschlossen werden, sobald ich alle benötigten Daten aus diesen Tabellen bezogen habe. Da ich momentan noch dabei bin den Code auszubauen, erhalte ich des öfteren mal unterschiedliche Laufzeitfehler... Da es etwas nervig ist, diese Mappen wieder von Hand zu schließen, wenn ich einen Fehler erhalte, habe ich mir gedacht, dass es ganz nett wäre, wenn es einen Befehl geben würde, welcher die geöffneten Arbeitsmappen automatisch schließt sobald ich einen Fehler erhalte. Es sollte jedoch nicht die Mappe geschlossen werden, welche das Makro beinhaltet.

Ich hoffe mit dieser Beschreibung kannst du mehr anfangen.

Gruß