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

Spalten in Tabellen als Range

Spalten in Tabellen als Range
21.11.2021 11:02:24
Klaus_ww
Hallo zusammen,
für folgende Aufgabe bin ich auf der Suche nach einer einfachereren Lösung.
Ich habe eine benannte (intelligente) Tabelle, möchte aus dieser eine oder mehrere Spalten als Range definieren. Dieser Range ist dann die Basis für ein Array.
Aktuell suche ich mir die Spalten anhand der Feldnamen und baue dann mit Cells und lastRow meinen Range. Das geht, aber mein Bauch sagt: das geht einfacher.
Eine Mini-Beispieltabelle habe ich angehängt. Wenn also der gesuchte Range die Spalten "Obst" und "Getränk" wäre - wie würdet ihr da rangehen?
Vielen Dank wieder für euren Support, Grüße
Klaus
https://www.herber.de/bbs/user/149270.xlsx

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

Betreff
Datum
Anwender
Anzeige
AW: Spalten in Tabellen als Range
21.11.2021 11:05:46
Hajo_Zi
Hallo Klaus,
ich konnte Deinen Code nicht sehen., liegt es vielleicht daran das bei mir eine XLSX Datei kein Makro enthältt?
GrußformelHomepage
In diesem Forum bekomme nur selten eine Mailbenachrichtigung, weitere Antworten sind zufällig.
AW: Spalten in Tabellen als Range
21.11.2021 11:27:07
Oberschlumpf
Hi Klaus,
so?

Sub sbArr()
Dim lstrHead As String, lloCol As Long
Dim larARR()
lstrHead = InputBox("Bitte Spaltenüberschrift eingeben")
If IsNumeric(lstrHead) Or _
Len(lstrHead) = 0 Then Exit Sub
lloCol = Range("tbl_Daten[[#Headers],[" & lstrHead & "]]").Column
larARR = Range(Cells(2, lloCol), Cells(Cells(Rows.Count, lloCol).End(xlUp).Row, lloCol)).Value
End Sub
larARR ist dann dein (gewünschtes) Array.
Aber für lastRow ist weiterhin Cells(Cells(Rows.Count.... notwendig.
Allerdings benötigt man hier keine Schleife - und ich vermute, genau DAS wolltest du vermeiden, oder?
Hilfts?
Ciao
Thorsten
...beachte: für lstrHead MUSST du eine vorhandene Ü.schrift einer Spalte eingeben - ich hab die Kontrolle bei Falscheingabe nicht eingebaut...
Anzeige
AW: Spalten in Tabellen als Range
21.11.2021 11:34:51
Klaus_ww
Hallo Hajo, hallo Thorsten,
zunächst mal danke für Antworten, und die Datei hat keinen Code :-)
Thorstens Variante funktioniert wie erwartet, aber ich hatte ja gehofft es gibt eine einfachere Variante.
Sowas wie (Pseudocode) range("tbl_Daten[Header].Column")
Vielleicht habt ihr da noch was in der Schublade?
Grüße
Klaus
AW: Spalten in Tabellen als Range
21.11.2021 16:56:48
Klaus_ww
Ahh, das Listobject sieht mehr danach aus wie ich mir das vorstelle.
Danke für den Hinweis und Link, ich probier das aus. Ansonsten bleibt natürlich immer noch die Range/Cells Methode.
AW: Spalten in Tabellen als Range
21.11.2021 16:59:13
Oberschlumpf
Hi Klaus,
kannst du bitte mal erklären - wieso - dir "einfacherer" Code lieber wäre?
mit meinem Code wird mit Hilfe der letzten Zeile der gesamte, ausgewählte Bereich "in nur einem Rutsch" einem Array zugewiesen.
Mit deiner Bsp-Datei wird man keinen Geschwindigkeitsvorteil feststellen.
Wenn aber eine Datei 100.000 Datenzeilen oder mehr hat, wird mein Code um einiges schneller fertig sein, als wenn man z Bsp mit...

For Durchlauf = erste Zeile To letze Zeile
Array(Durchlauf) = Range("gewählte Spalte" & Durchlauf).Value
Next
...den Wert jeder einzelnen Zeile abfragen/zuweisen würde
Bin gespannt, ob Ralf dir helfen kann.
Ciao
Thorsten
Anzeige
AW: Spalten in Tabellen als Range
21.11.2021 17:10:09
Klaus_ww
Hallo Thorsten,
mein Focus liegt auf der Bestimmung des Ranges - ich würde im Leben nicht dran denken, ein Array per Schleife zu füllen wenn es sich um mehr als eine übersichtliche Datenmenge handelt.
Ich hab's noch nicht versucht, aber das Zuweisen eines Ranges auf ein Array sollte doch mit den Listobjects auch möglich sein - enttäusche mich bitte, wenn ich falsch liege.
Im worst case gilt: Ergebnis ist nicht besser, aber wieder was gelernt.
Grüße
Klaus
AW: Spalten in Tabellen als Range
21.11.2021 17:28:10
Oberschlumpf
Hi Klaus,
ich hab es schon versucht.
Mit Hilfe von Ralfs Tipp kannst du in meinem alten Code 2 Zeilen sparen:

Sub sbArr()
Dim lstrHead As String
Dim larARR()
lstrHead = InputBox("Bitte Spaltenüberschrift eingeben")
If IsNumeric(lstrHead) Or _
Len(lstrHead) = 0 Then Exit Sub
larARR = ActiveSheet.ListObjects("tbl_Daten").ListColumns(lstrHead).DataBodyRange.Value
End Sub
Das Ermitteln der Spalte, in der sich die gesuchte Überschrift befindet, und das Verwenden von Cells(Cells(Rows.... zum Ermitteln der letzten, genutzen Zeile in der ermittelten Spalte ist nicht mehr erforderlich.
Aber noch kürzerer Code fällt mir nicht ein, da ja die gewünschte Spalte nicht fest vorgegeben werden darf sondern dynamisch bleiben muss.
Ciao
Thorsten
Anzeige
AW: Spalten in Tabellen als Range
21.11.2021 18:38:24
Klaus_ww
Super Thorsten,
danke für's Ausprobieren. Ist doch wirklich besser lesbar, findest Du nicht?
Ich stehe ja mit der Excel-Syntax durchaus mal auf Kriegsfuss, daher nochmal explizit ein danke an alle die hier unterstützen.
Wie ich aus der MS Doku gelesen habe, gibt's bei den Listobjects nur die Variante "alle Daten" oder "Daten einer Spalte".
Für mehrere Spalten werde ich dann wohl mit einer Schleife und wechselnden Feldnamen mein Array füllen.
Grüße
Klaus
AW: Spalten in Tabellen als Range
21.11.2021 18:56:24
Oberschlumpf
Hi Klaus,
Zitat: "Für mehrere Spalten werde ich dann wohl mit einer Schleife und wechselnden Feldnamen mein Array füllen."
Das musst du doch nicht - eine Arrayvariable reicht aus - du musst halt nur den Codeteil, der das Array "verarbeiten/verteilen" soll, in ein "Unter-Sub" auslagern.
An das "Unter-Sub" musst du nur das zuvor gebildete Array als Parameter übergeben.
Und all das wiederholt sich so lange, bis du in der Inputbox auf Abbrechen klickst - oder, wenn du immer wieder Inputbox vermeiden willst - dann musst du im Haupt-Sub halt schon festlegen, welche Spalten ins Array sollen

Sub sbArr()
hier mein Code mit InputBox oder eben den festgelegten Spalten
sbUnterSub larARR
End Sub
Sub sbUnterSub(ByVal meinArray)
Dim liIdx As Integer
For liIdx = LBound(meinArray, 1) To UBound(meinArray, 1)
hier dein Code, was mit Inhalt von Array passieren soll
Next
sbArr 'und hier wird wieder das Haupt-Sub mit InputBox aufgerufen (wenn erforderlich)
End Sub
Ob ich jetzt LBound() + UBound() mit den richtigen Parametern angegeben habe, weiß ich nicht, da das Ganze ja nur den prinzipiellen Ablauf darstellen soll, dass du eben nicht für jede Spalte eine eigene Arr-Var befüllen musst.
Aber mit VBA = Gut wirst du das schon hinbekommen.
Ciao
Thorsten
Anzeige
AW: Spalten in Tabellen als Range
22.11.2021 15:39:56
Klaus_ww
Hallo Thorsten,
VBA = gut ist natürlich relativ. Gut ist bei mir, wenn ich zum Ziel komme. Das könnte ich ja bei der aktuellen Thematik mit Range/Cells gemacht haben und alles wäre fein. Erweitert nur halt nicht den manchmal nahen Horizont. Bin ja auch kein Profi sondern nutze VBA als Werkzeug. Und da dauert's halt mit Baumarkt-Werkzeug manchmal länger als mit Profizeug :-)
Zurück zum Thema: (vorläufiges End-) Ziel ist, z.B. 2 Spalten in ein 2-dimensionales Array zu packen mit möglichst kompaktem Code. Das ist vielleicht bei meiner Ursprungsbeschreibung nicht ganz deutlich geworden.
Mit der jetzt hübschen Selektion der Spalte(n) stolpere ich über die Erweiterung des Arrays. Das legen wir ja dynamisch an und packen dann den Range hinein. Die zweite Spalte soll dann in die zweite Dimension, die kann ich per Redim Preserve ja auch erstellen und die bisherigen Daten erhalten. Ich bin aber auf Kriegsfuß (schon wieder), wie ich eine Range auf einen Schlag in die zweite Dimension befördere.
In der nächsten Ausbaustufe sind's dann z.B. 5 Spalten - wird schon wieder unübersichter fürchte ich.
Hast Du dazu noch ein Idee oder hab ich mich einfach verrannt?
Grüße
Klaus
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige