Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
964to968
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
964to968
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

RangeAdresse auf Worksheet ohne Sheet?

RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 16:03:27
Andreas
Hallo Herber Fans,
ich beobachte gerade eine kleine Ungereimtheit in VBA. In einem Modul kann ich über die Zeilen

Sub letzteZeile ()
Dim test as Long
Dim c as variant
For Each c in Range(“testrange”)
if c.value  “” then test = c.row
next c
End Sub


Die letzte Zeile des Testranges bestimmen. Wenn ich die gleiche Codezeile nun in einem Tabellenblatt hinterlege, wo sie über Worksheet change ausgelöst wird und das Ergebnis global bereitstellen soll (hierzu über Public eine Dim definiert), dann bekomme ich die Fehlermeldung: die Methode Range für das Objekt Worksheet ist fehlgeschlagen. Erst wenn ich über Sheets(„Tabelle1“).Range(„testrange“) adressiere funktioniert es.
Den Fehler rausbekommen habe ich also. Mein Gedanke ist: Ich arbeite gern mit Ranges in den Makros, da diese – wenn einmal definiert – relativ unempfindlich gegen Änderungen sind. Ein Sheet Name kann sich schnell einmal verändern. Da ich diesen hier jedoch als fixe Stringfolge hinterlegen muß, wird das Makro bei Änderung des Sheetnames versagen. Genau das passiert mit Ranges nicht.
Wie kann ich von einem VBA Worksheet diese Zeilenbestimmung durchführen, ohne Sheet verwenden zu müssen. Bzw. ich nicht mit starren Sheetnames arbeiten muß. Das Ergebnis dieser Bestimmung soll dann global als long allen Modulen zur Verfügung stehen.
Vielen Dank für Eure Hinweise.
Grüße, Andreas

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

Betreff
Datum
Anwender
Anzeige
AW: RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 16:06:00
Original
Hi,
verwende den Codenamen des Blatts, das ist der, der im Projektexplorer links steht.
mfg Kurt

AW: RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 16:30:00
Andreas
Hallo Kurt,
das habe ich getan. Im Projektexplorer steht (die echten Werte, keine Beispiele):
Tabelle2(Mapping)
Wenn ich über Sheets("Mapping").Range("Testrange") gehe funktioniert es. Aber "Mapping" heißt vielleicht einer Woche "Kombinatorik" oder anders. Also dachte ich Dein Vorschlag meint, ich solle die Bezeichnung Tabelle2 verwenden. Ich gehe recht in der Annahme, daß diese Bezeichnungen von Excel vergeben werden und nicht geändert werden können?
Also schrieb ich Sheets("Tabelle2").Range("Testrange") und bekam den Laufzeitfehler 9. Index außerhalb des gültigen Bereiches.
Auch ein Versuch und Irrtum Einsatz und Worksheets("Tabelle2").Range("Testrange") brachte keinen Erfolg.
Woran liegts?
Gruß, Andreas

Anzeige
AW: RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 16:36:40
Renee
Hi Andreas,
Die Syntax für deine Tabelle lautet richtig:

Tabelle2.Range("Testrange") 


ohne Sheets und Hochkommas oder anderes Zeug's.
GreetZ Renée

AW: RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 16:40:56
Andreas
Hi Renée,
das wars gewesen... Jetzt gehts besser. Der Datei (und mir).
Vielen Dank!
Gruß aus Berlin,
Andreas

...als Ergänzung, adressieren von...
02.04.2008 16:43:04
Renee
sheets. Beispiel Tabelle2(Mapping)
über den Index, funktioniert, solange das Blatt nicht in der Reihenfolge verschoben wird:
Sheets(2).Range....
über den Tab-Namen , funktioniert, solange das Blatt nicht unbenannt wird:
Sheets("Mapping").Range...
über den VBA-Namen, funktioniert, solange der VBA-Name nicht geändert wird:
Tabelle2.Range...
Letzte Methode ist die sicherste, wenn das Projekt zusätzlich mit PW geschützt wird und damit dem Benutzer ein Zugriff auf die VBE Umgebung verweigert wird.
GreetZ Renée

Anzeige
AW: ...als Ergänzung, adressieren von...
02.04.2008 16:50:44
Andreas
Hi Renée,
Danke für die zusätzlichen und wertvollen Erläuterungen. Werde sie beherzigen. Wußte nicht, daß man Blätter auch über nen INDEX adressieren kann...
Gruß, Andreas

Anmerkung
02.04.2008 16:14:00
Wolli
Hallo Andreas, einen verwandten Fehler hatte ich gestern: Ich habe in einer Worksheet_Change in einem Blatt folgende Zeile programmiert:

Set rngKennzeichen = Range(Sheets("ID").Cells(2, 1), _
Sheets("ID").Cells(Sheets("ID").UsedRange.Rows(Sheets("ID").UsedRange.Rows.Count).Row, 4))


und bin auf einen Fehler gelaufen. Daraufhin habe ich die Prozedur in die Arbeitsmappe verlagert (Workbook_SheetChange, hierfür muss man noch das gewünschte Blatt spezifizieren), wo sie funktioniert.
Anscheinend hat die Prozedur im Tabellenblatt Probleme, über den Tellerrand zu schauen.
Ich lasse die Frage offen, auf dass ein Kundigerer noch seinen Senf dazugibt.
Gruß, Wolli

Anzeige
@Wolli: Anmerkung zu Anmerkung
02.04.2008 18:25:32
Erich
Hallo Wolli,
wenn du den Bereich vollständig adressierst, gibt es auch kein Problem,
wenn der Code in der Prozedur einer anderen Tabelle steht:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngKennzeichen As Range
Set rngKennzeichen = Sheets("ID").Range(Sheets("ID").Cells(2, 1), _
Sheets("ID").Cells(Sheets("ID").UsedRange.Rows(Sheets("ID").UsedRange.Rows.Count).Row, 4))
MsgBox rngKennzeichen.Cells.Count
' besser so:
With Sheets("ID")
Set rngKennzeichen = .Range(Sheets("ID").Cells(2, 1), _
.Cells(.UsedRange.Rows(.UsedRange.Rows.Count).Row, 4))
MsgBox rngKennzeichen.Cells.Count
End With
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: @Wolli: Anmerkung zu Anmerkung
03.04.2008 12:59:00
Wolli
Hi Erich, danke für die Aufklärung! Das sieht zwar mächtig doppeltgemoppelt aus, bestätigt aber mein Bauchgefühl, dass eine zusätzliche Blattangabe nie schaden kann :-))
Gruß, Wolli

AW: RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 16:35:27
Matthias
Hallo
in de Tabelle so:

Option Explicit
Sub TestinTab()
Dim test As Long
Dim c As Variant
On Error GoTo Ende
With ActiveSheet
For Each c In .Range("testrange") 'den Punkt vor Range nicht vergessen!
If c.Value  "" Then test = c.Row
Next c
MsgBox test
End With
Ende:
End Sub


On Error habe ich mit drin, im Falle der Code wird von einer anderen Tabelle gestartet wird.
Wenn Du jetzt das Blatt umbenennst, ist es mE egal wie das Sheet heißt.
Userbild

Anzeige
AW: RangeAdresse auf Worksheet ohne Sheet?
02.04.2008 18:45:54
Erich
Hallo Andreas,
so ginge es auch:

Sub letzteZeile()
Dim test As Long
Dim c As Range
' Der Name "testrange" verweist auf einen Bereich in einer anderen Tabelle
For Each c In ThisWorkbook.Names("testrange").RefersToRange.Parent.Range("testrange")
If c.Value  "" Then test = c.Row
Next c
'oder
Dim wks As Worksheet
Set wks = ThisWorkbook.Names("testrange").RefersToRange.Parent
For Each c In wks.Range("testrange")   ' Name in anderer Tabelle
If c.Value  "" Then test = c.Row
Next c
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige