Zählen

  • Excel

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Hallo xpecidy!

    Vielen Dank für Deine schnelle Hilfe. Aber es funktioniert so leider nicht. Ich hab das Problem auch nicht richtig dargestellt. Sorry.

    Ich versuche es noch mal.

    Es geht darum, Zellenwerte in einem bestimten Bereich zu zählen. Der Bereich "E3:E5" befindet sich im Arbeitsblatt "MANAGER-BASIS". Das Suchkriterium ist zB. "Daimler". Erscheint der Begriff im oben genanten Bereich, so soll er gezählt werden. Verläßt der Begriff den Bereich wieder so soll das Zählergebnis erhalten bleiben. Der Begriff ist nun zwar nicht mehr im genanten Bereich, aber er war einmal dar. Genau das soll gezählt werden. Wie oft war er in diesem Bereich?
    Das Zählergebnis selbst soll im Arbeitsblatt "Analyse" in der Zelle "B11" erscheinen.

    Ich hoffe das ganze ist jetzt besser zu verstehen und hoffe ferner, dass diese Art zu zählen überhaupt möglich ist. Sollte tatsächlich kein Weg nach Rom führen, teile es mir doch bitte kurz mit.


    Mit freundlichen Grüssen

    Cutter

    Edit by hal2000:
    - Die Farbe ROT ist der Moderation vorbehalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    Hallo,

    du suchst die Formel SUMMENPRODUKT(). Beispiel:

    Quellcode

    1. Tabelle1:
    2. _|____E____|
    3. 1| Apfel |
    4. 2| Daimler |
    5. 3| Birne |
    6. 4| Daimler |
    7. Tabelle2:
    8. _|_B__|
    9. 5| 10 |
    10. 6| 5 |
    11. 7| 2 |
    12. 8| 23 |
    13. ZÄHLENWENNN(Tabelle1.E1:E3;"Daimler") = 2
    14. SUMMENPRODUKT((Tabelle1.E1:E3="Daimler")*1) = 2
    15. SUMMENPRODUKT((Tabelle1.E1:E3="Daimler")*(Tabelle2.B5:B8)) = 28
    16. SUMMENPRODUKT((Tabelle1.E1:E3="Daimler")*1;Tabelle2.B5:B8) = 28


    Damit kann man selektiv summieren oder zählen, auch wenn das Kriterium NICHT im selben Bereich liegt wie die Werte. Das ist bei ZÄHLENWENN() und SUMMEWENN() erforderlich.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    Hallo hal2000!

    Vielen Dank für Deine Bemühungen. Aber wir reden aneinander vorbei. Schau dir den Text oben noch einmal genau an. Es geht nicht um Summen hier wird nichts addiert und nichts multipliziert. Hier wird nur gezählt. Nämlich, wie oft ein bestimter Begriff in einem vorgegebenen Bereich gewesen ist.


    Gruss Cutter
    Es soll also eine Art Einmalberechnung sein. Dann verlierst du allerdings die Möglichkeit der Aktualisierung. Es gibt keine Formel dafür, aber du kannst es manuell anstoßen: Zelle mit der Zählenwenn-Formel auswählen und F2-F9-ENTER drücken. Dann kannst du den Begriff aus der Liste entfernen und der berechnete Wert bleibt erhalten. Die Formel ist dann aber auch weg.
    Gruß
    hal2000
    Servus in die Runde,

    je nach dem, wie die Werte in die Zellen kommen, sollte man das mit globalen Variablen lösen können.

    Theorie:
    • Beim Aktivieren der Mappe prüft man den IST-Stand in dem vorgegebenen Bereich.
    • Beim ändern einer Zelle (oder mehrere) prüfen, ob die Änderung im vorgegebenen Bereich erfolgt
    • Ist die Änderung im vorgegebenen Bereich erfolgt, überprüfe die neuen Werte mit den gespeicherten
    • Schreibe die Summe der Änderungen in die vorgegebene Zelle
    • Schreibe die neuen Werte in das globale Array


    Praxis:
    Spoiler anzeigen

    Quellcode

    1. CODE in "DieseArbeitsmappe"

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Workbook_Activate()
    3. Set vBereich = ThisWorkbook.Sheets("Tabelle1").Range("E3:E5")
    4. Set vZielZelle = ThisWorkbook.Sheets("Tabelle1").Range("H2")
    5. vSuchbegriff = "Daimler"
    6. vArrayErmittelnundvergleichen False
    7. End Sub
    8. Private Sub Workbook_Deactivate()
    9. Set vBereich = Nothing
    10. Set vZielZelle = Nothing
    11. End Sub


    Quellcode

    1. CODE in das Tabellenblatt in dem die Änderung erfolgt (also vBereich liegt)

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim isect As Range
    3. Set isect = Application.Intersect(Target, vBereich)
    4. If Not isect Is Nothing Then
    5. vArrayErmittelnundvergleichen True
    6. End If
    7. Set isect = Nothing
    8. End Sub


    Quellcode

    1. CODE in einem Standardmodul

    Visual Basic-Quellcode

    1. Public vArr(2) As Boolean 'Anzahl der Zellen die durchsucht werden
    2. Public vSuchbegriff As String 'Suchbegriff
    3. Public vBereich As Range 'Bereich in dem die Suchbegriffe stehen
    4. Public vZielZelle As Range 'Zelle in der aufsummiert wird
    5. Sub vArrayErmittelnundvergleichen(vVergleichen As Boolean)
    6. Dim cell As Range
    7. Dim i, j As Byte
    8. 'Gespeicherte Werte mit aktuellen vergleichen
    9. If vVergleichen = True Then
    10. For Each cell In vBereich.Cells
    11. If vArr(i) = False And (cell.Value = vSuchbegriff) Then _
    12. vZielZelle.Value = vZielZelle.Value + 1
    13. i = i + 1
    14. Next
    15. End If
    16. 'Aktuelle Werte speichern
    17. For Each cell In vBereich.Cells
    18. vArr(j) = cell.Value = vSuchbegriff
    19. j = j + 1
    20. Next
    21. End Sub


    lg Markus
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xpecidy“ ()

    Ich glaube, dass das auch genügen würde:

    Visual Basic-Quellcode

    1. 'eine benutzerdefinierte Funktion, die Ergebnisse von z.B. ZählenWenn-Ergebnisse aufaddiert und sich merkt
    2. Public Static Function AddValue(ZählenWennValue)
    3. Dim Tmp
    4. Tmp = Tmp + ZählenWennValue
    5. AddValue = Tmp
    6. End Function
    Hallo liebe Leute!

    Erst mal vielen Dank an alle die sich hier echt bemühen. Ich glaube wir müssen hier weiter ausholen.
    Ich bin Börsianer und beschäftige mich mit den 30 Dax-Werten. Diese 30 Dax-Werte habe ich mit "Externe Daten >> Neue Webabfrage" von Ariva.de in Excel geladen. Diese Werte werden alle 60 Sekunden aktualisiert. Und so geschieht es, dass zB. die Daimler-Aktie in der Tabelle mal ganz oben und mal ganz unten ist. Oben ist der Bereich E3:E7 und unten ist der Bereich E9:E13. Erscheint Daimler in den Bereichen, so soll Daimler gezählt werden. Die Zellen in den Bereichen sind alle mit Formeln unterlegt.
    Damit fällt "Worksheet_Change" also aus.
    Inzwischen hatt man mir nun erklärt, dass das Problem mit "Worksheet_Calculate" zu lösen wäre.
    Das heißt, wenn zB. Daimler im Bereich "E3:E7" erscheint dann soll ein Makro aufgerufen werden. Dazu habe ich hier ein kleines Tool welches leider nicht funktioniert.

    Private Sub Worksheet_Calculate()
    If Range("E3:E7").Value = "Daimler" Then
    Call DaimlerO
    End If
    End Sub

    Das Makro selbst funktioniert perfekt. Aber es wird nicht aufgerufen. Was stimmt mit dem Bedingungssatz nicht?
    Vieleicht kennt sich jemand mit "Worksheet_Calculate" besser aus.


    Gruss Cutter

    Cutter2 schrieb:

    Damit fällt "Worksheet_Change" also aus.
    Ich sehe dafür keinen Grund.
    Du willst wissen, ob Daimler in die Top5 kommt?
    Oder was ist dein Problem?

    Visual Basic-Quellcode

    1. Private DaimlerCount As Integer
    2. Private Sub Worksheet_Change(ByVal Target As Range)
    3. Set TopRange = Range("B39:B43")
    4. If Not Intersect(Target, TopRange) Is Nothing Then
    5. Debug.Print Target.Address
    6. If Not TopRange.Find("Daimler") Is Nothing Then DaimlerCount = DaimlerCount + 1
    7. Debug.Print DaimlerCount
    8. End If
    9. End Sub
    Zählt den DaimlerCount jede Minute um 1 hoch, sofern Daimler in den Top5 ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo in die Runde,

    so ganz scheint sich der Fragende auch nicht klar zu sein, was er wünscht?! :)

    Ich habe die Problematik so verstanden, dass in den angegebenen Bereichen ein Wort gesucht wird und wie bei einem Besucherzähler hochgezählt wird.
    Wenn ein Wort bereits gezählt wurde, soll dieses nicht erneut gezählt/aufaddiert werden, wenn sich eine andere Zelle ändert.

    Mein Code sollte das tun. Ich habe es nochmal mit den geänderten Bereichen sowie "Calculate" angefügt. Warum jetzt "Call DaimlerO" aufgerufen wird
    und was sich dahinter verbirgt entzieht sich meiner Kenntnis. Vielleicht erhalten wir da eine Aufklärung? Mein Code zählt in der Zelle H2 fortlaufend.

    Wenn es kürzer/effektiver geht, will ich gerne dazulernen!!!!! :) :) :) :wacko:


    Quellcode

    1. Code in diese Arbeitsmappe

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Workbook_Activate()
    3. Set vTbl = ThisWorkbook.Sheets("Tabelle1")
    4. Set vBereich = Union(vTbl.Range("E3:E5"), vTbl.Range("E9:E13"))
    5. Set vZielZelle = vTbl.Range("H2")
    6. vSuchbegriff = "Daimler"
    7. vArrayErmittelnundvergleichen False
    8. End Sub
    9. Private Sub Workbook_Deactivate()
    10. Set vBereich = Nothing
    11. Set vZielZelle = Nothing
    12. Set vTbl = Nothing
    13. End Sub



    Quellcode

    1. Code in das Tabellenblatt

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Calculate()
    2. vArrayErmittelnundvergleichen True
    3. End Sub



    Quellcode

    1. Code in ein Standardmodul


    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Public vTbl As Worksheet
    2. Public vArr(7) As Boolean 'Anzahl der Zellen die durchsucht werden
    3. Public vSuchbegriff As String 'Suchbegriff
    4. Public vBereich As Range 'Bereich in dem die Suchbegriffe stehen
    5. Public vZielZelle As Range 'Zelle in der aufsummiert wird
    6. Sub vArrayErmittelnundvergleichen(vVergleichen As Boolean)
    7. Dim cell As Range
    8. Dim i, j As Byte
    9. 'Gespeicherte Werte mit aktuellen vergleichen
    10. If vVergleichen = True Then
    11. For Each cell In vBereich.Cells
    12. If vArr(i) = False And (cell.Value = vSuchbegriff) Then _
    13. vZielZelle.Value = vZielZelle.Value + 1
    14. i = i + 1
    15. Next
    16. End If
    17. 'Aktuelle Werte speichern
    18. For Each cell In vBereich.Cells
    19. vArr(j) = cell.Value = vSuchbegriff
    20. j = j + 1
    21. Next
    22. End Sub

    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!: