Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema RefEdit
BildScreenshot zu RefEdit RefEdit-Seite mit Beispielarbeitsmappe aufrufen

Range Bereich verallgemeinern

Betrifft: Range Bereich verallgemeinern von: SusiOhm
Geschrieben am: 12.08.2014 15:33:35

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?

  

Betrifft: Set rngBereich = Range("A1:B300") owT von: robert
Geschrieben am: 12.08.2014 15:41:39




  

Betrifft: AW: Set rngBereich = Range("A1:B300") owT von: Ewald
Geschrieben am: 12.08.2014 19:11:27

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


  

Betrifft: AW: Range Bereich verallgemeinern von: Rudi Maintaire
Geschrieben am: 13.08.2014 10:25:40

Hallo,

vbBereich = "A1:B300"
set rngBereich = Range(vbBereich)

Gruß
Rudi


  

Betrifft: AW: Range Bereich verallgemeinern von: Ewald
Geschrieben am: 13.08.2014 11:00:06

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


  

Betrifft: Braucht si edenn mehrere, ... von: Luc:-?
Geschrieben am: 13.08.2014 11:23:22

…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 :-?


  

Betrifft: AW: Braucht si edenn mehrere, ... von: Ewald
Geschrieben am: 13.08.2014 13:03:17

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


  

Betrifft: Sicher hast du da recht, ... von: Luc:-?
Geschrieben am: 13.08.2014 18:25:30

…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 :-?


  

Betrifft: Neben allen Vorschlägen, die dein Problem ja ... von: Luc:-?
Geschrieben am: 13.08.2014 11:16:41

…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 :-?


  

Betrifft: AW: Neben allen Vorschlägen, die dein Problem ja ... von: Ewald
Geschrieben am: 13.08.2014 17:57:07

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


  

Betrifft: Natürlich stellt sich auch hier wieder mal ... von: Luc:-?
Geschrieben am: 13.08.2014 19:25:36

…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 :-?


  

Betrifft: AW: Natürlich stellt sich auch hier wieder mal ... von: Ewald
Geschrieben am: 13.08.2014 23:33:18

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


  

Betrifft: Meine Bemerkung war auch nicht allzu ... von: Luc:-?
Geschrieben am: 15.08.2014 01:37:04

…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 :-?


 

Beiträge aus den Excel-Beispielen zum Thema "Range Bereich verallgemeinern"