Registriert seit: 24.02.2016
Version(en): 13
Hallo liebe Community!
Ich überlege gerade, ob es eine Möglichkeit gibt, sich die größte oder kleinste "Summenreihe" für eine Spalte mit positiven und negativen Zahlen ausgeben zu lassen, also die Summe über eine variable Anzahl an benachbarten Zellen. Dabei möchte ich nicht angeben müssen, wie lang diese Reihe ist. Zum Beispiel bei dieser Reihe:
2
-1
-1
4
5
3
-1
-2
2
-1
-1
-1
Hier wäre die größte Summe benachbarter Zellen 12 (4+5+3) bzw. (2-1-1+4+5+3) und die kleinste -4 (-1-2+2-1-1-1). Ich freue mich über jeden Lösungsansatz!
Liebe Grüße
Max
Registriert seit: 13.04.2014
Version(en): 365
12.04.2017, 13:26
(Dieser Beitrag wurde zuletzt bearbeitet: 12.04.2017, 13:26 von BoskoBiati.)
Hi,
Zitat:Ich freue mich über jeden Lösungsansatz!
ich auch. Ich denke, das wird selbst mit VBA nicht ganz leicht. Mal als Idee:
Code:
Sub Summe()
Dim loMax As Long
Dim loMin As Long
Dim loA As Long
Dim loB As Long
Dim loLast As Long
Dim losum As Long
Dim varMax(2) As Variant
Dim varMin(2) As Variant
varMax(0) = 0
varMin(0) = 9999
loLast = Cells(Rows.Count, 1).End(xlUp).Row
For loA = 1 To loLast - 1
For loB = loA To loLast
losum = Application.WorksheetFunction.Sum(Range(Cells(loA, 1), Cells(loB, 1)))
If losum > varMax(0) Then
varMax(0) = losum
varMax(1) = loA
varMax(2) = loB
End If
If losum < varMin(0) Then
varMin(0) = losum
varMin(1) = loA
varMin(2) = loB
End If
Next
Next
Range("B1") = "max: " & varMax(0)
Range("C1") = " ab Zeile " & varMax(1)
Range("D1") = " bis Zeile " & varMax(2)
Range("B2") = "min: " & varMin(0)
Range("C2") = " ab Zeile " & varMin(1)
Range("D2") = " bis Zeile " & varMin(2)
End Sub
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Registriert seit: 14.04.2014
Version(en): Office 2013/2016/2019/365
12.04.2017, 17:13
(Dieser Beitrag wurde zuletzt bearbeitet: 12.04.2017, 17:13 von chris-ka.)
Hi,
hier mal auf die schnelle ohne Array
Code:
Sub max_min()
'Daten in Spalte A ab A1 -> Länge egal
Dim i As Integer, mymax As Double, mymin As Double, myvalMax As Double, myvalMin As Double, lastR As Long
lastR = Cells(Rows.Count, 1).End(xlUp).Row
mymax = WorksheetFunction.Min(Range("A1:A" & lastR))
mymin = WorksheetFunction.Max(Range("A1:A" & lastR))
For i = 1 To lastR
myvalMax = checkMax(Cells(i, 1).Value, i, lastR)
If myvalMax > mymax Then
mymax = myvalMax
End If
myvalMin = checkmin(Cells(i, 1).Value, i, lastR)
If myvalMin < mymin Then
mymin = myvalMin
End If
Next
MsgBox mymax
MsgBox mymin
End Sub
Function checkMax(lng_Val, myIndex As Integer, lastR As Long) As Double
Dim mysum As Double, dblsum As Double
mysum = lng_Val
dbl_sum = mysum
For i = myIndex + 1 To lastR
mysum = mysum + Cells(i, 1).Value
If mysum > dbl_sum Then
dbl_sum = mysum
mysum = dbl_sum
End If
Next
For i = myIndex - 1 To 1 Step -1
mysum = mysum + Cells(i, 1).Value
If mysum > dbl_sum Then
dbl_sum = mysum
mysum = dbl_sum
End If
Next
checkMax = dbl_sum
End Function
Function checkmin(lng_Val, myIndex As Integer, lastR As Long) As Double
Dim mysum As Double, dblsum As Double
mysum = lng_Val
dbl_sum = mysum
For i = myIndex + 1 To lastR
mysum = mysum + Cells(i, 1).Value
If mysum < dbl_sum Then
dbl_sum = mysum
mysum = dbl_sum
End If
Next
For i = myIndex - 1 To 1 Step -1
mysum = mysum + Cells(i, 1).Value
If mysum < dbl_sum Then
dbl_sum = mysum
mysum = dbl_sum
End If
Next
checkmin = dbl_sum
End Function
sollten mal mehr als 500 Zeilen sein, wäre es über Arrays besser gelöst.
@Edgar
Zitat:ich auch. Ich denke, das wird selbst mit VBA nicht ganz leicht. Mal als Idee:
Die Idee passt! :), deine Lösung mit Summe ist 100 mal effizienter als alle Zellen abklappern, so wie ich es gemacht habe!
lg Chris
Feedback nicht vergessen.
3a2920576572206973742064656e20646120736f206e65756769657269672e
Folgende(r) 1 Nutzer sagt Danke an chris-ka für diesen Beitrag:1 Nutzer sagt Danke an chris-ka für diesen Beitrag 28
• Marximus
Registriert seit: 24.02.2016
Version(en): 13
Wow VBAs, Arrays langsam, langsam :D.
Mal abgesehen, dass ich davon mal so überhaupt keine Ahnung habe und die Lösungen deswegen auch nicht im Ansatz nachvollziehen kann, wo muss ich diesen Paragraphen hinkopieren und wie anpassen, um die Lösung für mein Excelsheet zu übernehmen?
Liebe Grüße
Max