Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1372to1376
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

Range Bereich verallgemeinern

Range Bereich verallgemeinern
12.08.2014 15:33:35
SusiOhm
Liebe Leute,
ich habe folgenden Programmiercode:
Set rngBereich = Range("A1,B1,A2,B2,A3,B3,A4,B4,A5,B5,A6,B6,A7,B7,A8,B8")
über den Befehl
MsgBox rngBereich.Areas(10).Value
werden mir die einzelnen Werte aus dem Rangebereich angezeigt.
Mein Problem ich möchte den Code verallgemeinern, um den Rangbereich zu vergrößern,
z.B. so:
vbBereich = Range("A1:B300")
und dann weiter mit
Set rngBereich = Range(vbBereich)
Das geht so aber leider nicht.
Wie bekomme ich das hin?

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Set rngBereich = Range("A1:B300") owT
12.08.2014 15:41:39
robert

AW: Set rngBereich = Range("A1:B300") owT
12.08.2014 19:11:27
Ewald
Hallo,
um die Einzelrange auszulesen, mußt du die auch einzeln angeben.
allerdings darf der String nicht mehr als 256 Zeichen haben.
Für die Bereiche A1:B1 lassen sich max 34 Bereiche definieren.
Als Beispiel
Sub Test()
Dim i As Long
Dim str As String
Dim myrange
str = ""
For i = 1 To 34
str = str & "A" & i & ":B" & i & ","
Next
str = Left(str, Len(str) - 1)
str = str & ""
Set myrange = ActiveSheet.Range(str)
MsgBox myrange.Areas.Count
End Sub
Jetzt kannst du mit Areas die Combi A/B auslesen
Gruß Ewald

Anzeige
AW: Range Bereich verallgemeinern
13.08.2014 10:25:40
Rudi
Hallo,
vbBereich = "A1:B300"
set rngBereich = Range(vbBereich)

Gruß
Rudi

AW: Range Bereich verallgemeinern
13.08.2014 11:00:06
Ewald
Hallo Rudi,
dann hast du nur ein Areas
Sub Test()
Dim vbBereich As String
Dim rngBereich As Range
Dim i
vbBereich = "A1:B300"
Set rngBereich = Range(vbBereich)
MsgBox rngBereich.Areas.Count
MsgBox rngBereich.Areas(1).Address(0, 0)
vbBereich = "A1:B1,B2:C2,C3:C4,D5:D6"
Set rngBereich = Range(vbBereich)
MsgBox rngBereich.Areas.Count
For i = 1 To rngBereich.Areas.Count
MsgBox "Bereich " & i & " ist " & rngBereich.Areas(i).Address(0, 0)
Next
End Sub
Gruß Ewald

Anzeige
Braucht si edenn mehrere, ...
13.08.2014 11:23:22
Luc:-?
…Ewald?
Das sah doch gar nicht so aus! Auch ihre ursprüngliche Aufzählung sollte normalerweise keinen unzusammen­hängenden Bereich ergeben, da (wenn ich das recht erinnere) alle Zellen aneinander anschlossen. So etwas führt idR bei .Areas.Count zum Ergebnis 1.
Gruß, Luc :-?

AW: Braucht si edenn mehrere, ...
13.08.2014 13:03:17
Ewald
Hallo Luc,
Set rngBereich = Range("A1,B1,A2,B2,A3,B3,A4,B4,A5,B5,A6,B6,A7,B7,A8,B8")
über den Befehl
MsgBox rngBereich.Areas(10).Value
werden mir die einzelnen Werte aus dem Rangebereich angezeigt.

es geht doch nicht um zuammenhängende oder nicht zusammenhängende Bereiche.
Sie will mit Areas an jeden Teilbereich kommen. Dazu ist es aber nötig auch jeden Teilbereich anzugeben, hierbei ist es zu nächst unwichtig ob es eine Zelle oder ein Bereich ist.
du hast dann mit Areas und Operatoren viele Möglichkeiten Kombinationen aus den Teilbereichen zu bilden.
MsgBox Application.WorksheetFunction.Sum(rngBereich)
MsgBox Application.WorksheetFunction.Sum(rngBereich.Areas(1))
MsgBox rngBereich.Areas(4) 'nur bei Einzelzelle
MsgBox Application.WorksheetFunction.Sum(rngBereich.Areas(1)) * rngBereich.Areas(4)
leider begrenzt die Stringlänge die mögliche Anzahl an Areas.
wird mehr gebraucht wäre ein Array sinnvoll,hier kommst du ja auch an jeden Wert.
Gruß Ewald

Anzeige
Sicher hast du da recht, ...
13.08.2014 18:25:30
Luc:-?
…Ewald,
wenn sie das tatsächlich so will. A1:B300 wäre aber ein einheitlicher Bereich und hat keine TeilBereiche, sondern Zeilen u/o Spalten. An die kommt man in Gesamtheit ganz einfach per entsprd Array-Bildung → ein Vektor mit Elementen aus Zeilen- oder Spaltenwerten.
Ansonsten kann es durchaus sein, dass VBA gezwungen ist, die ürsprüngliche Range-Angabe als mehrere Areas zu interpretieren, auch, wenn sie direkt aneinanderstoßen. Überlässt man die Areas-Bildung einer Automatik, läuft's aber so wie von mir beschrieben.
Gruß, Luc :-?

Neben allen Vorschlägen, die dein Problem ja ...
13.08.2014 11:16:41
Luc:-?
…lösen können, Susi,
würde ich doch empfehlen, dass du für den Bereich einen Namen definierst. Dann hast du mit künftigen Erweiterungen auch in VBA kein Problem. Alternativ könntest du Rudis Vorschlag modifiziert aufgreifen und keine Variable vbBereich, sondern eine Konstante festlegen, die entweder den o.g. Namen oder die Adresse enthält, falls du keinen Namen definieren willst. Das erleichtert evtl spätere Pgm­Änderungen. Also entweder Const naBereich$ = vbBerName oder Const adBereich$ = "A1:B300" verwenden. Der Set-Befehl würde dann entsprd lauten: Set rngBereich = Range(naBereich) bzw Set rngBereich = Range(adBereich)
Was du bisher versucht hast, hat folgende Auswirkungen:
Mit vbBereich = Range("A1:B300") weist du einer Variablen vom vermutlichen Typ Variant ein Range-Objekt zu. Damit ist sowohl eine Referenz auf das OriginalObjekt als auch nur die Wiedergabe seiner Werte möglich.
Mit Set rngBereich = Range(vbBereich) willst du eine ObjektVariable mit einer Referenz auf ein Range-Objekt initiieren. Da du nichts weiter angegeben hast, wird hier der Wert des Bereichs verwendet, was gleich aus zu 2 Gründen zum Fehler führt → Range verlangt die Angabe eines AdressTextes (bzw einer Variablen, die einen solchen enthält, oder eines Namenstextes, dem ein solcher zugeordnet ist – per Bezug der Namensdefinition) oder 2 Cells-Angaben, die Anfang und Ende des Bereichs entsprechen:
1. Es werden Inhalte, also Werte, keine Adressen übergeben.
2. Da es sich um einen Bereich handelt (IsArray(vbBereich) ergibt True), sind das auch noch mehrere, nämlich 600. Dass das das Zulässige sprengt, selbst wenn die ZellWerte Adressen darstellen würden (was sie sicher nicht tun), dürfte sehr wahrscheinlich sein.
Richtig wäre also vbBereich = Range("A1:B300").Address, aber kaum sinnvoll, denn da käme ja auch nur "A1:B300" heraus, was die ganze Variable überflüssig machen würde, denn das kannst du ja auch gleich schreiben. ;->
Gruß, Luc :-?

Anzeige
AW: Neben allen Vorschlägen, die dein Problem ja ...
13.08.2014 17:57:07
Ewald
Hallo Luc,
du kannst zwar einen Namen verwenden und dann per Index jeden Wert rausholen, nur da es zwei Spalten sind nicht gerade sinnvoll.
Spalte A hat die ungeraden und Spalte B die geraden Indexe.
Nur wenn du die Zeile 10 in spalte A haben willst,wie kommst du direkt an den Index
Gruß Ewald

Natürlich stellt sich auch hier wieder mal ...
13.08.2014 19:25:36
Luc:-?
…die Frage, Ewald,
was will der/die Fragesteller/in (hier Susi) damit erreichen. Braucht er/sie nur die Zellwerte, reicht der spaltenweise Übertrag in einen Variant mit Array, benötigt er/sie aber ZellEigenschaften, und sei es „nur“ .Text kommt er/sie wohl an deiner o.ä. Lösung nicht vorbei.
Luc :-?

Anzeige
AW: Natürlich stellt sich auch hier wieder mal ...
13.08.2014 23:33:18
Ewald
Hallo Luc,
eigentlich ist das klar, sie hat ja Value geschrieben. Aber auch .Text wäre kein Problem ist ja nur eine Frage des Einlesens. Value kannst du komplett übergeben, .Text mußt du abklappern.
Das man unbedingt spaltenweise einlesen muß halte ich für fraglich.Da du das Array ja mit lngzeile,intspalte dimensionieren mußt, würde bei 2 Spalten auch intspalte für Spalte B und intspalte-1 für Spalte A reichen.
Bei spaltenweise einlesen müsste der zeilenwert für Spalte B gewünschte Zeile + lngzeile / 2 sein.
Hier mal ein Beispiel mit einem Bereich der per Namen definiert ist. In SpalteA sind Vornamen in SpalteB die entsprechenden Nachnamen.
Sub ArrayNames()
Dim Daten() As Variant
Dim lngZeile As Long, lngLZ As Long
Dim intSpalte As Integer
Dim rng As Range
Dim str
Dim str1
Dim i
'Names "myrange" = Range("A1:B300")
lngLZ = Range("myrange").Rows.Count
intSpalte = Range("myrange").Columns.Count
ReDim Daten(lngLZ, intSpalte)
Set rng = Range("myrange")
Daten = rng
MsgBox Daten(5, intSpalte) 'Nachnamen
MsgBox Daten(5, intSpalte - 1) 'Vornamen
MsgBox Daten(5, intSpalte - 1) & "  " & Daten(5, intSpalte) 'Vornamen und Nachnamen
End Sub
Gruß Ewald

Anzeige
Meine Bemerkung war auch nicht allzu ...
15.08.2014 01:37:04
Luc:-?
…speziell auf SusiΩ bezogen, Ewald! ;-)
.Text war auch nur ein Bsp, denn auch andere Eigenschaften kann man ja per „Abklappern“ in Arrays verpacken. Mir gings da auch eher um nachträgliche bedarfsweise Anforderung solcher Eigenschaften. Dafür ist es dann natürlich nützlich, Referenzen auf die Objekte zV zu haben.
Ich meinte auch Einlesen einer ganzen Spalte auf 1× in einen passenden Vektor. Das Gebilde ist dann 1dimensional und mit nur 1em Index wird eine ganze Spalte zurückgegeben. Mit 2 Indizes dann ein einzelner Wert in derselben, also hier bspw vsp(1) → Spalte1 (bzw 2), vsp(0)(0) → Wert1 (bzw 2) in derselben. Mit vsp(LBound(vsp)) bzw vsp(LBound(vsp))(LBound(vsp(LBound(vsp)))) erhält man garantiert immer die (bzw den) erste(n).
(Nebenbei, wenn man die Elemente dieser Einzelspalten dann zeilenweise in ein Array steckt und diese Arrays zu Elementen eines vertikal über die Zeilen gerichteten Vektors macht, erhält man einen einen 1dimensionalen vertikalen Vektor aus horizontalen Vektoren, der ohne Umwandlung auf einen ZellBereich - auch zeilenweise - abbildbar ist bzw sein sollte, falls alle TeilVektoren gleiche ElementeAnzahlen haben, was bei dieser Methode ohnehin Voraussetzung sein sollte.)
Gruß, Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige