Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array abhängig von Spaltenüberschriften erstellen

Forumthread: Array abhängig von Spaltenüberschriften erstellen

Array abhängig von Spaltenüberschriften erstellen
17.06.2008 17:57:00
Spaltenüberschriften
Hallo zusammen,
ich stehe vor einem - für mich - unlösbaren Problem.
Ich habe eine Tabelle mit 25 Spalten und 40 Zeilen. Nun möchte ich jede dieser Spalten mit den Werten der Zeilen in ein eigenes Array einlesen, welches den Namen der Spaltenüberschrift trägt. In den Zellen stehen NUR Zahlen.
Sinn der Sache ist, dass die Spalten evtl. verschoben werden. Das also die Spalte mit der Überschrift "Krit1" nicht mehr in Spalte A steht, sondern in Spalte C. Dann soll ein Code durchlaufen, der die Spaltenüberschriften mit den Arraynamen vergleicht, findet sich eine Übereinstimmung, sollen die Daten des Array in die Zeilen unter dem jeweiliegen Spaltennamen geschrieben werden.
Ich danke Euch herzlich für Eure Mühe!
Jonathan

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: wozu soll das gut sein?..
17.06.2008 19:14:15
Chris
Servus Jonathan,
wenn du die Spalten verschiebst, dann verschieben sich auch die Daten in der Spalte, ausser jemand ändert die Überschriften.
Aber was soll das Ganze bringen?
Ich kann deinem Gedankengang nicht wirklich folgen.
Gruß
Chris

AW: wozu soll das gut sein?..
17.06.2008 20:09:00
Jonathan
Hey Chris,
also:
in einer UF werde durch eine ListBox 1-25 Werte ausgewählt, welche dann nebeneinander in die Tabelle geschrieben werden. Diese sind dann die Spaltenüberschriften.
An späterer Stelle werden - auch via UF - Daten in die Zellen der Spaltenüberschriften hinzugefügt, so dass danach eine vollständige Tabelle erstellt wurde. Wenn nun aber nach Einagabe aller Daten auffällt, dass eigentlich eine Spalte mehr hätte gewählt werden sollen und wählt man diese nun in der Listbox aus, werden ja alle Spaltenüberschriften neu geschrieben. so kann es dann vorkommen, dass die Überschrift 1 nicht mehr an erster Stelle, sondern an zweiter Stelle steht. Die Daten, welche in der Spalte stehen, bleiben aber dort und werden dann nachher einer anderen Überschrift zugeordnet. Das geht natürlich nicht.
Daher dachte ich mir, ich könnte die ganzen Daten in ein Array einlesen und nach Neuvergabe der Spaltenüberschriften diesen dann zuordnen. So sind alle Daten wieder da, wo sie sein sollten.
Ich hoffe, es etwas verständlich erklärt zu haben?!
Jonathan

Anzeige
AW: wozu soll das gut sein?..
17.06.2008 20:44:58
Chris
Naja,
wenn schon Daten eingegeben wurden.
Option Explicit
Dim ArrayKrit1(39) As Variant ' 40 Zeilen incl. Überschrift

Sub ArrayEinlesen ()
Dim i as Long
For i = LBound(ArrayKrit1()) To UBound(ArrayKrit1())
ArrayKrit(i) = Cells(i + 1, 1) ' i+1, weil der Array bei 0 anfängt
Next i
End Sub



Sub ArrayAuslesen ()
Dim z As Long, k as Long
For z = 1 to 25 ' Spalten durchlaufen
If ArrayKrit1(0) = Cells(1, z) Then ' wenn Überschrift = erstes Element des Arrays(alte  _
Überschrift)
For k =Lbound(ArrayKrit1()) to UBound(ArrayKrit1())  ' dann schreibe Werte in diese  _
Spalte zurück
Cells(k+1, z) = ArrayKrit1(k)
Next k
Exit For
End if
Next z
End Sub


Vllt. hilfts. Für 25 Spalten musst du allerdings 25 Arrays definieren bzw. einen großen Array.
z.B. Dim ArrayX(1 to 40, 1 to 25) würde auch gehen. Dann hast du allerdings eine Doppelschleife. Als ich würde das Einfügen der neuen Spalten anders machen. Evtl ein Button " Was vergessen? und dann einfach das selektierte entweder hinten anhängen oder dazwischen einfügen.
Gruß
chris

Anzeige
AW: wozu soll das gut sein?..
17.06.2008 20:50:00
Daniel
Hi
du kannst Variablennamen mit VBA nicht Variabel anlegen, da musst du für jede Variable schon ne eingene Codezeile schreiben.
was dir vielleicht helfen könnte, wäre folgende Methode zur Zuweisung der Arrays:
Dim Krit1, Krit2, Krit3 '--- Das sind die Arrays
Krit1 = Rows(1).find(What:="Krit1").resize(40,1).value
Krit2 = Rows(1).find(What:="Krit2").resize(40,1).value
Krit3 = Rows(1).find(what:="Krit3").resize(40,1).value
somit bist du bei der Zuweisung der Arrays unabhänig von der Spaltenanordung, entscheidend ist jetzt nur noch die Überschrift in Zeile 1, diese dürfen jetzt Textlich natürlich nicht mehr geändert werden.
Gruß, Daniel

Anzeige
AW: Array abhängig von Spaltenüberschriften erstellen
17.06.2008 20:55:00
Spaltenüberschriften
Hallo Jonathan,
das ist doch alles Krampf.
Lege doch gleich alle Spalten an und blende die nicht benötigten aus. Alles andere geht sicher in die Hose.

Gruß Sepp



AW: Array abhängig von Spaltenüberschriften erstellen
17.06.2008 22:03:23
Spaltenüberschriften
Hey Ihr,
vielen Dank für die große Resonanz.
Ja, an die Varianten hatte ich auch schon gedacht. Der restliche - und sehr umfangreiche - Code ist aber fertig. Änder ich jetzt die Anordnung der Spalten, muss ich alles andere auch ändern.
Mal eine Frage vorab, das muss ich in meinen Überlegungen dann berücksichtigen:
Berücksichtigt VBA ausgeblendete Spalten? Also, wird z.B. beim Durchlaufen einer Schleife - beispielhaft
for i = 1 to 5
if cells(1,i) ...
next
die angenommene Spalte B (ausgeblendet) berücksichtigt?

Anzeige
AW: Array abhängig von Spaltenüberschriften erstellen
17.06.2008 22:06:07
Spaltenüberschriften
Hallo Jonathan,
ja, ausgeblendete Spalten werden berücksichtigt, aber das lässt sich leicht abfragen.
For i = 1 To 5
    If Columns(i).Hidden = False Then
        If cells(1,i) ...
    End If
Next


Gruß Sepp



Anzeige
AW: Array abhängig von Spaltenüberschriften erstellen
17.06.2008 22:32:00
Spaltenüberschriften
Hey,
gute Idee!
Ich habe jetzt die ganze Zeit versucht, eine Lösung zu finden, leider ohne Erfolg.
Klar, die Idee mit dem Butto "etwas vergessen" ist gut, damit könnte leicht abgefangen werden, wo (vor welcher Spalte) eine neue eingefügt werden muss. Das gefällt mir aber nicht. Der User wählt aus der Listbox verschiedene Werte aus (bis zu 25 möglich), welche dann nebeneinander in die Tabelle geschrieben werden. Wurden z.B. Werte 3,4,5,7 ausgewählt, und möchte der User nun Wert 6 zusättzlich wählen, müsste jetzt eine Spalte zwischen 5 und 7 eingefügt werden. Das ließe sich ja einfach über die Nummer des ausgewählten Eintrages des Listbox realisieren. Jetzt müsste aber irgendwie noch geprüft werden, ob der User bereits vorher Daten eingefügt hat. Ansonsten würden ja immer - auch bei der ersten Wahl - neue Spalten eingefügt werden.
Jonathan

Anzeige
AW: Array abhängig von Spaltenüberschriften erstellen
18.06.2008 14:49:06
Spaltenüberschriften
Hey,
habs jetzt hinbekommen - füge eine neue Spalte ein, lösche die letzte - so sind immer gleich viel Spalten in der vorgegebenen Tabelle vorhanden!
Danke Euch!
;
Anzeige
Anzeige

Infobox / Tutorial

Array abhängig von Spaltenüberschriften erstellen


Schritt-für-Schritt-Anleitung

  1. Arrays definieren: Zuerst musst du die Arrays definieren, die die Werte für jede Spaltenüberschrift speichern. Beispiel:

    Dim ArrayKrit1(39) As Variant ' 40 Zeilen inkl. Überschrift
  2. Daten in das Array einlesen: Erstelle eine Subroutine, um die Daten aus den Zellen in dein Array einzulesen. Hierbei wird angenommen, dass die Werte in der ersten Spalte stehen:

    Sub ArrayEinlesen()
       Dim i As Long
       For i = LBound(ArrayKrit1) To UBound(ArrayKrit1)
           ArrayKrit1(i) = Cells(i + 1, 1) ' i+1, weil der Array bei 0 anfängt
       Next i
    End Sub
  3. Daten aus dem Array auslesen: Erstelle eine weitere Subroutine, um die Werte zurück in die Tabelle zu schreiben, basierend auf den Spaltenüberschriften. Beispiel:

    Sub ArrayAuslesen()
       Dim z As Long, k As Long
       For z = 1 To 25 ' Spalten durchlaufen
           If ArrayKrit1(0) = Cells(1, z) Then ' wenn Überschrift = erstes Element des Arrays
               For k = LBound(ArrayKrit1) To UBound(ArrayKrit1) ' schreibe Werte in die Spalte zurück
                   Cells(k + 1, z) = ArrayKrit1(k)
               Next k
               Exit For
           End If
       Next z
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Array bleibt leer: Stelle sicher, dass die Subroutine ArrayEinlesen vor der ArrayAuslesen-Subroutine aufgerufen wird.
  • Fehler: Falsche Zuordnung von Werten: Überprüfe, ob die Überschriften in der ersten Zeile richtig gesetzt sind. Ein einfaches MsgBox kann dir helfen, die Werte in deinem Array zu überprüfen.

Alternative Methoden

Eine alternative Möglichkeit ist die Verwendung von dynamischen Arrays, um die Zuordnung der Spaltenüberschriften flexibler zu gestalten. Beispiel:

Dim Krit1, Krit2 As Variant
Krit1 = Rows(1).Find(What:="Krit1").Resize(40, 1).Value
Krit2 = Rows(1).Find(What:="Krit2").Resize(40, 1).Value

Diese Methode ermöglicht es, unabhängiger von der Position der Spaltenüberschrift zu arbeiten, solange sie in der ersten Zeile bleibt.


Praktische Beispiele

Hier sind einige konkrete Beispiele, die dir helfen, dein Array effizient zu nutzen:

  1. Daten in ein Array einlesen und ausgeben:

    Wenn du eine ListBox zur Auswahl der Spaltenüberschriften verwendest, kannst du die Überschriften dynamisch verwalten.

  2. Daten in einem ausgeblendeten Bereich verarbeiten:

    Berücksichtige, dass ausgeblendete Spalten in VBA trotzdem verarbeitet werden. Du kannst dies überprüfen, indem du die Hidden-Eigenschaft der Spalte abfragst:

    If Columns(i).Hidden = False Then
       ' Verarbeite die Spalte
    End If

Tipps für Profis

  • Verwende Option Explicit: Dies hilft dir, alle Variablen zu deklarieren, was Bugs vorbeugt.
  • Dynamische Arrays: Überlege, ob du die Größe deiner Arrays dynamisch anpassen möchtest, um Speicherplatz effizient zu nutzen.
  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung in deinen Subroutinen, um unvorhergesehene Fehler abzufangen und entsprechend zu reagieren.

FAQ: Häufige Fragen

1. Berücksichtigt VBA ausgeblendete Spalten? Ja, ausgeblendete Spalten werden berücksichtigt. Du kannst dies in deinen Schleifen abfragen.

2. Wie viele Arrays muss ich definieren? Für 25 Spalten musst du 25 Arrays definieren oder einen großen 2D-Array verwenden, z.B. Dim ArrayX(1 To 40, 1 To 25). Dies kann jedoch die Komplexität erhöhen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige