Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1032to1036
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

SummenArray via VBA od. Formel mit JokerZeichen

SummenArray via VBA od. Formel mit JokerZeichen
11.12.2008 19:46:11
Andreas
Hallo Herber Fans,
seit gestern Abend beschäftigt mich ein Thema, welches an sich banal klingt. Ich habe es in der ursprünglichen Form aber leider nicht lösen können.
Es geht um SummeWenn, die mit 4 Kriterien arbeiten soll. An sich kein Problem. Diese Kriterien kommen aus einer DropDownListe und können den Wert „ALL“ annehmen. Wenn das der Fall ist, dann soll die Lösung (da ich noch nicht weiß, ob Formel oder VBA das Mittel der Wahl ist) dieses Kriterium überspringen.
Das 1. Kriterium ist immer fest. Es ist die Prüfung, ob eine Zeile Consolidation Level 2 ist.
Problem: In der Tabelle sind Gruppierungen aktiviert, die unangetastet bleiben sollen. Die Verwendung des Autofilters und Teilsumme führte zum Verlust der Gruppierungen. Überdies sollen die Summen auch korrekt gebildet werden, wenn der AutoFilter nicht aktiv/ vorhanden ist.
Meine Versuche: per Formel wurde es sehr, sehr lang und unübersichtlich. Ich habe kein Jokerzeichen ausfindig machen können, welches man beim Kriterium „ALL“ der Formel geben könnte.
VBA: Habe ich einen Ansatz, der die möglichen Ranges durchloopt, aber bin nicht weit gekommen. Mir fehlt auch der theoretische Ansatz, wie eine VBA Lösung konstruiert werden muß. Die Ausführung mit Schleifen, etc. sollte kein Problem mehr sein. Aber mir fällt der „Bauplan“ nicht ein.
Ich wäre für eine Lösung per Formel und VBA dankbar. Da ich bisher in dieser Konfiguration nicht weiter gekommen bin, interessiert es mich zu sehen, wie die Cracks das lösen würden.
Meine Überlegungen haben aber dennoch zu einer praktikablen Lösung geführt: Und zwar lasse ich pro Zeile auslesen, ob diese hidden ist oder nicht. Wenn ja, wird die Zeilennummer in eine Collection geschrieben. Dann wird der AutoFilter aktiviert, dessen Felder werden entsprechend der Kriterien durchgeloopt und hinten im Value Bereich werden dann die visiblecells addiert. Anschließend werden wieder alle Daten eingeblendet und anhand der Collection wird die Gruppierung wiederhergestellt.
Diese Lösung hat so ein bißchen „von hinten durch die Brust ins Auge“ Charakter, aber sie läuft erstaunlich gut. Hoffe, sie stößt vielleicht auf Interesse.
Aber, um in Sachen VBA mehr zu lernen, interessiert mich immer noch die Lösung des Durchschleifens der einzelnen Ranges (+ Überspringen von "ALL"). Genauso interessant ist eine Formellösung die mit möglichst wenig Verschachtelungen auskommt.
Vielleicht interessiert den einen oder anderen das Problem und es werden am Ende alle drei Lösungswege ergründet sein und der Neugierde genüge getan.
https://www.herber.de/bbs/user/57567.xls
Vielen Dank und Grüße, Andreas Hanisch

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SummenArray via VBA od. Formel mit JokerZeichen
11.12.2008 21:53:38
fcs
Hallo Andreas,
hier meine Formel-Lösung, Formeln müssen als Matrix-Formeln eingegeben werden.
Gruß
Franz
E2: =SUMME(WENN(($A$4:$A$51=$A$1)* WENN($B$1="ALL";WAHR;($B$4:$B$51=$B$1))* WENN($C$1="ALL";WAHR;($C$4:$C$51=$C$1))* WENN($D$1="ALL";WAHR;($D$4:$D$51=$D$1));E4:E51;0)) F2: =SUMME(WENN(($A$4:$A$51=$A$1)* WENN($B$1="ALL";WAHR;($B$4:$B$51=$B$1))* WENN($C$1="ALL";WAHR;($C$4:$C$51=$C$1))* WENN($D$1="ALL";WAHR;($D$4:$D$51=$D$1));F4:F51;0)) F2: =SUMME(WENN(($A$4:$A$51=$A$1)* WENN($B$1="ALL";WAHR;($B$4:$B$51=$B$1))* WENN($C$1="ALL";WAHR;($C$4:$C$51=$C$1))* WENN($D$1="ALL";WAHR;($D$4:$D$51=$D$1));G4:G51;0)) Die Zellbereiche kannst du natürlich auch mit Namen versehen. z.B E2: =SUMME(WENN((Werte.ConstLevel=Krit.ConstLevel)* WENN(Krit.Status="ALL";WAHR;(Werte.Status=Krit.Status))* WENN(Krit.Region="ALL";WAHR;(Werte.Region=Krit.Region))* WENN(Krit.Beispiel="ALL";WAHR;(Werte.Beispiel=Krit.Beispiel));E4:E51;0)) 'VBA-Lösung Sub Summieren() Dim rgKriterien As Range, rgValue As Range, rgErgebnis As Range Dim Zeile As Long, spalte As Long, bolTreffer As Boolean, wks As Worksheet Set wks = Range("Header_Range").Parent Set rgValue = Range("Value") Set rgKriterien = Range("Header_Range").Offset(-2, 0) Set rgErgebnis = Range("Value").Rows(1).Offset(-2, 0) rgErgebnis.ClearContents With wks For Zeile = rgValue.Row To rgValue.Row + rgValue.Rows.Count - 1 bolTreffer = True For spalte = rgKriterien.Column To rgKriterien.Column + rgKriterien.Columns.Count - 1 If .Cells(rgKriterien.Row, spalte) "ALL" Then If .Cells(rgKriterien.Row, spalte) Cells(Zeile, spalte) Then bolTreffer = False Exit For End If End If Next If bolTreffer = True Then For spalte = rgErgebnis.Column To rgErgebnis.Column + rgErgebnis.Columns.Count - 1 .Cells(rgErgebnis.Row, spalte) = .Cells(rgErgebnis.Row, spalte) + .Cells(Zeile, spalte) Next End If Next End With End Sub


Anzeige
AW: SummenArray via VBA od. Formel mit JokerZeichen
12.12.2008 10:35:57
ransi
Hallo Andreas
Mal auf die Schnelle ein anderer Ansatz:
Tabelle1

 ABCDE
13ALLALLALL26,6883954
2    37
3ConsLevelStatusRegionBeispielwertValue_1

Formeln der Tabelle
ZelleFormel
E1=spezial(A4:D51;A1;B1;C1;D1;E4:E51)


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Dazu dieser Code in einem Modul:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Function Spezial(Bereich As Range, K1, K2, K3, K4, SummeBereich As Range)
Dim Arr
Dim MyDic
Dim L As Long
Dim tmp_String As String
Dim I As Variant
Set MyDic = CreateObject("Scripting.Dictionary")
Arr = Bereich
If K2 = "ALL" Then K2 = "*"
If K3 = "ALL" Then K3 = "*"
If K4 = "ALL" Then K4 = "*"
For L = 1 To UBound(Arr)
    tmp_String = Arr(L, 1) & Arr(L, 2) & Arr(L, 3) & Arr(L, 4)
    If tmp_String Like K1 & K2 & K3 & K4 Then MyDic(K1 & K2 & K3 & K4) = MyDic(K1 & K2 & K3 & K4) + SummeBereich(L, 1)
Next
If MyDic.Count = 0 Then
    Spezial = "Keine Übereinstimmungen"
    Exit Function
End If
I = MyDic.items
Spezial = I(0)
End Function

ransi
Anzeige

310 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige