HERBERS Excel-Forum - das Archiv
Bereich festlegen
Horst

Hallo,
ich will einen Bereich festlegen, erhalte mit meinen Befehlen jedoch einen Fehler
'Hier kommt Anwendungs oder objektorientierter Fehler
Set Bereich = Sheets("Namen").Range(Cells(2, 8), Cells(20, 8))
'Die folgenden Befehle funktionieren jedoch, bzw sie melden keinen Fehler
Set Bereich = Sheets("Namen").Range("H2:H30")
Set Bereich = Range(Cells(2, 8), Cells(20, 8))
Wie kann ich das erste Beispiel ändern ?
Vielen Dank im Voraus
Gruß Horst

Dim Bereich As Range ?
robert

AW: Dim Bereich As Range ?
Horst

Hallo Robert,
Dim Bereich As Range habe ich gemacht.
Set Bereich = Range(Cells(2,8),Cells(20,8) funktioniert ja auch.
Nur wenn ich noch das Blatt davor setze gibt es Probleme
Set Bereich = Sheets("Namen").Range(Cells(2, 8), Cells(20, 8))
Gruß Horst
AW: Dim Bereich As Range ?
IngGi

Hallo Horst,
der Fehler liegt an der unvollständigen Referenzierung. Deine Beispiele stellen sich wie folgt dar:
Beispiel1:
Set Bereich = Sheets("Namen").Range("H2:H30") 

Hier bezieht sich der Rangebereich auf das Tabellenblatt "Namen". so wie du es angegeben hast.
Beispiel2:
Set Bereich = Range(Cells(2, 8), Cells(20, 8)) 

Hier hast du kein Tabellenblatt angegeben. Range und beide Cells beziehen sich auf das aktive Tabellenblatt (bzw. auf das Tabellenblatt, in dessen Codemodul das Makro steht, falls dieses im Modul eines Tabellenblattes steht).
Beispiel3:
Set Bereich = Sheets("Namen").Range(Cells(2, 8), Cells(20, 8)) 

Das geht schief, da du für Range explizit das Tabellenblatt "Namen" vorgegeben hast. Die beiden Cells beziehen sich dagegen auf das aktive Tabellenblatt (bzw. auf das Tabellenblatt, in dessen Codemodul das Makro steht, falls dieses im Modul eines Tabellenblattes steht).
Alternative:
With Sheets("Namen")
.Range(.Cells(2, 8), .Cells(20,8))
End With
Jetzt werden (durch den Punkt davor) Range und beide Cells korrekt über das Tabellenblatt referenziert.
Gruß Ingolf
AW: Bereich festlegen
Oberschlumpf

Moin Horst
Ich habe festgestellt, dass der Befehl
Set Bereich = Sheets("Namen").Range(Cells(2, 8), Cells(20, 8))
nur dann funzt, wenn die Tabelle "Namen" angezeigt wird.
Wenn irgdeine andere Tabelle das ActiveSheet ist, dann funzt der Befehl nicht.
Woran das liegt, weiss ich aber leider auch nicht, da ja zumindest der Befehl
Set Bereich = Sheets("Namen").Range("H2:H30")
der eigtl derselbe wie der obige Befehl ist, auch dann funktioniert, wenn Tabelle "Namen" NICHT angezeigt wird.
Daher würde ich vorschlagen, arbeite nur mit dem 2. Befehl.
/der dritte Befehl ist nicht hilfreich, da dieser Befehl immer nur den Bereich der aktiven Tabelle der Variablen Bereich zuweist.
Hilfts?
Ciao
Thorsten
Nachtrag
Oberschlumpf

...wenn der Befehl
Set Bereich = Sheets("Namen").Range("H2:H30")
für deinen anderen Code n icht hilfreich ist, dann versuch es so:
Sheets("Namen").Activate
Set Bereich = Range(Cells(2, 8), Cells(20, 8))
Sheets("DeineVorherigeTabelle").Activate
Vielleicht solltest du mit
Application.ScreenUpdating = False
...
Application.ScreenUpdating = True
arbeiten, wenn das Flackern durch mehrere Sheets("...").Activate stören sollte.
Ciao
Thorsten
AW: Nachtrag
Horst

Hallo Thorsten,
erst mal vielen Dank.
direkt mit Range("H2:H30") geht es leider nicht, weil ich den Bereich automatisch ermitteln muss.
Also bleibt mir nur die geschichte mit Cells(.....
Auf die Idee mit Sheets(" ").Activate bin ich nicht gekommen. grrrrrr
So könnte ich es machen, obwohl es mir so richtig nicht gefällt, die Blätter umzuschalten.
Auf jeden Fall vielen Dank
Gruß Horst
weil Cells... ein eigenes Range Objekt ist...
Tino

Hallo,
braucht er auch die Tabelle als Objekt, siehe meine Antwort.
Gruß Tino
vielleicht so, Tabelle bei allen bezügen
Tino

Hallo,
beachte die Punkte.
Dim Bereich As Range
With Sheets("Namen")
Set Bereich = .Range(.Cells(2, 8), .Cells(20, 8))
End With
Gruß Tino
AW: vielleicht so, Tabelle bei allen bezügen
Oberschlumpf

Moin Tino
Danke auch von mir für den Hinweis ...Cells = auch Objekt..., aber...
...ist
With Sheets("Namen")
Set Bereich = .Range(.Cells(2, 8), .Cells(20, 8))
End With
nicht das Gleiche wie
Set Bereich = Sheets("Namen").Range(.Cells(2, 8), .Cells(20, 8))
was ohne Tabelle.Activate
auch zum Fehler führt?
Ciao
Thorsten
AW: vielleicht so, Tabelle bei allen bezügen
Luschi

Hallo Thorsten,
bei dem Beispiel:
With Sheets("Namen")
   Set Bereich = .Range(.Cells(2, 8), .Cells(20, 8))
End With
verweisen alle Objekte (die mit dem Punkt davor) auf die Tabelle 'Namen'
Im folgenden Beispiel zeigt Range auf die Tabelle 'Namen' aber .Cells() erwartet eine vorangegangene With-Anweisung, die es aber nicht gibt, und deshalb der Fehler.
Set Bereich = Sheets("Namen").Range(.Cells(2, 8), .Cells(20, 8))
Gruß von Luschi
aus klein-Paris
AW: vielleicht so, Tabelle bei allen bezügen
Oberschlumpf

huch
Hi ?
Ja, hast Recht, ich hab den . vor Cells "nich gesehn", obwohl Tino explizit drauf hingewiesen hatte.
Danke fürs Lernen!
Ciao
Thorsten
AW: vielleicht so, Tabelle bei allen bezügen
Tino

Hallo,
kommt darauf an was Du für den Punkt eingesetzt hast und wo sich der Code befindet.
Befindet sich der Code in einem Modul wird ohne Angabe der Tabelle wird die aktive genommen.
Also muss man jedem Objekt die Tabelle mit zuweisen,
außer dem Range selbst also so 'Range(.Cells(),.Cells())' dies scheint VBA so geregelt zu bekommen
durch die Objekte innerhalb von Range.
Befindet sich der Code in der Tabelle wird diese Tabelle herangezogen.
Hier einige Beispiele
https://www.herber.de/bbs/user/65808.xls
Ich hoffe man kann verstehen was ich hier von mir gebe.
Gruß Tino
danke...
Oberschlumpf

...Tino
Ich war zu vorschnell in meiner Kritik.
Ciao
Thorsten