>> Range(SR.Column, SR.Column).Delete
Das kann gar nicht sein. Laufzeitfehler müssen bei dir schon weitaus früher geworden werden, als erst in der von dir genannten Zeile.
Dann noch mal ausführlich:
'Deletes the column "Sub-Region" if it exists
Dim SR As Range
SR = Workbooks(dbName).Worksheets("Container1").Cells.Find("Sub-Region")
If Not SR Is Nothing Then
Range(SR.Column, SR.Column).Delete
Else
SR = Workbooks(dbName).Worksheets("Container1").Cells.Find("Subregion")
If Not SR Is Nothing Then
Range(SR.Column, SR.Column).Delete
End If
End If
Du hast die Variaible SR ja oben deklariert - Datentyp ist die Klasse 'Range'. Also repräsentiert sie zur Laufzeit ein Objekt.
Objektvariablen werden in Basic mit Set gesetzt. Tut man das nicht, kommt der Laufzeitfehler "Objektvariable oder With-Blockvariable nicht festgelegt" (diese Fehlermeldung bekommst du auch bei dir, nur hal auf Englisch).
Jetzt gibt es noch eine Besonderheit bei der Range-Klasse, die hat nämlich eine Default-Methode (die verborgen ist) und automatisch aufgerufen wird, wenn kein Member Access Operator verwendet wird. Ohne jetzt zu sehr ins Detail gehen zu wollen: Diese erfüllt Default-Methode erfüllt verschiedene Aufgaben, je nach Situation. In unserem Fall hier wird die Eigenschaft Range.Value abrufen.
Da bei dir jedesmal das Set am Anfang der Zeile fehlt, geht der Interpreter also auf die Default-Methode zu, die gleich der Value-Eigenschaft ist und logischerweise kann der Inhalt einer Zelle nicht in ein Range-Objekt umgewandelt (gecastet) werden, und et voilà man hat einen wunderbaren Laufzeitfehler produziert.
Wenn man also mit Objektvariablen arbeitet, dann muss bei der Zuweisung/Referenzierung immer das Set davor schreiben, damit eindeutig ist was gemeint ist.
übrigens:
Range(SR.Column, SR.Column).Delete
Angenommen SR ist ein gültig referenziertes Objekt, dann würde dieser Befehl keine Spalte löschen sondern eine einzelne Zelle. Weil da zwei zahlen angegeben sind und diese sozusagen eine Koordinate darstellen (z.B. {2, 2}, oder {5,5}), also eine einzelne Zelle.
Columns(5).Delete
SR.EntireColumn.Delete
Obige Zeile(n) würde eine Spalte löschen. Danach ist natürlich die Objektreferenz ungültig, da der Bereich (die Spalte) gelöscht wurde.
Mein Tipp: Dokumentation / Hilfe / VBA-Referenz lesen.
Dort steht vieles drin was hier im Forum tagtäglich gefragt wird bzw. unklar ist.
Ebenso sind dort die Grundlagen der Sprache erklärt, sowie die Grundlagen des Programmierens allgemein.
Der Rest ist dann Übung/Praxis. ;o)
Gruß
|