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

Forumthread: gefüllte Zellen zählen

gefüllte Zellen zählen
18.09.2017 15:14:35
Gerhard
Hallo zusammen,
Bitte um VBA Lösung (keine Formellösung)
Es sollten in der beigefügten dynamischen Liste jeweils nur die gefüllten Zellen ab der Spalte M bis Spalte R
gezählt werden und in der Spalte S die Anzahl eingetragen werden!
Ab der Zeile 6 sollte der Zählvorgang beginnen und bis zum dynamischen Ende der Liste durchgeführt werden.
Anschließend sollte die Gesamtsumme der Spalte S in die Zelle B2 eingetragen werden.
Vielen Dank für Eure Hilfe
Gruß Gerhard
https://www.herber.de/bbs/user/116334.xls
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Zitat: Bitte um VBA Lösung (keine Formellösung)
18.09.2017 15:19:36
RPP63
Moin!
Was spricht gegen eine Excel-Funktion, die man natürlich auch mittels VBA umsetzen kann?
Stichwort: WorksheetFunction.CountIf()
Gruß Ralf
AW: gefüllte Zellen zählen
18.09.2017 15:28:02
Daniel
Hi
warum VBA?
reicht die Zelle B2 als Ergebnis?
als Formel würde ich dort eintragen, wenn die leeren Zellen echte Leerzellen sind
=Anzahl2(M:R)-Anzahl2(M1:R5)
wenn in Spalte M:R Formeln stehen, die teilweise das Ergebnis "" haben, würde ich so Zählen:
=ZählenWenn(M:R;"?*")-ZählenWenn(M1:R5;"?*")
dadurch, dass ich erst die ganze Spalte auszählen und dann die Anzahl aus dem Überschriftenbereich wieder abziehe, geht das immer automatisch bis zur letzten gefüllten Zelle, ohne dass die Formel angepasst werden muss.
Gruß Daniel
Anzeige
AW: gefüllte Zellen zählen
18.09.2017 15:32:54
KlausF
Hallo Gerhard,
probier mal:
Sub Anzahl()
Dim i As Long
Dim lastRow As Long
lastRow = ActiveSheet.Range("M:R").Find("*", searchdirection:=xlPrevious).Row
Application.ScreenUpdating = False
For i = 6 To lastRow
Range("S" & i) = WorksheetFunction.CountA(Range("M" & i & ":R" & i))
Next i
Range("B2") = WorksheetFunction.Sum(Range("S6:S" & lastRow))
End Sub
Gruß
Klaus
Anzeige
AW: gefüllte Zellen zählen
18.09.2017 16:04:38
Gerd
Hallo Gerhard!
Sub Gefuellte_im_Bereich()
Dim Z As Range
With Range(Cells(6, 13), Cells(Rows.Count, 13).End(xlUp)).Offset(, 6)
For Each Z In .Cells
Z.Value = WorksheetFunction.CountA(Z.Offset(0, -6).Resize(1, 6))
Next
Cells(2, 2) = WorksheetFunction.Sum(.Cells)
End With
End Sub

Gruß Gerd
Anzeige
For Each schneller?
18.09.2017 16:39:05
KlausF
Hallo Gerd,
wieso ist Deine Lösung eigentlich schneller als meine For-Next-Schleife?
Mit For Each klapperst Du doch auch jede Zelle einzeln ab.
Weist Du etwas darüber?
Etwas Ratlos
Gruß
Klaus
Ich bin nicht Gerd, aber …
18.09.2017 16:54:40
RPP63
… For Each liest und schreibt in ein Array, also den Arbeitsspeicher.
Das Langsamste in VBA sind einzelne Zellzugriffe, die mittels .Cells(i, k) evaluiert werden.
Two Cents,
Ralf
Anzeige
AW: Ich bin nicht Gerd, aber …
18.09.2017 17:34:01
KlausF
Hallo Ralf,
interessant, das habe ich nicht gewusst mit dem Array.
Scheint so, als ob ich mein mühsam antrainiertes For-Next
mal überdenken sollte ...
Danke für die Antwort!
Gruß
Klaus
AW: For Each schneller?
18.09.2017 16:57:27
Daniel
Hi Werner
bearbeiten der Zelle ist das eine, aber diese Zelle muss ja auch jedesmal gefunden werden.
Bei dir muss VBA jedesmal über den Textstring der Zelladresse aus der Gesamtmenge der Zellen auf das Zellobjekt schließen.
bei For Each In sind die zu bearbeitenden Zellen bereits vordefiniert, dh VBA kann da wesentlich schneller auf das einzelne Objekt direkt zugreifen, ohne erst den Text der Zelladresse auflösen zu müssen.
Gruß Daniel
Anzeige
Werner und Klaus, mach dir nichts draus
18.09.2017 17:42:40
KlausF
Hi Daniel,
das hört sich auch logisch an. Danke.
Und ... ich bin der Klaus :-)
Gruß
Klaus
AW: For Each schneller? Ja, aber
18.09.2017 17:15:12
Gerd
Hallo Klaus,
.. bei den paar Zeilen, ist das Jacke wie Hose und ich lasse die Schleife ebenfalls nur über eine Zelle pro Zeilenbereich laufen, die Ausgabezellen (mit Offset( ,6).
Bin halt mit dem Basteln fertig gewesen u. wollte meinen Code dann noch hier zeigen, bar jeder Notwendigkeit. :-)
Gruß Gerd
Anzeige
AW: For Each schneller? Ja, aber
18.09.2017 17:37:29
KlausF
Hallo Gerd,
Danke für Deine Antwort!
... bar jeder Notwendigkeit
Finde ich nicht. Ist immer ganz interessant zu sehen wie andere da heran gehen.
Für mich jedenfalls sehr lehrreich wie der Hinweist von Ralf zeigt ...
Gruß
Klaus
AW: For Each schneller? Ja, aber
18.09.2017 18:03:05
Gerhard
Hallo zusammen,
Vielen Dank für Eure VBA Lösungen!
Ich habe alle mal auspropiert und sie funktionen allesamt super!!!
Vielen Dank für Eure schnelle und competente Hilfe...
Gruß Gerhard
Anzeige
'For Each' arbeitet mit ObjektBezügen, falls ...
18.09.2017 18:48:51
Luc:-?
…möglich (weshalb auch nur Objekte und Variants zulässig sind), Klaus,
die in vordefinierter Reihenfolge aufgenommen wdn, zB …
• Zellen (ZellBereich): von links nach rechts und dann von oben nach unten (zeilenweise),
• Elemente eines Arrays in einem Variant (Datenfeld): spaltenweise
Das muss man beachten, wenn man einen Zeilen-/Spalten-Zähler mitlaufen lassen will!
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: 'For Each' arbeitet mit ObjektBezügen, falls ...
18.09.2017 19:09:20
KlausF
mit Infos überschüttet ...
Auch Dir ein Danke, Luc
Gruß
Klaus
Bitte sehr! owT
18.09.2017 19:51:23
Luc:-?
:-?
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Gefüllte Zellen zählen in Excel


Schritt-für-Schritt-Anleitung

Um in Excel gefüllte Zellen zu zählen, kannst du VBA nutzen. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject" > Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Sub Anzahl()
       Dim i As Long
       Dim lastRow As Long
       lastRow = ActiveSheet.Range("M:R").Find("*", searchdirection:=xlPrevious).Row
       Application.ScreenUpdating = False
       For i = 6 To lastRow
           Range("S" & i) = WorksheetFunction.CountA(Range("M" & i & ":R" & i))
       Next i
       Range("B2") = WorksheetFunction.Sum(Range("S6:S" & lastRow))
    End Sub
  4. Schließe den VBA-Editor und kehre zu Excel zurück.

  5. Führe das Makro aus: Drücke ALT + F8, wähle Anzahl und klicke auf "Ausführen".

Der Code zählt die gefüllten Zellen in den Spalten M bis R, beginnt ab der Zeile 6 und trägt die Ergebnisse in Spalte S ein. Die Gesamtsumme wird in Zelle B2 angezeigt.


Häufige Fehler und Lösungen

  • Fehler beim Ausführen des Makros:

    • Lösung: Stelle sicher, dass du die Makros in Excel aktiviert hast. Gehe zu Datei > Optionen > Trust Center > Einstellungen für das Trust Center > Makroeinstellungen.
  • Keine Zellen gezählt:

    • Lösung: Überprüfe, ob die Zellen in Spalte M bis R tatsächlich gefüllt sind und keine versteckten Leerzeichen enthalten.

Alternative Methoden

Wenn du keine VBA-Lösung verwenden möchtest, kannst du auch Excel-Formeln nutzen:

  1. Zähle gefüllte Zellen in einem Bereich:

    =ANZAHL2(M6:R100)  // Passt den Bereich nach Bedarf an
  2. Zähle nur wirklich gefüllte Zellen:

    =ZÄHLENWENN(M6:R100; "<>")  // Zählt nur die Zellen, die nicht leer sind

Mit diesen Formeln kannst du schnell eine Anzahl der gefüllten Zellen ermitteln, ohne VBA zu nutzen.


Praktische Beispiele

  • Beispiel 1: Zähle die Anzahl gefüllter Zellen in der Zeile 6 von M6 bis R6.

    =ANZAHL2(M6:R6)
  • Beispiel 2: Zähle alle gefüllten Zellen in den Spalten M bis R für die ersten 10 Zeilen.

    =ZÄHLENWENN(M6:R15; "<>")

Diese Formeln sind eine schnelle Möglichkeit, die Anzahl der befüllten Zellen zu ermitteln, ohne VBA zu verwenden.


Tipps für Profis

  • Nutze Arrays: Wenn du viele Zellen durchlaufen musst, ist es effizienter, die Daten in ein Array zu laden und dann zu zählen. Dies reduziert die Anzahl der Zugriffe auf das Arbeitsblatt.

  • Vermeide .Cells(i, k): Um die Leistung zu verbessern, verwende stattdessen For Each, um auf Zellbereiche zuzugreifen, da dies schneller ist.

  • Verwende Application.ScreenUpdating = False: Dies beschleunigt den Prozess, indem es die Bildschirmaktualisierung während der Ausführung des Makros deaktiviert.


FAQ: Häufige Fragen

1. Wie kann ich nur markierte Zellen zählen?
Du kannst eine Schleife verwenden, um nur die markierten Zellen zu zählen, indem du die Selection-Eigenschaft in VBA nutzt.

2. Gibt es eine Möglichkeit, die gefüllten Zellen ohne VBA zu zählen?
Ja, du kannst die Formeln ANZAHL2 oder ZÄHLENWENN verwenden, um gefüllte Zellen schnell zu zählen, ohne VBA zu verwenden.

3. Ist es möglich, die Zählung automatisch zu aktualisieren?
Ja, wenn du die Formeln in den Zellen verwendest, werden sie automatisch aktualisiert, wenn sich die Daten ändern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige