Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
Anzeige

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.
Anzeige
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
Anzeige
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
Anzeige
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
Anzeige
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
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Spalten in Tabellen als Range definieren


Schritt-für-Schritt-Anleitung

Um Spalten in einer intelligenten Tabelle als Range zu definieren, kannst Du den folgenden VBA-Code verwenden. Dieser Code ermöglicht es, die Spaltenüberschrift als Eingabe zu verwenden und den entsprechenden Datenbereich in ein Array zu speichern.

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

Hierbei wird die DataBodyRange der angegebenen Spalte verwendet, um die Daten direkt in das Array larARR zu laden. Dies ist eine einfache und effiziente Methode, um mit Excel VBA eine Spalte anzusprechen, ohne die Cells-Methode verwenden zu müssen.


Häufige Fehler und Lösungen

  1. Falsche Spaltenüberschrift: Wenn Du eine nicht existente Spaltenüberschrift eingibst, gibt es einen Laufzeitfehler. Stelle sicher, dass die eingegebene Überschrift genau mit der in der Tabelle übereinstimmt.

  2. Tabelle nicht gefunden: Wenn die Tabelle nicht den Namen "tbl_Daten" hat, wird der Code nicht funktionieren. Ändere den Tabellennamen im Code entsprechend.

  3. Keine Daten in der Spalte: Wenn die Spalte leer ist, wird das Array ebenfalls leer sein. Überprüfe die Daten in der Tabelle.


Alternative Methoden

Eine andere Möglichkeit, mit Tabellen und Spalten in Excel zu arbeiten, besteht darin, die Cells-Methode in Kombination mit der ListObject-Eigenschaft zu verwenden. Hier ein Beispiel:

Dim lloCol As Long
lloCol = ActiveSheet.ListObjects("tbl_Daten").ListColumns("Obst").Index
larARR = ActiveSheet.ListObjects("tbl_Daten").ListColumns(lloCol).DataBodyRange.Value

Diese Methode ermöglicht es, die Spalte über den Index anzusprechen, was in manchen Fällen nützlich sein kann, insbesondere wenn Du die Position der Spalte kennst.


Praktische Beispiele

  • Einzelne Spalte: Möchtest Du nur eine Spalte, nutze den oben genannten Code. Es reicht, die Spaltenüberschrift in der InputBox einzugeben.

  • Mehrere Spalten: Wenn Du mehrere Spalten in ein 2-dimensionales Array speichern möchtest, kannst Du eine Schleife verwenden, um die Daten jeder Spalte nacheinander hinzuzufügen:

Dim i As Integer
Dim numCols As Integer
numCols = 2 ' Anzahl der Spalten, die Du speichern möchtest
ReDim larARR(1 To numCols, 1 To lastRow)

For i = 1 To numCols
    larARR(i, 1) = ActiveSheet.ListObjects("tbl_Daten").ListColumns(i).DataBodyRange.Value
Next i

Tipps für Profis

  • Verwende With-Anweisungen: Um den Code lesbarer und effizienter zu gestalten, kannst Du die With-Anweisung verwenden. Dies reduziert die Anzahl der wiederholten Zugriffe auf dasselbe Objekt.

  • Fehlerbehandlung einbauen: Implementiere eine Fehlerbehandlung, um sicherzustellen, dass der Code auch bei unerwarteten Eingaben stabil bleibt.

  • Dynamische Spalten: Wenn Du mit dynamischen Spalten arbeitest, kannst Du die Spaltenüberschrift in einer Variablen speichern und diese für verschiedene Operationen wiederverwenden.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Spalten gleichzeitig ansprechen? Du kannst einen Array verwenden, um die Daten mehrerer Spalten zu sammeln. Dazu musst Du eine Schleife implementieren, die durch die Spalten iteriert und die Daten in das Array speichert.

2. Was ist der Unterschied zwischen DataBodyRange und ListColumns? DataBodyRange bezieht sich auf die Daten in der Spalte, während ListColumns die gesamte Spalte darstellt, einschließlich der Überschrift.

3. Wie kann ich die Spaltenüberschrift dynamisch festlegen? Du kannst die Spaltenüberschrift über eine InputBox abfragen, wie im Beispiel gezeigt. Alternativ kannst Du auch eine Dropdown-Liste verwenden, um die Auswahl zu erleichtern.

4. Funktioniert dieser Code in allen Excel-Versionen? Der Code sollte in den meisten modernen Excel-Versionen funktionieren, die VBA unterstützen, aber es ist ratsam, ihn in Excel 2010 und höher zu testen, um sicherzustellen, dass alle Funktionen unterstützt werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige