Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1288to1292
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
Zellwerte effizient in Array einlesen
17.12.2012 12:10:43
Tobler
Hallo zusammen,
ich möchte aus einer Excel-Datei die Zellwerte eines bestimmten Bereichs (z.B. "A5:H10000") in ein Array in VBA übertragen, damit ich dort dann mit diesen Werten bestimmte Berechnungen durchführen kann (z.B. (Wert aus A5) + 3,6*(Wert aus E5) ).
Das ergibt dann wieder ein Array, das ich in die Tabelle zurückschreiben möchte.
Bisher habe ich das über zwei for..to Schleifen gemacht, mit denen ich für jede Zeile, die Eingabe-Werte lese (Variable1=cells(i,1).value, variable2=cells(i,2).value, usw.), dann mache ich damit meine Berechnungen und schreibe das über cells(i,j).value=ErgebnisJ wieder in die Tabelle zurück. Das funktioniert, ist nur aufgrund der recht großen Zeilen und Spaltenzahl ziemlich langsam und ich vermute, dass das vor allem durch die vielen Lese-/Schreib-Prozesse kommt.
Daher würde ich gerne alle Werte auf einmal in ein Array einlesen, dann mit diesem Array meine Berechnungen machen und das Ergebnis-Array wieder auf einmal zurückschreiben.
Kann mir jemand die Syntax zum Lesen und Schreiben verraten? Danke für eure Hilfe!!

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellwerte effizient in Array einlesen
17.12.2012 12:26:19
Uduuh
Hallo,
MeinArray=Range("A5:H10000")
Range("A5:H10000")=MeinArray
Gruß
Rudi

AW: Zellwerte effizient in Array einlesen
17.12.2012 12:28:04
Mäxl
Hi,
Bsp.
Option Explicit
Sub versiv()
'Bereichs (z.B. "A5:H10000") in ein Array in VBA übertragen,
'damit ich dort dann mit diesen Werten bestimmte Berechnungen durchführen kann
'(z.B. (Wert aus A5) + 3,6*(Wert aus E5) )
Dim i As Long
Dim myarr
myarr = Range("a5:H10000")
For i = 1 To UBound(myarr)
myarr(i, 1) = 3.6 * myarr(i, 5)
Next
Range("a5:H10000") = myarr
End Sub

arr = Sheets("Tabelle2").Range("A5:H10000") 'Einle
17.12.2012 12:29:30
ransi
HAllo
Das ist einfacher als du denkst.
Schau es dir mal an:
Option Explicit


Public Sub machs()
Dim arr As Variant
Dim L As Long
arr = Sheets("Tabelle2").Range("A5:H10000") 'Einlesen
'Berechnen
For L = 1 To UBound(arr)
    arr(L, 2) = arr(L, 1) + 3.6 * arr(L, 5) 'SpalteB=SpalteA+ 3,6 *SpalteE
Next
'Ausgeben
Sheets("Tabelle2").Range("A5:H10000") = arr
End Sub


ransi

Anzeige
AW: Zellwerte effizient in Array einlesen
17.12.2012 12:55:12
Daniel
Hi
richtig erkannt, das Problem ist die grosse Anzahl von Lese- und vorallem Schreibprozessen.
durch das Einlesen und Schreiben des ganzen Arrays reduzierst du die Anzahl dieser Prozesse auf einen Lese- und einen Schreibprozess (es müssen zwar immer noch viele Zellen gelesen bzw geschrieben werden, aber da das für alle Zellen gleichzeitig passiert, können viele der hierfür erforderlichen Routinen einmalig für alle ausgeführt werden und nicht für jede Zelle einzeln wiederholt).
wie das mit Arrays funktioniert, wurde dir ja hier schon gezeigt.
es gibt aber noch einen weiteren Weg den Prozess zu beschleunigen, welcher insbesondere für einfache Berechnungen geeignet ist:
- schreibe die Berechnung als Formel direkt in die Zellen und ersetze sie dann durch ihren Wert.
auch diese Methode ist sehr schnell, wenn alle Zellen gleichzeitig bearbeitet werden:
hier für dein Beispiel:
With Range("B2:B10000")
.FormulaR1C1 = "=RC1+3.6*RC5"
.Formula = .Value
End With
damit bist du du in den meisten Fällen ähnlich schnell wie mit der Array-Lösung, der Code ist aber kürzer und einfacher (sowohl im Verständnis, als auch beim Testen).
Gruß Daniel

Anzeige
AW: Zellwerte effizient in Array einlesen
17.12.2012 13:19:47
Tobler
Vielen Dank für eure Hilfe!!
So ähnlich hatte ich es schon probiert, da kamen allerdings immer Fehlermeldungen mit unverträglichen Typen.
Jetzt "lese" ich zunächst auch die leeren Ergebnisfelder ein und damit kennt VBA dann die Dimension des Ergebnis-Arrays und damit funktioniert es dann. Anschienend hatte ich da in der Definition der Arrays irgendwas falsch gemacht. Naja...
@Daniel: Dein Hinweis mit den Formeln ist hier nicht ganz so passend, da die Berechnungen etwas komplexer sind und auch noch andere Variablen mit einbeziehen, die schon vorher definiert sind. Ich habe jetzt für die zwanzig Ergebnisspalten nur eine einzige Formel, die diese anderen Variablen mit berücksichtigt. Mit deinem Vorschlag müsste ich die Formel zwnazigmal schreiben und das macht den Code eher unübersichtlich.
Ich bin damit jetzt sehr zufrieden (und die Rechnung "flutscht" richtig schön).
Danke nochmal...

Anzeige
AW: Zellwerte effizient in Array einlesen
17.12.2012 13:44:47
Daniel
hi
ich schrieb ja auch extra "für einfache Berechnungen"
die Berechung in dem Beispiel in deiner Frage war auch auch nicht wirklich sonderlich kompliziert sondern eher einfach.
aber zeig doch mal dein eigentliches Problem.
vielleicht kann man es ja doch in eine einzige Formel packen.
wenn das in VBA geht, warum dann nicht auch direkt in Excel?
Gruß Daniel

AW: Zellwerte effizient in Array einlesen
17.12.2012 14:03:47
Tobler
Ja, das geht sicherlich auch in Excel, aber da müsste ich mir jetzt nochmal Gedanken machen und meinen Code umstricken und da hab ich jetzt nicht so Lust drauf :-).
So wie ichs jetzt habe, funktionierts genau so wie ich es mir vorgestellt habe. Der Vorschlag mit den Formeln ist aber dennoch gut zu wissen, es kommen sicherlich irgendwann mal noch andere Problemstellungen, wo ich das dann mal verwenden kann...
Gruß
Tobler
Anzeige

55 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox zum Thema

EXCEL - VBA: Die Datenstruktur Array


Inhaltsverzeichnis

  1. Was ist ein VBA-Array?
  2. Einsatzzweck
  3. Vorgehensweise
  4. Tipps
  5. Verwandte Funktionen
  6. Zusammenfassung

Was ist ein VBA-Array?

Ein VBA-Array ist eine Datenstruktur, die es ermöglicht, eine Sammlung von Elementen, typischerweise von denselben Datentyp, unter einem einzigen Variablennamen zu speichern. Diese Elemente können dann durch Indices (z.B. Array(1, 5)) aufgerufen werden.


Einsatzzweck


Das direkte Interagieren mit Zellen in Excel über VBA kann langsam sein, besonders bei großen Datenmengen. Das Laden von Daten in ein VBA-Array, das Durchführen von Operationen innerhalb dieses Arrays und das Zurückschreiben der Daten in Excel kann diesen Prozess beschleunigen und effizienter gestalten.


Vorgehensweise

  1. Daten aus Excel in ein VBA-Array laden:

    Dim DatenArray() As Variant
    DatenArray = ThisWorkbook.Worksheets("DeinTabellenblattName").Range("A5:H10000").Value
  2. Mit dem Array arbeiten: Durchlaufe das Array mit zwei For-Schleifen und führe deine Berechnungen durch.

    Dim i As Long, j As Long
    For i = 1 To UBound(DatenArray, 1)
    For j = 1 To UBound(DatenArray, 2)
        ' Beispiel: Berechnung mit Werten aus A und E
        If j = 1 Then
            DatenArray(i, j) = DatenArray(i, j) + 3.6 * DatenArray(i, 5)
        End If
    Next j
    Next i
  3. Daten aus dem VBA-Array zurück in Excel schreiben:

    ThisWorkbook.Worksheets("DeinTabellenblattName").Range("A5:H10000").Value = DatenArray

Tipps

  • Arbeitet man mit sehr großen Datenmengen, kann es sinnvoll sein, vor dem Zurückschreiben des Arrays die Bildschirmaktualisierung (Application.ScreenUpdating) und die automatische Berechnung (Application.Calculation) zu deaktivieren und sie nach dem Schreibvorgang wieder zu aktivieren.
  • Es kann hilfreich sein, die UBound-Funktion zu verwenden, um die Dimensionen des Arrays dynamisch zu bestimmen, anstatt sie fest codiert einzugeben.

Verwandte Funktionen

  • Redim: Damit kannst du die Größe eines Arrays in VBA dynamisch ändern.
  • IsArray: Eine Funktion, mit der überprüft wird, ob eine Variable ein Array ist.

Zusammenfassung

Durch das Arbeiten mit Arrays in VBA anstelle von direkten Zelleninteraktionen kannst du erhebliche Performance-Verbesserungen erzielen, insbesondere bei großen Datenmengen. Das obige Beispiel zeigt, wie du einen Zellbereich in ein Array laden, mit dem Array arbeiten und die Ergebnisse zurück in Excel schreiben kannst.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige