Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Laufzeitfehler 1004 Zugriff an andere Tabelle

Laufzeitfehler 1004 Zugriff an andere Tabelle
21.09.2023 10:58:53
Joschi Witchcraft
Hallo Forum.

Ich hatte in einem Code eine feste Vorgabe hinsichtlich der Spalten in einem Range. Nun wollte ich die Spaltenangabe (die Spaltennummern werden zuvor dynamisch ermittelt) über eine Variable machen. Doch der Code bringt Laufzeitfehler 1004.

Mein Code (auf das Wesentliche reduzuiert):

MaxRowsV = 7 ' Sheets(BlattV).UsedRange.Rows(Sheets(BlattV).UsedRange.Rows.Count).Row
SpalteV = 4
SpalteN = 6
Sheets(BlattN).Select 'absichtlich, um nicht in der angesprochenen Tabelle zu sein
Sheets(BlattV).Range("D2:F" & MaxRowsV).Interior.Color = vbYellow
'Sheets(BlattV).Range(Cells(2, SpalteV), Cells(MaxRowsV, SpalteN)).Select
Sheets(BlattV).Range(Cells(2, SpalteV), Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite

Weil ich später von einem Blatt zum anderen kopieren möchte, habe ich absichtlich ein anderes Blatt selektiert.
Der Code mit der bisherigen Schreibweise und dem Einfärben mit Gelb funktioniert. Testweise hatte ich auch einen ".Select" auf den neuen Range gemacht, um zu sehen, ob die richtigen Zellen angesprochen werden (natürlich war ich dazu in der entsprechende Tabelle). Ich konnte keinen Fehler entdecken..

Wenn ich mich allerdings in der angesprochenen Tabelle befinde, dann funktioniert der neue Code.

Was ist an meiner neuen Schreibweise falsch?

Gruß Joschi

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 1004 Zugriff an andere Tabelle
21.09.2023 11:12:15
peter
Hallo

Du mußt auch CELLS auf das richtige Blatt referenzieren.




With Sheets(BlattV)
.Range(.Cells(2, SpalteV), .Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite
end with


Peter
AW: Laufzeitfehler 1004 Zugriff an andere Tabelle
21.09.2023 11:12:38
UweD
Hallo


vor das Cells muss auch noch das Blatt.

Sheets(BlattV).Range(Sheets(BlattV).Cells(2, SpalteV), Sheets(BlattV).Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite



oder verkürzt

With Sheets(BlattV)

.Range("D2:F" & MaxRowsV).Interior.Color = vbYellow
'.Range(.Cells(2, SpalteV), .Cells(MaxRowsV, SpalteN)).Select
.Range(.Cells(2, SpalteV), .Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite
End With


LG UweD
Anzeige
AW: Laufzeitfehler 1004 Zugriff an andere Tabelle
21.09.2023 11:27:08
daniel
Hi
du bekommst einen Fehler, weil du widersprüchliche Anweisungen gibst.
Es sollte logisch sein, dass wenn eine Range auf einem bestimmten Tabellenblatt liegen soll und die Range über zwei Zellen definiert wird (Range(Cells(), Cells()) die Range und die Cells auf dem selben Tabellenblatt liegen müssen, denn sonst hast du einen Widerspruch.
nun ist es so, dass Cells() und Range() ohne eine Tabellenblattangabe davor immer dem aktiven Tabellenblatt zugeordnet werden.

Wenn du als schreibst:
Sheets(BlattV).Range(Cells(2, SpalteV), Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite

dann meint das eigentlich
Sheets(BlattV).Range(ActiveSheet.Cells(2, SpalteV), ActiveSheet.Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite

und wenn jetzt nicht zufällig das BlattV das aktive ist, bekommst du diesen Widersprich.
du musst also, wenn du nicht auf dem aktiven Blatt arbeiten willst, vor JEDEM Cells und Range das Tabellenblatt angeben

da das aber zu langem und unübersichtlichem Code führt, gibt es Hilfsmittel.
Beliebt ist die WITH-Klammer, bei der man das Blatt als WITH-Objekt definert und dann nur noch den Punkt schreiben muss, wenn dieses Objekt gemeint ist:
With Sheets(BlattV)

.Range(.Cells(2, SpalteV), .Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite
End with

ein andere Weg die dreifache Wiederholung des Blattnamens zu vermeiden ist die .Resize-Funktion.
Diese sollte man sich ebenfalls merken, da man die WITH-Klammer häufig schon für was anderes verwendet hat und man nur eine WITH-Klammer gleichzeitig verwenden kann.
Sheets(BlattV).Cells(2, SpalteV).Resize(MaxRowsV - 2 + 1, SpalteN - SpalteV + 1).Interior.Color = vbWhite


die einfachste Verkürzungoption ist, dass man das Blatt nur vor den Cells angibt, aber nicht vor der Range. Da es die Cells sind, die die Range definieren, wird dann das Tabellenblatt der Cells für die Range übernommen (was umgekehrt nicht funktioniert)
Range(Sheets(BlattV).Cells(2, SpalteV),Sheets(BlattV).Cells(MaxRowsV, SpalteN)).Interior.Color = vbWhite

aber achtung, das geht nur in einem Allgemeinen Modul. Steht der Code in einem Tabellenblattmodul, dann muss man auch vor der Range das Tabellenblatt angeben, denn hier ist ohne Tabellenblattangabe IMMER das Tabellenblatt des Moduls das Default-Blatt.

Gruß Daniel
Anzeige
AW: Laufzeitfehler 1004 Zugriff an andere Tabelle
21.09.2023 13:04:18
Joschi Witchcraft
Herzlichen Dank an Peter, Uwe und Daniel für die teils umfangreichen Erläuterungen.

Mir war die Einschränkung bei der Verwendung von Cells nicht bekannt. Ich werde jetzt versuchen, den alten Code Stück für Stück umzustellen. Besonders die Stelle, bei der aus einem Tabellenblatt in ein anderes kopiert wird ....

Ich hoffe, dass ich das nun selber hinbekomme. Notfalls melde ich mich wieder.

Gruß Joschi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige