Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1196to1200
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
Marko über sumif Funktion
addi23
Hallo, ich habe mal eine Frage an Euch:
Ich muss täglich mehrere Excel-Sheets erstellen (immer unterschiedlich umfangreich). Wenn ich meine manuelle Aufbereitung fertiggestellt habe muss ich eine sumif-Funktion über einen Bereich laufen lassen.
Hier gehe ich auf manuellem Weg wie folgt vor:
In der Liste gibt es mehrere identische Kriterien auf die ich eine Summe ziehen möchte (es gibt also mehrere Zeilen in denen z.B. der Kunde A hinterlegt ist). In einer kleinen Liste innerhalb des Sheets möchte ich nun die sumif-Information pro Kunde haben. Ich habe nun die Spalte mit den ganzen Kundennummern rauskopiert - in ein extra Sheet kopiert - und ein Makro drüberlaufen lassen in dem alle doppenlten Einträge gelöscht werden sollen. Das Ergebnis habe ich denn wieder in mein Sheet kopiert und dann daneben die sumif Funktion hinterlegt, die Bereiche markiert und die Zahlen ermittelt.
Meine Frage ist ob man dies auch in einem Makro zusammenfassen kann? Ich stelle mir vor, das ich den sumif-Breich markiere - in der ersten Spalte dieses markierten Bereiches sind nun ja die Kunden hinterlegt, wo zunächst mal doppelte Werte ignoriert werden müssen, anschließend sollte denn über den kompletetten Bereich die sumif Funktion laufen, wobei die letzte Spalte der eingangs markierten Bereichs die sum_range Werte beinhaltet.
Das Ergebnis soll dann 5 oder 6 Zeilen unterhalb des markierten Bereiches wiedergegeben werden.
Ist das möglich?
Vielen Dank schon mal vorab für Euer Bemühen.
VG
addi-23
AW: Marko über sumif Funktion
27.01.2011 17:42:56
Josef

Hallo Addi,
schon mal an eine Pivottabele gedacht?
Sonst lade mal ein Beispiel hoch, am besten mit Beschreibung.

Gruß Sepp

AW: Marko über sumif Funktion
28.01.2011 10:20:57
addi23
Hallo Sepp,
vielen Dank schon mal für die Antwort, Pivot ist eine Möglichkeit, mit der ich auch zurechtkommen könnte, allerdings ist in der Ursprungsdatei, in der ich das eingangs angefragte Makro anwenden möchte die Subtotal Funktion bereits ausgeführt, und dies erlaubt dann keine Pivot mehr ;-((
Ich hänge Dir mal eine Datei ran, in der man nun die Datenermittlung die per Subtotal gemacht wurde evtl. über ein Makro abbilden kann, weil ich dann die Pivot anwenden kann. Vllt. ist das der einfachere Weg?
Zur Erklärung:
Überschrift 3 ist ein Produkt (in dieser kleinen Liste handelt es sich demnach um 2 Produkte)
Überschrift 4 ist der Inhaber dieses Produktes
Überschrift 7 ist die Anzahl des Produktes
In "Anteil" möchte ich nun den prozentualen Anteil (mengenmäßig) für den Inhaber aus Überschrift 4 für das Produkt aus Überschrift 3.
In "Verteilung" möchte ich nun den anteilmäßigen Wert des Produktes. Den Gesamtwert muss auch manuell in die Liste eingegeben werden -- hier im Bereich "Betrag zu Wert aus Überschrift 3"
Die grünen Bereiche werden von mir derzeit manuell erstellt - die gelben Bereiche sind systemseitig schon vorgegeben. Die Spalten mit "xxx" sind zusätzliche irrelevante Informationen...
Vielen Dank schon mal für Dein Bemühen.
VG
addi-23
Hier der Link: https://www.herber.de/bbs/user/73292.xls
Anzeige
AW: Marko über sumif Funktion
28.01.2011 12:34:58
Josef

Hallo Addi,
also ich verstehe nur Bahnhof!
Das kann man doch ganz einfach per SUMMEWENN() bzw. SUMMENPRODUKT() lösen.
Allerdings ist mir schleierhaft, wie du auf die 50.000 in B14 kommst.
Kannst du das noch einmal für Dummies erklären?

Gruß Sepp

AW: Marko über sumif Funktion
28.01.2011 13:01:26
addi23
Hallo Sepp,
es handelt sich in dem ganzen Gebilde um die Prüfung von Provisionszahlungen.
Mit dem Excel, welches automatisch erstellt wird, also alles das was nicht grün markiert ist - ist die eigene Kalkulation der Provisionssätze (die habe ich hier aber mit xxx versehen.
Die grünen Bereiche ermittle ich wie beschrieben...der %-Anteil ermittle ich über die Spalte "Überschrift 7 - hier nehme ich die Anzahl aus der Zeile und dividiere diesen duch die Summe über alle Anteile zu diesem Produkt (dies ist durch die identische Kennziffer in Spalte "Überschrift 3" gekennzeichnet.)
Nun bekomme ich von extern eine Abrechnung und eine Zahlung aus der hervorgeht, das wie in diesem Beispiel Produkt 1 mit 50000 vergütet wird. Diese 50000 verteile ich nun anhand dem zuvor ermittelten %-Anteil auf die einzelnen Zeilen.
Letztendlich ist die Tabelle die ich hochgeladen habe zunächst ohne die grünen Bereiche zu sehen, Die Daten am Ende der Tabelle - also das Kästchen "Betrag zu Wert aus Überschrift 3" und den darunter liegenden Daten muss ich anhand der externen Abrechnung in die Tabelle hinterlegen.
Die Daten in Spalte J und K möchte ich mittels einem Makro erzeugen.
Anzumerken ist noch das die Tabelle auch mal mehr oder mal weniger Zeilen haben kann. Die Spaltenanzahl ist zu 99,9% immer identisch.
Vielen Dank schon mal für das Bemühen!!!!
Gruß, addi-23
Anzeige
AW: Marko über sumif Funktion
28.01.2011 13:31:44
Josef

Hallo Addi,
würde dir gerne helfen, aber ich blick' immer noch nicht durch.
Ich kann rechnen wie ich will, ich komme nicht auf deine 50000 für Produkt 1.
Zeig doch mal in der Beispieltabelle wie du das rechnest und was genau du noch rechnen willst.

Gruß Sepp

AW: Marko über sumif Funktion
28.01.2011 14:07:49
addi23
Hallo Sepp,
ich habe die Datei nochmal ein bischen modifiziert, ich hoffe du kannst dir jetzt eine bessere Vorstellung machen. Die 50000 die ich von einer externen Abrechnung genannt bekomme trage ich in die Tabelle ein, und verteile den Betrag dann anhand von den Anteilen zu Produkt 1 auf.
Es könnte genausogut 100000 dort stehen, dann würden die Werte in diesem Fall in Spalte K und den Zeilen 2-8 (weil das die Zeilen zu Kunde 1 (siehe Überschrift 3) sind verdoppelt werden.
Den Anteil in Zelle J2 errechne ich wie folgt: =G2/(SUM($G$2:$G$8)) -- und ziehe die Formel dann runter.
Die Verteilung in Spalte K errechne ich wie folgt: =J2*$B$15 und ziehe die dann ebenfalls runter - aber nur bis Zeile 8, da ab Zeile 9 der Kunde "2" anfängt, da mache ich dann das selbe...
https://www.herber.de/bbs/user/73296.xls
Danke - Gruß, Addi
Anzeige
AW: Marko über sumif Funktion
28.01.2011 15:46:26
Josef

Hallo Addi,
na also, mich hatten nur die 50000 irritiert, weil ich glaubte, die kommen aus einer Berechnung.
Beim Folgenden Code wirst du aufgefordert, den bereich mit den Vorgaben auszuwählen, in deiner Beispieldatei wäre das der Bereich A14:B16, oder auch A15:B16, die Überschriften kannst du einschliessen oder nicht, das ist egal. In die ersten freien Spalten rechts der Liste, werden die Werte eingetragen.
Sub berechnung()
  Dim lngLast As Long, lngCol As Long
  Dim rng As Range, strKrit As String, strVal As String
  
  On Error Resume Next
  Set rng = Application.InputBox("Bitte wählen sie den Bereich mit den Vorgaben aus" & vbLf & _
    vbLf & "Der Bereich muss 2 Spalten umfassen!", "Berechnung", Selection.Address, Type:=8)
  On Error GoTo 0
  
  If Not rng Is Nothing Then
    If rng.Columns.Count <> 2 Then
      MsgBox "Der Bereich '" & rng.Address(0, 0) & "' ist ungültig!" & vbLf & vbLf & _
        "Ein gültiger Bereich muss zwei Spalten umfassen!", vbInformation, "Fehler"
      Exit Sub
    Else
      strKrit = rng.Columns(1).Address
      strVal = rng.Columns(2).Address
      lngCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
      lngLast = Cells(Rows.Count, 3).End(xlUp).Row
      
      Cells(1, lngCol) = "Anteil"
      Cells(1, lngCol + 1) = "Verteilung"
      Range(Cells(1, lngCol), Cells(1, lngCol + 1)).Font.Bold = True
      Cells(2, lngCol).Formula = "=G2/SUMIF($C$2:$C$" & lngLast & ",C2,$G$2:$G$" & lngLast & ")"
      Cells(2, lngCol + 1).Formula = "=J2*INDEX(" & strVal & ",MATCH(C2," & strKrit & ",0))"
      Range(Cells(2, lngCol), Cells(lngLast, lngCol + 1)).FillDown
      Range(Cells(2, lngCol), Cells(lngLast, lngCol + 1)) = Range(Cells(2, lngCol), Cells(lngLast, lngCol + 1)).Value
      Columns(lngCol).NumberFormat = "0.00%"
      Columns(lngCol + 1).NumberFormat = "#,##0.00 $"
    End If
  End If
  
  Set rng = Nothing
End Sub


Gruß Sepp

Anzeige
AW: Marko über sumif Funktion
02.02.2011 13:51:16
addi23
Hallo Sepp,
vielen Dank für die super Unterstützung - das Makro funktioniert einwandfrei.
Wenn du noch weiterhin Lust haben solltest mir bei diesem Makro zu helfen, könnten wir (besser Du) die Sache noch absolut genialisieren.
Frage: Kann man an dieses bestehende Makro noch eine Ergänzung dranhängen, in der z.b. zwei Zeilen unterhalb dem Bereich den ich für diese erste Berechnung markieren muss eine kleine Übersicht dranhängt, in der die zusammengefassten Summen für die unter Uberschrift 4 hinterlegten Kriterien aufgelistet werden?
Dies muss ich jetzt noch manuell erledigen:
Die Seperierung der Kundennummern mache ich in einer extra Datei mit folgendem Makro - und kopiere das Ergebnis unterhalb der Tabelle und anschließend arbeite ich mit der SumIf Funktion die in Abhängigkeit von der Kundennummer die Beträge aus der aus dem schon vorhandenen Makro ermittlten Spalte "Verteilung" summiert.
Sub DblFind()
Dim iRow As Integer, iRowL As Integer
iRowL = Cells(Cells.Rows.Count, 1).End(xlUp).Row
For iRow = iRowL To 1 Step -1
If WorksheetFunction.CountIf(Columns(1), Cells(iRow, 1)) > 1 Then
Rows(iRow).Delete
End If
Next iRow
End Sub
Vielleicht kannst du mir ja hier noch zu einem absoluten Coup verhelfen und mir sehr viel manuelle Arbeit ersparen.
Vielen Dank nochmals vorab!!
VG Addi
Anzeige
AW: Marko über sumif Funktion
02.02.2011 15:35:27
Josef

Hallo Addi,
kein Problem;-))
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub berechnung()
  Dim lngLast As Long, lngCol As Long, lngIndex As Long
  Dim rng As Range, strKrit As String, strVal As String
  Dim vntList As Variant, vntRet() As Variant
  
  On Error Resume Next
  Set rng = Application.InputBox("Bitte wählen sie den Bereich mit den Vorgaben aus" & vbLf & _
    vbLf & "Der Bereich muss 2 Spalten umfassen!", "Berechnung", Selection.Address, Type:=8)
  On Error GoTo 0
  
  If Not rng Is Nothing Then
    If rng.Columns.Count <> 2 Then
      MsgBox "Der Bereich '" & rng.Address(0, 0) & "' ist ungültig!" & vbLf & vbLf & _
        "Ein gültiger Bereich muss zwei Spalten umfassen!", vbInformation, "Fehler"
      Exit Sub
    Else
      strKrit = rng.Columns(1).Address
      strVal = rng.Columns(2).Address
      lngCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
      lngLast = Cells(Rows.Count, 3).End(xlUp).Row
      
      Cells(1, lngCol) = "Anteil"
      Cells(1, lngCol + 1) = "Verteilung"
      Range(Cells(1, lngCol), Cells(1, lngCol + 1)).Font.Bold = True
      
      Cells(2, lngCol).Formula = _
        "=G2/SUMIF($C$2:$C$" & lngLast & ",C2,$G$2:$G$" & lngLast & ")"
      
      Cells(2, lngCol + 1).Formula = _
        "=" & Cells(2, lngCol).Address(0, 0) & "*INDEX(" & strVal & _
        ",MATCH(C2," & strKrit & ",0))"
      
      With Range(Cells(2, lngCol), Cells(lngLast, lngCol + 1))
        .FillDown
        .Value = .Value
        .Columns(1).NumberFormat = "0.00%"
        .Columns(2).NumberFormat = "#,##0.00 $"
      End With
      
      'Summen
      vntList = UniqueList(Range(Cells(2, 4), Cells(lngLast, 4)))
      Redim Preserve vntRet(1 To UBound(vntList) + 2, 1 To 2)
      vntRet(1, 1) = "Kennummer"
      vntRet(1, 2) = "Summe"
      For lngIndex = 0 To UBound(vntList)
        vntRet(lngIndex + 2, 1) = "'" & vntList(lngIndex)
        vntRet(lngIndex + 2, 2) = Application.SumIf(Range(Cells(2, 4), _
          Cells(lngLast, 4)), vntList(lngIndex), Range(Cells(2, lngCol + 1), _
          Cells(lngLast, lngCol + 1)))
      Next
      
      With Cells(rng(1, 1).Row + rng.Rows.Count - 1, 1).Offset(3, 0)
        .Resize(UBound(vntRet, 1), 2) = vntRet
        .Resize(UBound(vntRet, 1), 2).Columns(1).NumberFormat = "00000"
        .Resize(UBound(vntRet, 1), 2).Columns(2).NumberFormat = "#,##0.00 $"
      End With
    End If
  End If
  
  Set rng = Nothing
End Sub

Private Function UniqueList(Matrix As Range, Optional IncludeNull As Boolean = True, Optional Sorted As Boolean = True) As Variant
  Dim objDic As Object, rng As Range, varTmp() As Variant, vntExclude As Variant
  
  vntExclude = IIf(IncludeNull, "", 0)
  
  Set objDic = CreateObject("Scripting.Dictionary")
  
  For Each rng In Matrix
    If rng.Value <> vntExclude Then objDic(rng.Value) = 0
  Next
  
  varTmp = objDic.keys
  
  If Sorted Then QuickSort varTmp
  
  UniqueList = varTmp
  
  Set objDic = Nothing
End Function

Private Sub QuickSort(data() As Variant, Optional UG, Optional OG)
  Dim P1&, P2&, T1 As Variant, T2 As Variant
  
  UG = IIf(IsMissing(UG), LBound(data), UG)
  OG = IIf(IsMissing(OG), UBound(data), OG)
  
  P1 = UG
  P2 = OG
  T1 = data((P1 + P2) / 2)
  
  Do
    
    Do While (data(P1) < T1)
      P1 = P1 + 1
    Loop
    
    Do While (data(P2) > T1)
      P2 = P2 - 1
    Loop
    
    If P1 <= P2 Then
      T2 = data(P1)
      data(P1) = data(P2)
      data(P2) = T2
      P1 = P1 + 1
      P2 = P2 - 1
    End If
    
  Loop Until (P1 > P2)
  
  If UG < P2 Then QuickSort data, UG, P2
  If P1 < OG Then QuickSort data, P1, OG
  
End Sub


Gruß Sepp

Anzeige
AW: Marko über sumif Funktion
02.02.2011 16:29:30
addi23
Hallo Sepp,
achon mal vielen Dank. Dieses Makro funktioniert in der "Test-Datei" optimal ;-))) So wie ich es haben wollte!!!
Allerdings war das nur eine manuell erstellte Testdatei die in ein paar Spalten von der von mir zu bearbeiteten Datei abweicht. Könntest du dieses Makro vllt. auch noch an die Datei die ich jetzt neu hochlade anpassen, dann ist alles absolut genial. Das ist dann auch das letzte mal das ich diesbezgl. nerve - versprochen!!
Ich habe die relevanten Überschriften, die auch schon in der Test Datei vorhanden waren mit den selben Überschriften in der neuen Datei versehen, damit du einen besseren Zusammenhang sehen kannst. Auch habe ich die relevanten Spalten noch mal gelb markiert. Die grün markierten Bereiche sind wieder die Bereiche die durch den ersten Teil des Makros erstellt werden, der orange markierte Bereich ist der Bereich wo eigentlich die Kennnummer (aus Spalte "Überschrift 4") mit den entsprechenden Summen (aus Spalte "Verteilung" erscheinen sollen. Der blau markierte Bereich ist der Bereich den ich manuell eintragen muss.
Vielen Vielen Vielen Dank!!!
Gruß, Addi

Die Datei https://www.herber.de/bbs/user/73367.xls wurde aus Datenschutzgründen gelöscht


Anzeige
AW: Marko über sumif Funktion
02.02.2011 17:26:57
Josef

Hallo Addi,
du kannst jetzt im Code mit drei Konstanten die Überschriften der entsprechenden Spalten vorgeben.
Der Code ermittelt daraus die entsprechenden Bereiche
https://www.herber.de/bbs/user/73369.xls

Gruß Sepp

AW: Marko über sumif Funktion
02.02.2011 19:41:12
addi23
HAMMER - super vielen Dank für Deine Hilfe!!!!!!!
Genial
VG
Addi
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige