Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1308to1312
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
Inhaltsverzeichnis

Datum Array

Datum Array
06.05.2013 14:58:14
alexa
Hallo Zusammen
Ich stehe vor folgendem Problem:
Es sollen 3 Spalten in mein Array eingelesen werden. (C,D,E)
In der Spalte Q und R sind 2 Datums.
In Q ist das Eröffnungsdatum in R das schliessdatum.
Es soll nun berechnet werden, wie viele Punkte noch offen sind.
Wen kein Schliessdatum vorhanden ist der Punkt noch offen.
Das auf die letzten 12 Monate.
Anbei findet Ihr eine Beispiel Datei.
Das muss relativ performant sein, da ich bis zu 2000 Daten habe.
Gruss Alexa
https://www.herber.de/bbs/user/85211.xlsx

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

Betreff
Datum
Anwender
Anzeige
Anfrage und Beispielmappe divergieren
06.05.2013 15:06:18
EtoPHG
Hallo Alexa,
Ich kann deine Anfrage und die Beispielmappe nicht in Einklang bringen.
Woher kommen die Daten im Blatt Auswertung?
Ich sehe nirgends Daten ind Q und R.
Was willst du genau machen?
Hast du es schon mit einer Pivottabelle versucht?
Gruess Hansueli

AW: Anfrage und Beispielmappe divergieren
06.05.2013 15:28:28
alexa
Oh entschuldige.
ich meine Natürlich die Spalte D und E :/
Die Daten im Blatt Auswertung habe ich von Hand reingeschrieben.
Mit einer Pivo-Tabelle habe ich es versucht. ich möchte lieber eine VBA oder im Notfall eine Formel Lösung.
Grüessli Alexa

AW: Anfrage und Beispielmappe divergieren
06.05.2013 15:41:17
fcs
Hallo Allex,
hier mein Vorschlag für eine Formellösung. Die Formeln kannst du dann nach rechts kopieren.
Das gleiche als VBA-Lösung ist wahrscheinlich langsamer und nur sinnvoll, wenn du unbedingt keine Formeln haben möchtest. Man könnte ggf. die Formeln per Makro in den Zellen einfügen und dann durch die Werte erstzen.
Gruß
Franz
Tabellenblattname: Auswertung
A              B
2            Typ A
3
4                    30.06.2012
5
6           offene            0
7
8
9
10
11  Typ B und Typ C   30.06.2012
12
13           offene            0
Benutzte Formeln:
B6:  =SUMMENPRODUKT(($A$2=Daten!$C$2:$C$3000)*(Daten!$E$2:$E$3000="")*
(DATUM(JAHR(B4);MONAT(B4);1)=Daten!$D$2:$D$3000))
B13:  =SUMMENPRODUKT((("Typ B"=Daten!$C$2:$C$3000)+("Typ C"=Daten!$C$2:$C$3000))*
(Daten!$E$2:$E$3000="")*(DATUM(JAHR(B11);MONAT(B11);1)=Daten!$D$2:$D$3000))

Anzeige
VBA-Lösung
06.05.2013 18:39:12
Erich
Hi Alex,
hier noch eine VBA-Prozedur. Die 5000 Sätze in der BeiSpielMappe werden so schnell verarbeitet,
dass man es nahzu nicht wahrnimmt. Das wird performant genug sein... :-)

Option Explicit
Sub Auswert()
Dim lngQ As Long, arQ, strT As String, qq As Long, jm As Long
Dim lngM As Long, datJM() As Long, datB, lngE() As Long
Dim lngV As Long
With Sheets("Daten")
lngQ = .Cells(.Rows.Count, 3).End(xlUp).Row - 1
arQ = .Cells(2, 3).Resize(lngQ, 3).Value
End With
With Sheets("Ausw")
strT = Cells(2, 1)
lngM = .Cells(4, .Columns.Count).End(xlToLeft).Column - 1
datB = Cells(4, 2).Resize(, lngM).Value
lngV = 12 * Year(datB(1, 1)) + Month(datB(1, 1)) - 1
ReDim datJM(1 To 12 * Year(datB(1, lngM)) + Month(datB(1, lngM)) - lngV)
Cells(7, 2).Resize(, UBound(datJM) - LBound(datJM) + 1).ClearContents
For qq = 1 To lngQ
If IsEmpty(arQ(qq, 3)) Then
If arQ(qq, 1) = strT Then
jm = 12 * Year(arQ(qq, 2)) + Month(arQ(qq, 2)) - lngV
'           If jm  UBound(datJM) Then
'              MsgBox "Falsches Datum " & arQ(qq, 2)
'           Else
datJM(jm) = datJM(jm) + 1
'           End If
End If
End If
Next qq
Cells(7, 2).Resize(, UBound(datJM) - LBound(datJM) + 1) = datJM
lngM = .Cells(11, .Columns.Count).End(xlToLeft).Column - 1
datB = Cells(11, 2).Resize(, lngM).Value
lngV = 12 * Year(datB(1, 1)) + Month(datB(1, 1)) - 1
ReDim datJM(1 To 12 * Year(datB(1, lngM)) + Month(datB(1, lngM)) - lngV)
Cells(14, 2).Resize(, UBound(datJM) - LBound(datJM) + 1).ClearContents
For qq = 1 To lngQ
If IsEmpty(arQ(qq, 3)) Then
If (arQ(qq, 1) = "Typ B" Or arQ(qq, 1) = "Typ C") Then
jm = 12 * Year(arQ(qq, 2)) + Month(arQ(qq, 2)) - lngV
datJM(jm) = datJM(jm) + 1
End If
End If
Next qq
Cells(14, 2).Resize(, UBound(datJM) - LBound(datJM) + 1) = datJM
End With
End Sub
Und hier die Mappe: https://www.herber.de/bbs/user/85213.xlsm
An Franz' Formeln hab ich auch noch ein wenig gebastelt, in der Gegend B4 - TAG(B4) statt DATUM(...)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Ergänzung
06.05.2013 18:42:09
Erich
Hi Alex,
um Franz' Formeln nicht zu überklatschen, gibt die Prozedur ihre Ergebnisse in den Zeilen 7 und 14 aus.
Das kannst du leicht ändern, wenn nötig.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Ergänzung
06.05.2013 22:58:30
alexa
wow genau das habe ich gesucht, vielen dank dir! sehr gute leistung!
Eine Frage noch, wen sich die Spalten Verschieben und zB der Typ in B und Die beiden Daten in Q und R sind. ist das so noch möglich?
Gruss Alexa

Spalten geändert
07.05.2013 01:17:05
Erich
Hi Alex,
zuerst mal: Danke für die gute Note! ;-)
Die Spaltenänderung macht es kaum länger:

Sub AuswertBQR()
Dim lngQ As Long, arB, arQ, strT As String, qq As Long, jm As Long
Dim lngM As Long, datJM() As Long, datB, lngE() As Long
Dim lngV As Long
With Sheets("Daten")
lngQ = .Cells(.Rows.Count, 2).End(xlUp).Row - 1
arB = .Cells(2, 2).Resize(lngQ).Value
arQ = .Cells(2, 17).Resize(lngQ, 2).Value
End With
With Sheets("Ausw")
strT = Cells(2, 1)
lngM = .Cells(4, .Columns.Count).End(xlToLeft).Column - 1
datB = Cells(4, 2).Resize(, lngM).Value
lngV = 12 * Year(datB(1, 1)) + Month(datB(1, 1)) - 1
ReDim datJM(1 To 12 * Year(datB(1, lngM)) + Month(datB(1, lngM)) - lngV)
Cells(7, 2).Resize(, UBound(datJM) - LBound(datJM) + 1).ClearContents
For qq = 1 To lngQ
If IsEmpty(arQ(qq, 2)) Then
If arB(qq, 1) = strT Then
jm = 12 * Year(arQ(qq, 1)) + Month(arQ(qq, 1)) - lngV
'           If jm  UBound(datJM) Then
'              MsgBox "Falsches Datum " & arQ(qq, 1)
'           Else
datJM(jm) = datJM(jm) + 1
'           End If
End If
End If
Next qq
Cells(7, 2).Resize(, UBound(datJM) - LBound(datJM) + 1) = datJM
lngM = .Cells(11, .Columns.Count).End(xlToLeft).Column - 1
datB = Cells(11, 2).Resize(, lngM).Value
lngV = 12 * Year(datB(1, 1)) + Month(datB(1, 1)) - 1
ReDim datJM(1 To 12 * Year(datB(1, lngM)) + Month(datB(1, lngM)) - lngV)
Cells(14, 2).Resize(, UBound(datJM) - LBound(datJM) + 1).ClearContents
For qq = 1 To lngQ
If IsEmpty(arQ(qq, 2)) Then
If (arB(qq, 1) = "Typ B" Or arB(qq, 1) = "Typ C") Then
jm = 12 * Year(arQ(qq, 1)) + Month(arQ(qq, 1)) - lngV
datJM(jm) = datJM(jm) + 1
End If
End If
Next qq
Cells(14, 2).Resize(, UBound(datJM) - LBound(datJM) + 1) = datJM
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige