Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Teilbereiche aus Array

Teilbereiche aus Array
Fred
Hallo zusammen,
ich bin mir sicher, dass mein Problem schon 100 Mal diskutiert worden ist, jedoch konnte ich über die Suche irgendwie nichts passendes finden.
Mein Problem: ich habe einen Array myarray(1 to 10000, 1 to 20). Gibt es ein Möglichkeit:
a.) nur auf bestimmte Spalten zuzugreifen und diese dann in einem neuen Array zu speichern oder in ein Tabellenblatt zu kopieren? Ich kriege das ganze natürlich über For-Schleifen hin, aber hier muss es doch eine einfachere Lösung geben, oder?
b.) wenn es für a) eine Lösung gibt, gibt es dann auch eine Lösung gleich mehrere Spalten (z.B. 2, 4 und 9) über einen Befehl in einem neuen Array zu speichern? Bei z.B. MATLAB ist das ja kein Problem, jedoch habe ich das Gefühl, dass sowas bei VBA-Arrays irgendwie nicht vorgesehen ist?!
Vielen Dank für eure Hilfe!
Fred
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Teilbereiche aus Array
12.03.2010 11:24:17
MichaV
Hallo,
sowas ist in VB nicht vorgesehen. Da musst Du das Array mit For- Schleifen bearbeiten.
Da Du aber mit VBA arbeitest, kannst Du die Excel- Funktion INDEX nutzen, solange Du bei 2D- Arrays bleibst. Das kann aber bei grossen Arrays und Arrays mit langen Werten zu Fehlern führen, es gibt da zumindest noch in XL2000 eine Limitation.

Option Explicit
Sub test()
Dim myarray(1 To 10000, 1 To 20)
Dim z As Long, s As Long
Dim x As Variant
For z = 1 To 10000
For s = 1 To 20
myarray(z, s) = "zeile=" & z & "  spalte=" & s
Next s
Next z
x = WorksheetFunction.Index(myarray, 2)
Range("A1:Z1") = x
x = WorksheetFunction.Index(myarray, 0, 3)
Range("A10:A100") = x
End Sub
Gruss- Micha
Anzeige
AW: Teilbereiche aus Array
12.03.2010 12:59:03
fcs
Hallo Fred,
Arrayoperationen sind unter VBA begrenzt auf das Vertauschen von Zeilen und Spalten.
Falls solche Auszüge von Arrays öffters benötigt werden, dann solltest du dir eine Function schreiben, die die Daten extrahiert.
Nachfolgend ein Beispiel. Der Auszug aus 10000 Zeilen dauert bei mir etwa 1 Sekunde.
Gruß
Franz
Sub ArrayOps()
Dim Zeile As Long, arr1, arr2, dtime As Double
'Dateneinlesen aus Tabellenblatt
dtime = Time
Application.ScreenUpdating = False
With Worksheets(2)
arr1 = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 19))
End With
'Daten aus Array extrahieren
arr2 = ExtractFromArray(arrQuelle:=arr1, arrColumns:=Array(4, 6, 9))
'Daten des 2. Arrays in Tabellenblatt schreiben
With Worksheets(2)
.Range(.Cells(1, 22), .Cells(UBound(arr2, 1), 24)).Value = arr2
End With
Application.ScreenUpdating = True
MsgBox "Dauer" & Time - dtime
End Sub
Function ExtractFromArray(arrQuelle, arrColumns) As Variant
Dim Zeile As Long, Spalte As Long, arr2()
'Ergebnis-Array dimensionieren
ReDim arr2(LBound(arrQuelle) To UBound(arrQuelle), LBound(arrColumns) To UBound(arrColumns))
'Daten in Ergebnis-Array übernehmen
For Zeile = LBound(arrQuelle) To UBound(arrQuelle)
For Spalte = LBound(arrColumns) To UBound(arrColumns)
arr2(Zeile, Spalte) = arrQuelle(Zeile, arrColumns(Spalte))
Next
Next
ExtractFromArray = arr2
End Function

Anzeige
AW: Teilbereiche aus Array
12.03.2010 13:07:51
ransi
HAllo
Wenn deien Arrays nur Zahlen enthlten geht was mit API.
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
    ByRef Destination As Any, _
    ByRef Source As Any, _
    ByVal Length As Long)

Ist aber auch nicht grade einfach....
Ich kann dir nur empfehlen:
setz deine 2 Schleifen auf und Schaufel um.
Das geht so schnell das du es nicht merkst.
Ich nutze Standardmäßig so etwas ähnliches:
Option Explicit


Public Sub Beispieldaten_rein()
With Sheets("Tabelle1").Range("A1:T10000")
    .FormulaLocal = "=ZEILE() & "" "" & SPALTE()"
    .Value = .Value
End With
Aufruf
End Sub


Public Sub Aufruf()
Dim arr As Variant
Dim out As Variant
arr = Sheets("Tabelle1").Range("A1:T10000")
out = extract_arr(arr, 3, 13, 1, 5, 17, 6) 'Zeilen 3 bis 13 der Spalten 1,5,17,6
'Ausgeben
Sheets("Tabelle2").Range("A1").Resize(UBound(out) - LBound(out) + 1, UBound(out, 2)) = out
End Sub


Public Function extract_arr(vntArr As Variant, _
    U As Long, _
    O As Long, _
    ParamArray I() As Variant) As Variant

'U -->die erste Zeile die übertragen werden soll
'O -->die letzte Zeile die Übertragen werden soll
'I--> die einzelnen Spalten die ins neue Array sollen
Dim L As Long
Dim S As Integer
Dim Z As Integer
Redim tmp(U To O, 1 To UBound(I) + 1)
For L = U To O
    For S = LBound(I) + 1 To UBound(I) + 1
        tmp(L, S) = vntArr(L, I(S - 1))
    Next
Next
extract_arr = tmp
End Function


ransi
Anzeige
AW: Teilbereiche aus Array
12.03.2010 13:39:36
Fred
Vielen Dank für eure Hilfe. Die Tipps sind wirklich sehr hilfreich für mich!! Ich werde mir dann wohl eigene Funktionen schreiben, um mit Arrays besser arbeiten zu können.
Viele Grüße
Fred
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Teilbereiche aus Arrays in Excel VBA


Schritt-für-Schritt-Anleitung

Um Teilbereiche aus einem Excel VBA Array zu extrahieren, folge diesen Schritten:

  1. Array erstellen: Definiere ein 2D-Array mit 10.000 Zeilen und 20 Spalten.

    Dim myarray(1 To 10000, 1 To 20) As Variant
  2. Daten füllen: Verwende Schleifen, um das Array mit Werten zu befüllen.

    Dim z As Long, s As Long
    For z = 1 To 10000
       For s = 1 To 20
           myarray(z, s) = "Zeile=" & z & "  Spalte=" & s
       Next s
    Next z
  3. Daten extrahieren: Nutze die Excel-Funktion INDEX, um bestimmte Spalten in ein neues Array zu übertragen.

    Dim extractedData As Variant
    extractedData = WorksheetFunction.Index(myarray, 0, 3) ' Spalte 3
    Range("A10:A100").Value = extractedData
  4. Ergebnis ausgeben: Speichere die extrahierten Werte in einem neuen Tabellenblatt oder einer Zelle.


Häufige Fehler und Lösungen

  • Fehler bei großen Arrays: Bei der Verwendung von INDEX kann es zu Limitationen kommen. Überprüfe, ob du bei 2D-Arrays bleibst und die Größe des Arrays berücksichtigst.

  • Unzureichende Array-Dimensionierung: Stelle sicher, dass dein Array richtig dimensioniert ist. Nutze UBound und LBound, um die Dimensionen zu überprüfen.


Alternative Methoden

Wenn die oben genannten Methoden nicht deinen Anforderungen entsprechen, kannst du auch eine benutzerdefinierte Funktion schreiben, um die Daten aus dem Array zu extrahieren. Hier ein Beispiel:

Function ExtractFromArray(arrQuelle As Variant, arrColumns As Variant) As Variant
    Dim Zeile As Long, Spalte As Long, arr2() As Variant
    ReDim arr2(LBound(arrQuelle) To UBound(arrQuelle), LBound(arrColumns) To UBound(arrColumns))

    For Zeile = LBound(arrQuelle) To UBound(arrQuelle)
        For Spalte = LBound(arrColumns) To UBound(arrColumns)
            arr2(Zeile, Spalte) = arrQuelle(Zeile, arrColumns(Spalte))
        Next Spalte
    Next Zeile

    ExtractFromArray = arr2
End Function

Praktische Beispiele

Hier ist ein Beispiel, wie du mehrere Spalten gleichzeitig extrahieren kannst:

Dim arr1 As Variant
arr1 = Worksheets("Sheet1").Range("A1:T10000").Value
Dim arr2 As Variant
arr2 = ExtractFromArray(arr1, Array(4, 6, 9)) ' Extrahiere Spalten 4, 6 und 9
Worksheets("Sheet2").Range("A1").Resize(UBound(arr2, 1), UBound(arr2, 2)).Value = arr2

Tipps für Profis

  • Verwende Option Explicit: Dies hilft, Fehler durch nicht deklarierte Variablen zu vermeiden.

  • Datenmenge beachten: Bei großen Datenmengen (z.B. 10.000 Zeilen) kann die Verarbeitung lange dauern. Optimiere deine Schleifen und nutze Application.ScreenUpdating = False, um die Performance zu steigern.

  • API-Funktionen nutzen: Für numerische Arrays kann die Verwendung von API-Funktionen wie CopyMemory die Geschwindigkeit erheblich erhöhen.


FAQ: Häufige Fragen

1. Was ist ein Array in Excel VBA?
Ein Array ist eine Sammlung von Variablen, die unter einem gemeinsamen Namen zusammengefasst sind. Du kannst mit Arrays Daten effizient speichern und verwalten.

2. Wie kann ich die Länge eines Arrays in VBA ermitteln?
Verwende die Funktion UBound oder LBound, um die oberen und unteren Grenzen eines Arrays zu bestimmen.

Dim length As Long
length = UBound(myarray, 1) ' Gibt die Länge der ersten Dimension zurück

3. Gibt es eine Möglichkeit, mehrere Spalten auf einmal zu extrahieren?
Ja, du kannst eine benutzerdefinierte Funktion schreiben, die mehrere Spalten basierend auf ihren Indizes ausgibt, was dir Flexibilität bei der Arbeit mit großen Arrays gibt.

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