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

Zählenwenn

Zählenwenn
Wolfgang
Hallo,
die nachstehende Formel würde ich gerne erweitern. Derzeit zählt sie die jeweiligen Positionen in Spalte H der Tabelle "Daten" und zeigt das Ergebnis in B7 etc. an; Wie kann die Formel erweitert werden, wenn als Bedingung hinzukommt, dass nur dann auch gezählt wird, wenn in Spalte I:K -zumindest in einer Zelle dieser Spalten- mehr als "0" enthalten ist. Also, nicht mitzählt, wenn in I:K überall nur "0" steht. Danke schon jetzt für die Rückmeldungen.
Herzliche Grüße
Wolfgang
=ZÄHLENWENN(Daten!H:H;B7)

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Zählenwenn
14.10.2009 17:43:11
Josef
Hallo Wolfgang,

=SUMMENPRODUKT((Daten!H1:H1000=B7)*(TEILERGEBNIS(9;INDIREKT("Daten!I"&ZEILE(1:1000)&":K"&ZEILE( _
1:1000)))>0))

Gruß Sepp

Danke Sepp - läuft einwandfrei!
14.10.2009 18:14:12
Wolfgang
Hallo Josef,
herzlichen Dank für Deine Rückmeldung; nachdem ich die Formel in B7 hineinkopiert hatte und dann bis B23 heruntergezogen hatte, bekam ich zunächst #NV angezeigt. Ich habe sie dann einzeln in die jeweiligen Zellen kopiert und die Bezugszelle B7. B8 etc. manuell angepasst. Nun läuft die Formel wunderbar und bringt mir nur Werte aus den Zellen, wenn der Wert in I.K mehr als 0 beträgt. Hab recht herzlichen Dank dafür.
Gruß - Wolfgang
Anzeige
eine Frage noch
14.10.2009 19:10:43
Wolfgang
Hallo Josef,
nachdem ich die noch Formel ein wenig weiter teste und "einbaue", meine ich zu beobachten, dass der CPU mächtig "eingespannt" wird und Eintragungen von Daten aus einem UF relativ langsam laufen. Habe ich evtl. doch beim hineinkopieren etwas verkehrt gemacht? - Ich hatte 'mal eine ähnliche Abfrage gesehen, die über VBA lief, die möglicherweise doch schneller lief. Hättest Du da evtl. eine Idee? Ich hatte eine Sicherungskopie der Mappe noch mit der alten Formel erstellt, die Abfrage läuft da schon erheblich schneller. Gäbe es eine Möglichkeit, die Abfrage auch zu diesem Zwecke über VBA zu gestalten? - Danke schon jetzt wieder für Deine Rückmeldung.
Gruß - Wolfgang
Anzeige
AW: eine Frage noch
14.10.2009 20:07:21
Josef
Hallo Wolfgang,
als Alternative zu VBA würde ich eher zu einer Hilfssaplte tendieren.
ZB. in Spalte M die Formel =SUMME(I1:K1) und dann diese Formel zur Auswertung verwenden.

=SUMMENPRODUKT((Daten!H1:H50000=B7)*(Daten!M1:M50000>0))

Gruß Sepp

AW: eine Frage noch
14.10.2009 20:47:46
Wolfgang
Hallo Josef,
erneut zunächst recht herzlichzen Dank für Deine Rückmeldung; ich habe Deine Hinweise aufgegriffen und habe die Formeln eingebaut, dabei zunächst auf 1000 dezimiert. Excel ist nun sogar noch langsamer, als vorher. Es zeigt unten links in % relativ langsam an, dass die Zellen berechnet werden. Faktisch habe ich momentan 3 Zeilen "eingebucht, die im Grunde zu überprüfen wären. Wäre VBA evtl. doch eine schnellere Lösung? - Danke schon jetzt wieder für Deine Rückantwort.
Gruß - Wolfgang
Anzeige
AW: eine Frage noch
14.10.2009 21:15:05
Josef
Hallo Wolfgang,
na dann probier mal.
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Sub ZaehlenWenn()
  Dim lngLast As Long, lngIndex As Long, lngRes As Long
  Dim varH As Variant, varI As Variant, varJ As Variant, varK As Variant
  
  With Sheets("Daten")
    lngLast = .Cells(Rows.Count, 8).End(xlUp).Row
    varH = .Range("H1:H" & CStr(lngLast))
    varI = .Range("I1:I" & CStr(lngLast))
    varJ = .Range("J1:J" & CStr(lngLast))
    varK = .Range("K1:K" & CStr(lngLast))
    
    For lngIndex = 1 To lngLast
      If varH(lngIndex, 1) = Sheets("Tabelle1").Range("B7") Then 'Name der Tabelle anpassen!
        If varI(lngIndex, 1) + varJ(lngIndex, 1) + varK(lngIndex, 1) > 0 Then lngRes = lngRes + 1
      End If
    Next
  End With
  'Name der Tabelle anpassen!
  Sheets("Tabelle1").Range("C7") = lngRes
End Sub

Gruß Sepp

Anzeige
AW: eine Frage noch
15.10.2009 06:40:14
Wolfgang
Hallo Josef,
erneut recht herzlichen Dank für Deine Rückmeldung; Ich habe den Code soweit "eingebaut" und für B7/C7 funktioniert er soweit. Habe ihn dann noch einmal kopiert und auf B8/C8 (insgesamt sind die Abfragen bis B23/C23) umgestellt. Unabhängig von der Bezeichnung in H scheint er dann die Daten doppelt zu zählen. Wahrscheinlich wende ich die Kopie mit Erweiterung auf B8/C8 nicht richtig an? - Was könnte ich aus Deiner Sicht verändern/ergänzen, um die Abfragen insgesamt bis B23/C23 hinzubekommen. ? - Sorry, ich hoffe, ich werde nicht lästig.
Herzliche Grüße
Wolfgang
zum Schluss Deines Codes habe ich Call ZaehlenWenn2 eingefügt und den weiteren Code so benannt (das hätte ich dann bis B23/C23 so vornehmen wollen).
Anzeige
AW: eine Frage noch
15.10.2009 07:36:38
Josef
Hallo Wolfgang,
dann sollte es so laufen.
Sub ZaehlenWenn()
  Dim lngLast As Long, lngIndex As Long, lngRes As Long
  Dim varH As Variant, varI As Variant, varJ As Variant, varK As Variant
  Dim rng As Range
  
  With Sheets("Daten")
    lngLast = .Cells(Rows.Count, 8).End(xlUp).Row
    varH = .Range("H1:H" & CStr(lngLast))
    varI = .Range("I1:I" & CStr(lngLast))
    varJ = .Range("J1:J" & CStr(lngLast))
    varK = .Range("K1:K" & CStr(lngLast))
  End With
  
  For Each rng In Sheets("Tabelle1").Range("B7:B23") 'Name der Tabelle anpassen!
    lngRes = 0
    For lngIndex = 1 To lngLast
      If varH(lngIndex, 1) = rng Then
        If varI(lngIndex, 1) + varJ(lngIndex, 1) + varK(lngIndex, 1) > 0 Then lngRes = lngRes + 1
      End If
    Next
    rng.Offset(0, 1) = lngRes
  Next
  
End Sub

Gruß Sepp

Anzeige
Bei vielen Daten schneller.
15.10.2009 10:13:30
Josef
Hallo Wolfgang,
bei großen Datenbeständen, ist diese Variante schneller.
Sub ZaehlenWenn()
  Dim lngLast As Long, lngIndex As Long, lngRes As Long
  Dim varH As Variant, varI As Variant, varJ As Variant, varK As Variant, varB As Variant
  Dim varRes As Variant, varC As Variant
  
  With Sheets("Daten")
    lngLast = .Cells(Rows.Count, 8).End(xlUp).Row
    varH = .Range("H1:H" & CStr(lngLast))
    varI = .Range("I1:I" & CStr(lngLast))
    varJ = .Range("J1:J" & CStr(lngLast))
    varK = .Range("K1:K" & CStr(lngLast))
  End With
  
  With Sheets("Tabelle1") 'Tabellenname anpassen!
    varB = .Range("B7:B23")
    .Range("B7:B23").Offset(0, 1) = 0
    varC = .Range("B7:B23").Offset(0, 1)
    
    For lngIndex = 1 To lngLast
      varRes = Application.Match(varH(lngIndex, 1), varB, 0)
      If IsNumeric(varRes) Then
        If varI(lngIndex, 1) + varJ(lngIndex, 1) + varK(lngIndex, 1) > 0 Then
          varC(varRes, 1) = varC(varRes, 1) + 1
        End If
      End If
    Next
    
    .Range("B7:B23").Offset(0, 1) = varC
  End With
End Sub


Gruß Sepp

Anzeige
Danke Josef - super!!!
15.10.2009 10:52:54
Wolfgang
Hallo Josef,
ich hatte am Arbeitsplatz 'mal eine ruhige Minute genutzt bzw. mir die Zeit nehmen wollen, in's Forum zu gehen. Danke für Deine weiteren Ausarbeitungen und Überlassung der Codes. Ich habe direkt Deinen zweiten Code "eingebaut" und kann nur sagen, Hut ab. - Der läuft superschnell und steht in keinem Vergleich zu den gestrigen Formeln, die extrem langsam liefen. Hab recht herzlichen Dank für Deine Ausarbeitungen und Deine Geduld mit mir. Ich freue mich sehr.
Herzliche Grüße
Wolfgang

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige