globale Rangedeklaration geht nicht

Dieser Thread ist Teil einer Diskussion zu einem Artikel:  Zum News-Artikel gehen

Fritz50

Stammgast
Guten Abend

Kann man VB-Ranges globlal deklarieren? Ich finde keine Lösung?
Dazu meine Gedanken und Anforderungen.

Für meine Aufgabe will ich in einem Bereich in zwei Spalten Werte suchen. Das mache ich mit der nachfolgenden Code-Sequenz.
Wenn die aktive Zelle im Range1 ist, suche ich den Zellinhalt in der andern Spalte (Range2). Und manchmalaus der Büchse auch umgekehrt.
Diese Aufgabe kommt in ähnlicher oder gleicher Form in mehr als einer Prozedur vor. Aber immer in den gleichen Bereichen.

Die folgenden Deklarationen sind hier innerhalb der Prozedur. Ich möchte diese aber global machen um sie in mehren Prozeduren nutzen.

Dim iTablength As Integer ' die Tabellenlänge kann erweitert (oder gekürzt) werden Dim Bereich_CD, Bereich_C, Bereich_D As Range iTablength = Sheets("Stammbaum.C.D.").Cells(Rows.Count, 3).End(xlUp).Row ' 3 für Spalte C Set Bereich_C = Range("C2:C" & iTablength) Set Bereich_D = Range("D2:D" & iTablength) Set Bereich_CD = Range("C2:D" & iTablength) If Not Intersect(ActiveCell, Bereich_CD) Is Nothing Then ' 2x negiert ist wahr If Not Intersect(ActiveCell, Bereich_D) Is Nothing Then ' 2x negiert ist wahr Bereich_C.Find(ActiveCell.Text, LookIn:=xlValues, lookat:=xlWhole).Activate 'ID_Vater in C suchen End If UserForm1.Show End If[/ISPOILER]

In der Suchzeile wäre sicher noch angenehm, Fehler abzufangen (keine Übereinstimmung gefunden)

Mit den folgenden Codesequenzen funktioniert es nicht. Nach zwei drei Clicks (neuen Abfragen) ist iTablength = 0 und Bereich_CD Nothing.

Deklarationen im Modul1

Option Explicit ' Variablen Public iTablength As Integer ' Ranges für Tabelle1(Stammbaum.C.D.) (Zugriff auf Zellen) Public Bereich_C, Bereich_D, Bereich_CD As Range Initialisierung der Variablen in der Prozedur Workbook_Open() Private Sub Workbook_Open() iTablength = Sheets("Stammbaum.C.D.").Cells(Rows.Count, 3).End(xlUp).Row '3 für Spalte C Set Bereich_C = Range("C2:C" & iTablength) Set Bereich_D = Range("D2:D" & iTablength) Set Bereich_CD = Range("C2:D" & iTablength) End Sub



Die Werte iTablength und Bereich:C .. werden irgendwie überschrieben. Die Anwendung funktioniert so, dass bei Doppelklick auf eine Zelle sich das Formular öffnet und einige Werte angezeigt werden. Dann kann der Wert in einer Textbox geändert werden. Beim Ereignis Exit auf die Textbox wird das Formular aktualisiert. Das Formular kann auch mit einem Commandbutton geöffnet werden. Das Formular kann natürlich auch geschlossen werden. Dann kann das das Spiel wieder von vorne beginnen.

Zum Range-Objekt habe ich noch folgende Versuche gemacht. Warum gehen Methoden mit Bereich_C nicht

Private Sub Test() Range("C5:D10").Text ' funktioniert, nach dem Punkt zeigt VB eine Auswahl von Eigenschaften und Methoden
' Variante, mein Versuch. Was ist da falsch
Bereich_C = Range("C5:D10") oder Set Bereich_C = Range("C5:D10") Bereich_C. ' nach dem Punkt werden keine Eigenschaften und Methoden angeboten End Sub

Danke für Diskussionsbeiträge.

Schöne Grüsse
Fritz
 
Zuletzt bearbeitet:

Fritz50

Stammgast
Hallo Andreas,

Ich kenne die Regeln. Aber manchmal übersieht man etwas. Und ich programmiere nur sporadisch.
Aber ich denke, ich habe die Deklarationen gem. Abschschnitt Public-Variable gemacht. Es gibt auch keine Fehlermeldung, dass die Variablen nicht gefunden wird, aber der Inhalt die Integer-Variable ist 0 und die Range-Variable ist Nothing. (Wo sind sie verändert worden?)
Und wo ist der Bock in den paar Codezeilen am Ende meines Posts, bezüglich der Rangevariablen Bereich_xy.

Schöne Grüsse
Fritz
 

nochEinAndreas

Stammgast
Was mir noch auffällt: Die Initialisierung im Workbook_Open().
Hier benutzt du nur
Code:
= Range ...
.
Range ohne Zusätze bezieht sich hier auf das aktuelle Tabellenblatt. Das ist in dem Fall das Blatt, das aktiv war, als die Mappe das letzte Mal gespeichert wurde.
Wenn sich Range auf ein anderes Blatt beziehen soll, musst du etwas davor setzen, z.B.
Sheets("MeinBlatt").Range ...

Und noch etwas zu "Variante, mein Versuch":
Wenn du "Bereich_C" als Range dimensioniert hast, musst du
Set Bereich_C = Range("C5:D10")
benutzen. Ohne Set gibt's eine Fehlermeldung.

Und was mir eben noch auffällt:
Mit der Dimensionierung "Public Bereich_C, Bereich_D, Bereich_CD As Range" legst du fest:
Bereich_C als Variant(!)
Bereich_D als Variant(!)
Bereich_CD als Range
Damit bekommst du nach der Eingabe "Bereich_C." auch keine Eigenschaften und Methoden angezeigt.
Wenn du alle Variablen als Range dimensionieren willst, dann so:
Public Bereich_C as Range, Bereich_D as Range, Bereich_CD As Range

Grüße, Andreas
 

Fritz50

Stammgast
Das war mir nicht bewusst, dass bei der Definition in einer Zeile für jede Variable der Typ angegeben werden muss. Wenn ich das z.B. für Integer-Variablen machte, ist das nicht aufgefallen (beinhaltet aber wahrscheinlich ein gewisses Fehlerpotential).
Bei einigen Versuchen mit der Fehlermeldung 'Objektvariable nicht definiert', ist dann beim Abspeichern eine Fenster 'Nicht genügend Speicherplatz vorhanden" aufgetaucht.

Nun habe ich ein kleines Beispiel geschrieben (die Applikation extrem reduziert), das die Problematik aber immer noch enthält. Es werden die drei (globalen) Ranges angezeigt. Die Anwendung funktioniert bis das Formular geschlossen wird. Ein zweites mal öffnen geht nicht. Auch die Doppelklicks auf den markierten Bereich im Blatt führt zum gleichen Fehler.

Ich hänge es als Zip an.

Beste Grüsse
Fritz
 

Anhänge

  • GlobaleRanges-2.zip
    27,3 KB · Aufrufe: 1

nochEinAndreas

Stammgast
Guten Abend Fritz,

danke für die Mappe. Der Fehler war relativ einfach zu finden: Du hast im Code der Userform stehen:
Code:
Private Sub CommandButton1_Click()
    End     'Abbrechen
End Sub

ein Blick in die Online-Hilfe zu "End" sagt:
"Terminates execution immediately. Never required by itself but may be placed anywhere in a procedure to end code execution, close files opened with the Open statement, and to clear variables" (!!!)
Will meinen: Das End-Kommando löscht alle Variablen.
Wenn du eine Userform beenden willst, mach das mit
Code:
Me.Hide
Dann klappt es.

Gruß und einen schönen Abend,
Andreas
 
Zuletzt bearbeitet:
Oben