VisualBasic Excel Matrix summieren

M@C

Lt. Commander
Registriert
März 2007
Beiträge
1.149
Hallo zusammen,

ich habe folgendes Excel/VBA Problem und wäre über eure Hilfe sehr dankbar.
Ich kenne mich leider nicht mit VBA aus und habe vorhandene Lösung mit Kenntnissen von anderen Sprachen im Hinterkopf geschrieben.

Leider ist der Code sehr langsam und ineffizient. Das ist auch klar, weil ich in jedem FOR Loop mehrere Zugriffe aufs Excel Dokument habe und stattdessen alles einmalig in den Speicher laden sollte.

Aber ersteinmal zu meiner Problemstellung:
Ich habe ein Exceldokument mit einem Zeitstrahl, siehe Bild.
snag.png

Also im Grunde ein Zeitstrahl in welchem verschiedene Objekte aufgelistet werden. Zu einigen Daten (zB 02.Jan) gibt es einen Wert, in diesem Fall „A“.
Was ich nun möchte ist die Anzahl A’s, B’s (und eventuell mehr) zählen und mit einer Gewichtung monatlich zusammenrechnen.
Habe ein 2. Bild angefertigt, welches dies Illustriert.
snag2.png

Nun habe ich mich an eine relativ triviale Lösung gesetzt, die aber unbeschreiblich langsam ist.
Ich mache eine temporäre Lasche mit einer n (Anzahl Objekten) mal m (Anzahl Monate) grossen Matrix und jeder (!) Eintrag enthält folgende Funktion MYSUM.
Wobei rng die jeweilige Zeile auf Bild 1 ist, dte der Monat, strA-strC die gewünschten, zu suchenden Strings und lineDates die Zeile der Daten in Bild 1.
In einem 2. Schritt kopiere ich dann diese Temporäre Lasche in das 2. Dokument (das funktioniert und es ist sogar gewünscht, dass es nicht automatisch gelinkt ist).

Code:
Public Function MYSUM(rng As Range, dte As Date, strA As String, strB As String, strC As String, lineDates As Integer)

Application.ScreenUpdating = False

For Each cell In rng
*** Dim col As Integer
*** col = cell.Column
*** If Not IsEmpty(cell.Value2) Then
******* If Month(Cells(lineDates, col).Value2) = Month(dte) And _
*********** Year(Cells(lineDates, col).Value2) = Year(dte) Then
*********** If cell.Value2 = strA Then
*************** MYSUM = MYSUM + 500
*********** ElseIf cell.Value2 = strB Then
*************** MYSUM = MYSUM + 1000
*********** ElseIf cell.Value2 = strC Then
*************** MYSUM = MYSUM + 2000
*********** End If
******* End If
*** End If
Next cell

Application.ScreenUpdating = True

End Function


Ich bin leider wirklich nicht sehr gewieft mit Excel aber ich stelle mir so etwas wie folgendes vor:

Code:
Public Function SUMCOMPLETE(inRange As Variant, outRange As Variant, startDate As Date, strA As String, strB As String, strC As String, lineDates As Integer)
Dim varray As Variant
Dim vcol As Variant
varray = rng.Value2*

Application.ScreenUpdating = False*

For i = 1 To UBound(varray, 2)
*** If Not IsEmpty(varray(1, i)) Then
******* If Month(Cells(lineDates, i).Value2) = Month(dte) And _
*********** Year(Cells(lineDates, i).Value2) = Year(dte) Then
*********** If varray(1, i) = strA Then
*************** SUMCOMPLETE = SUMCOMPLETE + 500
*********** ElseIf varray(1, i) = strB Then
*************** SUMCOMPLETE = SUMCOMPLETE + 1000
*********** ElseIf varray(1, i) = strC Then
*************** SUMCOMPLETE = SUMCOMPLETE + 2000
*********** End If
******* End If
*** End If
Next

Application.ScreenUpdating = True

End Function
Also dass man sozusagen der Funktion die Range (oder Matrix) aus dem 1. Bild und die Range aus dem 2.Bild übergibt und er dann automatisch in die 2. Matrix alle Werte passend einfügt. Ohne auf jeder Zelle einzeln die Funktion aufzurufen.

Aber leider funktioniert die 2. Version nicht, es sagt „Argumente nicht optional“ obwohl ich definitiv die richtige Anzahl verwende.

Hoffe es ist verständlich und über Hilfe würde ich mich freuen.

Grüsse
 
Moin, also einfach ist dein Text nicht zu verstehen und programmieren kann ich auch nicht, aber wenn ich es richtig verstanden habe, willst du nur das(?):

Anhang anzeigen Mappe1.zip


edit: Zählenwenns() funktioniert erst ab Excel 2007
 
Zuletzt bearbeitet:
Vielen Dank fuer die Antwort und sorry fuer die lange Abwesenheit.
Das funktioniert leider nicht, hat sonst noch jemand einen Vorschlag?
Kann es auch versuchen zu praezisieren.
 
M@C schrieb:
Das funktioniert leider nicht

Was genau funktioniert denn nicht? Bei mir funktionieren seine Formeln einwandfrei.
Ich habe da zwar noch einmal Hand angelegt und sie etwas wartbarer gemacht, aber erzähle uns doch mal:
a) Brauchst du zwingend VBA? Makros sind generell fehleranfällig und sollten nur der allerletzte Ausweg sein
b) Was genau funktioniert bei dir an den Formeln nicht? Wie müssten die Ergebnisse in deinem Fall richtig lauten?

Gruß vom Physikbuddha

EDIT: Pass beim Bearbeiten der Formeln auf, sind Matrixformeln. Immer mit Strg+Shift+Enter abschließen!
 

Anhänge

  • Mappe1.zip
    8,3 KB · Aufrufe: 217
Zuletzt bearbeitet:
Ah, ich denke ich nicht dran gedacht, dass es Matrizformeln sind. Ich schaue es mir am Abend an, vielen Dank.
Die Idee mit VBA, war, dass es vorallem einfacher zum aufsetzen ist.
Ich habe circa 10 solcher Tabellen mit Daten über 2 Jahren und jedesmal verschiedene Anzahl an Objekten.
Aber das hält sich ja in Grenzen, wenn man die Formeln richtig rüberzieht.
 
Hab das ganze mal ausprobiert und es funktioniert noch nicht 100%ig.
Wenn ich zB den Preis für C ändere, gibt es keine Anpassung im Januar, das sollte aber passieren.
Eine Idee wieso das so ist?

Gruss

Edit: scheint nur ein Problem in meiner Tabelle zu sein. Im Original funktioniert es.
 
Zuletzt bearbeitet:
Schau mal in Excel unter Formeln, Berechnungsoptionen ob da auf Automatisch gestellt ist:
Excel.PNG
 
Zurück
Oben