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.
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.
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).
Ich bin leider wirklich nicht sehr gewieft mit Excel aber ich stelle mir so etwas wie folgendes vor:
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
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.

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.

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
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