Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA CountIf

VBA CountIf
16.01.2023 12:46:57
Paul
Hallo zusammen,
ich stehe mal wieder vor einem Problem.
Ich bekomme 1x im Monat eine Excel Datei, für die ich gerne ein Skript schreiben würde. Das Skript soll Daten aus der Tabelle erfassen, und zusammengefasst auf einem zweiten Tabellenblatt speichern.
1)

Sub Autofilter()
Set ZielSheet = Sheets.Add(after:=Tabelle1)
ZielSheet.Name = "Infos_zu_Datensatz" 
2) Nun meine erste Frage: Ich würde gerne eine eine CountIf Funktion nutzen, um zu zählen wie viele Elemente es allgemein in Spalte C gibt, und außerdem wie viele Elemente jeweils mit dem Inhalt "x" und "y" in Spalte C enthalten sind.
--> Output in der Tabelle 2 soll dann in etwa sein:
Gesamt: 300
X: 170
Y:130
3) Eine Auflistung welche verschiedenen Typen es in Spalte D gibt.
Beispiel Inhalte Spalte D: Peter,Peter,Dieter,Tim
--> Output Typen: Peter,Dieter,Tim (doppelte sollen ignoriert werden, und nur 1x in dem Output auftauchen)"
Vielen Dank im Voraus!
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Teillösung
16.01.2023 13:16:08
MCO
Hallo!
mit VBA würde die funktion für alle Datensätze COUNTA() heißen
mit Bedingung: SUM(--(C:C="X"))
Gruß, MCO
AW: VBA CountIf
16.01.2023 14:06:23
ChrisL
Hi
Für grosse Datenmengen könnte man ggf. noch etwas optimieren, aber wahrscheinlich reicht...

Sub t()
Dim QuellSheet As Worksheet, ZielSheet As Worksheet
Dim i As Long, Zaehler As Long
Set QuellSheet = ActiveSheet
Set ZielSheet = Sheets.Add(after:=Tabelle1)
ZielSheet.Name = "Infos_zu_Datensatz"
With QuellSheet
ZielSheet.Range("A1") = WorksheetFunction.CountA(.Columns(3))
ZielSheet.Range("A2") = WorksheetFunction.CountIf(.Columns(3), "x")
ZielSheet.Range("A3") = WorksheetFunction.CountIf(.Columns(3), "y")
For i = 1 To .Cells(.Rows.Count, 4).End(xlUp).Row
If WorksheetFunction.CountIf(.Range("D1:D" & i), .Cells(i, 4)) = 1 Then Zaehler = Zaehler + 1
Next i
ZielSheet.Range("A4") = Zaehler
End With
End Sub
cu
Chris
Anzeige
AW: VBA CountIf
16.01.2023 14:34:49
Paul
Hallo ChrisL,
vielen Dank für die schnelle Hilfe. Der erste Teil klappt genau wie ich es mir vorgestellt habe vielen Dank. Allerdings gibt mir die Schleife ja quasi "nur" die Anzahl der verschiedenen Typen wieder. Ich hatte mir gewünscht, dass hier die Strings (doppelte entfernt) aufgelistet werden.
Daten in der Spalte: Peter, Peter, Peter, Dieter,Paul,Tim
--> Zielsheet soll dann nur Peter, Dieter,Paul,Tim angezeigt werden. Danke

For i = 1 To .Cells(.Rows.Count, 4).End(xlUp).Row
If WorksheetFunction.CountIf(.Range("D1:D" & i), .Cells(i, 4)) = 1 Then Zaehler = Zaehler + 1
Next i
ZielSheet.Range("A4") = Zaehler

Anzeige
AW: VBA CountIf
16.01.2023 14:39:13
ChrisL
Hi
Dann z.B.

Sub t()
Dim QuellSheet As Worksheet, ZielSheet As Worksheet
Dim i As Long
Set QuellSheet = ActiveSheet
Set ZielSheet = Sheets.Add(after:=Tabelle1)
ZielSheet.Name = "Infos_zu_Datensatz"
With QuellSheet
ZielSheet.Range("A1") = WorksheetFunction.CountA(.Columns(3))
ZielSheet.Range("A2") = WorksheetFunction.CountIf(.Columns(3), "x")
ZielSheet.Range("A3") = WorksheetFunction.CountIf(.Columns(3), "y")
For i = 1 To .Cells(.Rows.Count, 4).End(xlUp).Row
If WorksheetFunction.CountIf(.Range("D1:D" & i), .Cells(i, 4)) = 1 Then _
ZielSheet.Cells(.Rows.Count, 2).End(xlUp).Offset(1) = .Cells(i, 4)
Next i
End With
End Sub
cu
Chris
Anzeige
AW: VBA CountIf
18.01.2023 07:26:38
Paul
Hallo Chris,
danke für dein Skript. Ich konnte das Skript jetzt für meine Excel Reports einsetzten. Leider stehe ich noch vor einem kleinen Problem.

For tt = 2 To .Cells(.Rows.count, 50).End(xlUp).Row
If WorksheetFunction.CountIf(.Range("AX1:AX" & tt), .Cells(tt, 50)) = 1 Then _
ZielSheet.Cells(.Rows.count, 17).End(xlUp).Offset(1) = .Cells(tt, 50)
Next tt
Und zwar gibt es bei mir bei den Excel Reports die Spalte "Bemerkungen", welche leider nicht immer in Spalte 50 zu finden ist, sondern auch mal in spalte 54 (Abhängig von anderen vorausgehenden Spalten)
Gibt es die Möglichkeit das Skript so anzupassen, dass in den Spaltenüberschriften nach "Bermerkungen" gesucht wird, und diese Spaltennummer dann in das o.g. Skript einzubauen?
Das wäre wirklich super, und würde das Skript für mich perfekt machen.
Danke und LG
Anzeige
AW: VBA CountIf
18.01.2023 08:40:07
ChrisL
Hi

s = Application.Match("Bemerkungen", .Rows(1), 0)
For tt = 2 To .Cells(.Rows.Count, s).End(xlUp).Row
If WorksheetFunction.CountIf(.Range(.Cells(2, s), .Cells(tt, s)), .Cells(tt, s)) = 1 Then _
ZielSheet.Cells(.Rows.Count, 17).End(xlUp).Offset(1) = .Cells(tt, s)
Next tt
cu
Chris
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Excel VBA CountIf: Daten zählen leicht gemacht


Schritt-für-Schritt-Anleitung

Um die CountIf-Funktion in VBA zu nutzen, folge diesen Schritten:

  1. Öffne deine Excel-Datei und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Erstelle ein neues Modul, indem du mit der rechten Maustaste auf "VBAProject" klickst und dann "Einfügen" > "Modul" wählst.
  3. Füge den folgenden Code in das Modul ein:
Sub t()
    Dim QuellSheet As Worksheet, ZielSheet As Worksheet
    Dim i As Long

    Set QuellSheet = ActiveSheet
    Set ZielSheet = Sheets.Add(after:=QuellSheet)
    ZielSheet.Name = "Infos_zu_Datensatz"

    With QuellSheet
        ZielSheet.Range("A1") = WorksheetFunction.CountA(.Columns(3))
        ZielSheet.Range("A2") = WorksheetFunction.CountIf(.Columns(3), "x")
        ZielSheet.Range("A3") = WorksheetFunction.CountIf(.Columns(3), "y")

        For i = 1 To .Cells(.Rows.Count, 4).End(xlUp).Row
            If WorksheetFunction.CountIf(.Range("D1:D" & i), .Cells(i, 4)) = 1 Then
                ZielSheet.Cells(.Rows.Count, 2).End(xlUp).Offset(1) = .Cells(i, 4)
            End If
        Next i
    End With
End Sub
  1. Schließe den VBA-Editor und führe das Skript aus, indem du F5 drückst oder über das Menü "Ausführen" gehst.

Häufige Fehler und Lösungen

  • Fehler: "Typen übereinstimmen nicht"

    • Lösung: Stelle sicher, dass die Spalten, die Du zählst, auch tatsächlich die richtigen Datentypen enthalten. Du kannst WorksheetFunction.CountIf nur auf Bereiche anwenden, die dieselben Datentypen enthalten.
  • Fehler: "Subscript out of range"

    • Lösung: Überprüfe, ob die Namen der Arbeitsblätter korrekt sind. Wenn Du ein neues Blatt erstellst, achte darauf, dass der Name nicht bereits existiert.

Alternative Methoden

Eine alternative Methode zur Nutzung von CountIf in VBA ist die Verwendung von Application.CountIf, die sich besonders für einfache Zähloperationen eignet. Der folgende Code zeigt, wie Du dies umsetzen kannst:

Dim AnzahlX As Long
AnzahlX = Application.CountIf(QuellSheet.Columns(3), "x")

Diese Methode ist besonders nützlich, wenn Du in großen Datenmengen eine schnelle Zählung durchführen möchtest.


Praktische Beispiele

Hier sind einige Anwendungsbeispiele für die CountIf-Funktion in verschiedenen Szenarien:

  1. Zählen von Werten in einer Spalte:

    Dim Gesamt As Long
    Gesamt = WorksheetFunction.CountIf(QuellSheet.Columns(3), "<>") ' Zählt alle nicht-leeren Zellen
  2. Zählen von spezifischen Werten:

    Dim AnzahlY As Long
    AnzahlY = WorksheetFunction.CountIf(QuellSheet.Columns(3), "y") ' Zählt alle "y" in Spalte C
  3. Zählen mit mehreren Bedingungen (CountIfs):

    Dim Anzahl As Long
    Anzahl = WorksheetFunction.CountIfs(QuellSheet.Columns(3), "x", QuellSheet.Columns(4), "y")

Tipps für Profis

  • Nutze CountIfs für mehrere Bedingungen, um die Effizienz Deines Codes zu steigern.
  • Verwende Application.Match, um dynamisch nach Spaltenüberschriften zu suchen und damit Deine Skripte flexibler zu gestalten.
  • Denke daran, dass WorksheetFunction.CountIf und Application.CountIf unterschiedlich verwendet werden können. Letztere ist einfacher, wenn Du nur zählen möchtest.

FAQ: Häufige Fragen

1. Wie kann ich mehrere Bedingungen in einem CountIf verwenden? Du kannst die CountIfs-Funktion verwenden, die mehrere Bedingungen unterstützt, indem Du sie in einer ähnlichen Weise wie CountIf aufrufst.

2. Kann ich CountIf auch für Zeilen verwenden? Ja, CountIf kann auch für Zeilen verwendet werden, indem Du den spezifischen Zeilenbereich angibst.

3. Wie kann ich die Ergebnisse in einer anderen Zelle ausgeben? Du kannst das Ergebnis einer Zählung einfach einer Zelle zuweisen, indem Du z.B. ZielSheet.Range("A1") = AnzahlX verwendest.

4. Gibt es eine Möglichkeit, die Performance bei großen Datenmengen zu optimieren? Ja, Du kannst die Bildschirmaktualisierung vor und nach der Ausführung Deines Skripts deaktivieren, um die Performance zu verbessern:

Application.ScreenUpdating = False
' Dein Code hier
Application.ScreenUpdating = True

Mit diesen Tipps und Tricks bist Du bestens gerüstet, um die CountIf-Funktion in VBA effektiv zu nutzen!

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige