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

CountA(Range) Problemchen...

Forumthread: CountA(Range) Problemchen...

CountA(Range) Problemchen...
16.12.2007 02:01:45
Alex
Hallo excel-vba Freunde,
ich bräuchte mal eine kleine Hilfestellung in folgendem Code:
  • 
    Sub Anzahl()
    Dim myRange As Range
    Dim Zeile As Long
    Dim Spalte As Integer
    Zeile = Worksheets("Datenbank").Range("A65536").End(xlUp).Row
    Worksheets("Datenbank").Select
    For Spalte = 4 To 34
    For i = 2 To Zeile
    Cells(i, 35) = Application.WorksheetFunction.CountA(Range("D" & Spalte & ":AH" &  _
    Spalte))
    Next i
    Next Spalte
    Sheets("Datenbank").Select
    Columns("AI:AI").Copy
    Sheets("Unterschriftenblatt").Select
    Columns("D:D").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Worksheets("Unterschriftenblatt").Select
    End Sub
    



  • Passieren soll folgendes: ich will die Spalten D:AH ZEILENWEISE auf Inhalt überprüfen und dann in die Spalte AI den Wert eintragen lassen, wie viele Zellen mit Inhalt vorhanden sind.
    Allerdings bin ich anscheinend zu doof - um das mit den Schleifen auf die Reihe zu bekommen... hab sogar schon aus Verzweiflung versucht die Cells (Argumente) einzeln einzugeben, allerdings ... max. 30 Arg. möglich... und 1 Monat hat auch mal 31 Tage.... *hmpf*
    Bitte um Hilfe.
    Danke schon mal :)
    Alex S.

    Anzeige

    8
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    Tja, abgesehen davon, dass du dir recht...
    16.12.2007 04:41:47
    Luc:-?
    ...irreführende Variablenbezeichnungen ausgedacht hast, Alex,
    ("...der Hund, der ein Pferd war..." oder so ähnlich) und überflüssige Selects verwendest, scheint das formal richtig zu sein... Aber schau'n wa mal...
    Du erhöhst Spalte von 4 bis 34 und nach jeder dieser Erhöhungen i ebenfalls um 1 bis zur letzten benutzten Zeile. In jeder i-Zeile zählst du die Werte der "Spalte"-Zeile in den Spalten D:AH. Damit trägst du beim 1.Mal in Zelle AI2 die Anzahl von D4:AH4 ein. Beim 2.Mal in AI3 ebenfalls D4:AH4 usw bis das ganze Spiel von vorn beginnt und du zum Schluss in genau die gleichen Zellen die Werte von Zeile 34 einträgst... Oh, oh, oh! Da läuft ja wohl was ganz besonders schief... ;-) Ich glaube nämlich nicht, dass du das beabsichtigt hast! So, dann dreh mal alles schön um - vom Kopf wieder auf die Füße -, wähle ordentliche Indizes wie i und j oder r und z oder wie auch immer, nur nicht Spalte für Zeile, auch wenn das 'ne andere Zeile ist. Außerdem könnte hier auch nur eine Schleife mit nur einer Zählvariablen reichen, wenn Spalte immer um 2 > i ist... Aber vielleicht ist ja alles auch ganz anders gemeint...
    Deshalb hat man früher immer das gemacht, was ich dir hier vorexerziert habe - das nennt man Trockentest! Es wäre keinem Programmierer eingefallen, teure Großrechnerzeit mit nicht trocken getesteten Fehlerprogrammen zu vergeuden... Aber der PC macht ja auch das möglich! Der Test findet dann notfalls im Internet statt... ;-)
    Gruß Luc :-?
    PS: Verschachtelte Zyklen (Schleifen) wdn immer von innen nach außen abgearbeitet!

    Anzeige
    warum nimmst Du denn nich gleich Formeln?
    16.12.2007 05:32:00
    Matthias
    Hallo Alex und auch ein "Guten Morgen" an Luc:-?
    Du deklarierst myRange und benutzt diese Variable nicht
    Du deklarierst i nicht und benutzt aber diese Variable.
    Dim i As Long wäre also auch notwendig
    Wenn Du ein Option Explicit vor Deine Sub setzt, wäre Excel das aufgefallen und hätte gemeckert ;o)
    Aber warum nimmst Du eigentlich nicht gleich Formeln in dieser Art:
    
    =WENN(A2"";ANZAHL2(D2:AH2);"")
    


    Ich habe es mal mit eine WennAbfrage erstellt, da Du ja geschrieben hast mal 30, mal 31 Tage
    damit wird eben nur geprüft, ob auch ein Wert in A vorhanden ist.
    oder eben nur

    
    ANZAHL2(D2:AH2)
    


    Userbild
    D1:AH1 sind einfach nur die Spalten und haben hier keine Bedeutung
    damit hättest Du schon alle Zählungen und könntest sogar wieder mit Formeln die Zellen der
    2.Tabelle füllen.
    Userbild
    alles andere hat Luc ja schon gepostet.
    Userbild

    Anzeige
    AW: warum nimmst Du denn nich gleich Formeln?
    16.12.2007 18:07:00
    Alex
    Hallo Luc, Hallo Matthias,
    ja ok, das mit den Variablen, war so eine Sache. Habe ich dann später schon korrigiert, aber was ich immer noch nicht geschafft habe, ist das Problem mit VBA zu lösen, ich will nämlich keine Formeln im Excelsheet stehen haben. Mittels der Formel =ANZAHL2(D2:AH2) kommt auch das richtige raus - nur soll das bei mir mittels vba geschehen und insoweit dynamisch sein, dass es beliebig viele Zeilen sein können, in denen er die Anzahl an Werten liefert.
    Was ich benötige ist ein Code in vba, der mit den Bereich von D:AH dynamisch nach unten (zeilenweise) berechnet und das Ergebnis in die Spalte AI (in die selbe Zeile) einträgt. Ganz ohne Formel in die Zelle einzutragen (weil ich diese mittels clearcontent wieder lösche).
    Wenn ihr mir also bitte kurz begreiflich machen könntet wie ich bei dem
  • Cells(i, 35) = Application.WorksheetFunction.CountA(Range("D" & Spalte & ":AH" & Spalte))

  • Bereich automatisch die Werte berechnen könnte, wäre mir schon sehr geholfen.
    @Luc: warum soll ich Spalte mit Zeile verwechseln? Steh ich auf der Leitung? z.B. D4:AH4 = wohl ein Spaltenbereich oder nicht ?
    Oder anders gefragt, wie gebe ich bei CountA eine Range mittels cells an ? ...CountA(Cells(i,4),cells(i,34)) nimmt mir nämlich nur die aktuelle Zeilennummer i und die beiden Spalte D und AH - nicht aber den Bereich dazwischen... wie schreibe ich das in vba, ich kann soweit ich das durchblickt habe nur Zellen angeben, nicht aber den Bereich dazwischen. Und leider kann ich bei CountA maximal 30 Argumente eingeben... benötigen tue ich aber 31...
    Bin für eure Hilfe dankbar :) (sehe vermutlich den Wald vor lauter Bäumen nicht.... )
    MfG
    Alex S.

    Anzeige
    AW: warum nimmst Du denn nich gleich Formeln?
    16.12.2007 19:47:00
    Uduuh
    Hallo,
    
    wie gebe ich bei CountA eine Range mittels cells an ? 
    


    indem du es auch tust.
    ...CountA(Range(Cells(i,4),cells(i,34)))
    Gruß aus’m Pott
    Udo

    AW: warum nimmst Du denn nich gleich Formeln?
    16.12.2007 20:35:00
    Alex
    Hallo Udo,
    THAT'S IT !!
    oh mein gott, ich wusste, dass es nicht so schwer sein kann....
    vielen, vielen Dank.
    Ich war schon knapp am verzweifeln... aber wie ich schon geschrieben habe... oft sieht man den wald vor lauter bäumen nicht....
    Danke nochmals,
    MfG
    Alex S.

    Anzeige
    AW: CountA(Range) Problemchen...
    16.12.2007 20:24:28
    Gerd
    Hallo Alex,
    eine Möglichkeit in beiden Schreibweisen, ungetestet.
    
    Sub Anzahl_A1_Schreibweise()
    Dim lngZeile As Long
    With ThisWorkbook.Worksheets("Datenbank")
    For lngZeile = 2 To .Range("A65536").End(xlUp).Row
    .Range("AI" & lngZeile).Value = _
    Application.WorksheetFunction. _
    CountA(.Range("D" & lngZeile & ":AH" & lngZeile))
    Next lngZeile
    .Columns("AI:AI").Copy
    End With
    With ThisWorkbook.Worksheets("Unterschriftenblatt")
    .Columns("D:D").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    .Select
    End With
    End Sub
    


    
    Sub Anzahl_Cells_Schreibweise()
    Dim lngZeile As Long
    With ThisWorkbook.Worksheets("Datenbank")
    For lngZeile = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
    .Cells(lngZeile, 35).Value = _
    Application.WorksheetFunction. _
    CountA(.Range(Cells(lngZeile, 4), Cells(lngZeile, 34)))
    Next lngZeile
    .Columns(35).Copy
    End With
    With ThisWorkbook.Worksheets("Unterschriftenblatt")
    .Columns(4).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    .Select
    End With
    End Sub
    


    Die Worksheet-Objekte zu referenzieren habe ich jetzt der Übersichtlichkeit halber vergessen.
    Alles klar ? :-)

    Anzeige
    AW: CountA(Range) Problemchen...
    16.12.2007 20:38:00
    Alex
    Hallo Gerd,
    danke für deine Ausführung, aber mit dem Beitrag von Udo hab ich schon alles was ich brauche. Mehr wollte ich gar nicht :D
    hätte einfach ein Wort mehr tippen sollen... Cells(i, 35) = Application.WorksheetFunction.CountA(Range(Cells(i, 4), Cells(i, 34)))
    dann hätte alles so geklappt, wie ich mir das vorgestellt habe.
    MfG
    Alex S.

    Anzeige
    ;
    Anzeige

    Infobox / Tutorial

    Zähle nicht leere Zellen mit CountA in VBA


    Schritt-für-Schritt-Anleitung

    Um die Anzahl der nicht leeren Zellen in einem bestimmten Bereich mit der CountA-Funktion in Excel VBA zu zählen, kannst Du folgenden VBA-Code verwenden:

    Sub Anzahl()
        Dim lngZeile As Long
        With ThisWorkbook.Worksheets("Datenbank")
            For lngZeile = 2 To .Range("A65536").End(xlUp).Row
                .Cells(lngZeile, 35).Value = _
                Application.WorksheetFunction.CountA(.Range("D" & lngZeile & ":AH" & lngZeile))
            Next lngZeile
        End With
    End Sub

    Dieser Code zählt die nicht leeren Zellen in den Spalten D bis AH für jede Zeile in der Tabelle "Datenbank" und trägt das Ergebnis in die Spalte AI ein.


    Häufige Fehler und Lösungen

    1. Falsche Variablenbezeichnungen: Achte darauf, dass Du sinnvolle und eindeutige Namen für Deine Variablen verwendest. Vermeide Verwirrungen, wie sie im Thread angesprochen wurden.

    2. Nicht deklarierte Variablen: Wenn Du Option Explicit verwendest, wird Excel Dich darauf aufmerksam machen, wenn Du eine Variablen nicht deklariert hast. Stelle sicher, dass Du alle benötigten Variablen wie Dim i As Long vorher deklarierst.

    3. Falsche Schleifenstruktur: Achte darauf, dass die Schleifen korrekt verschachtelt sind. Wenn Du versehentlich die Zeilen und Spalten vertauschst, kann dies zu falschen Ergebnissen führen.


    Alternative Methoden

    Wenn Du keine VBA-Lösungen nutzen möchtest, kannst Du auch Excel-Formeln verwenden. Eine einfache Formel könnte so aussehen:

    =WENN(A2<>"";ANZAHL2(D2:AH2);"")

    Diese Formel überprüft, ob in Zelle A2 ein Wert vorhanden ist und zählt dann die nicht leeren Zellen im Bereich D2 bis AH2.


    Praktische Beispiele

    Beispiel 1: Dynamisches Zählen in VBA

    Ein weiteres Beispiel für die Verwendung von CountA in VBA:

    Sub DynamischesAnzahl()
        Dim lngZeile As Long
        With ThisWorkbook.Worksheets("Datenbank")
            For lngZeile = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                .Cells(lngZeile, 35).Value = _
                Application.WorksheetFunction.CountA(.Range(Cells(lngZeile, 4), Cells(lngZeile, 34)))
            Next lngZeile
        End With
    End Sub

    Hier wird der Bereich von D bis AH zeilenweise gezählt und das Ergebnis in der Spalte AI eingetragen.


    Tipps für Profis

    • Verwende Application.WorksheetFunction.CountA: Diese Methode ist effizient, wenn Du in VBA die Anzahl nicht leerer Zellen zählen möchtest.
    • Reduziere die Nutzung von Select und Activate: Dies macht den Code schneller und sauberer.
    • Nutze Option Explicit: Dies zwingt Dich, alle Variablen zu deklarieren und hilft, Fehler frühzeitig zu erkennen.

    FAQ: Häufige Fragen

    1. Wie kann ich die Anzahl der nicht leeren Zellen in einem bestimmten Bereich in VBA zählen?
    Du kannst dies tun, indem Du Application.WorksheetFunction.CountA mit einem definierten Bereich verwendest, wie im obigen Beispiel gezeigt.

    2. Was ist der Unterschied zwischen CountA und Count?
    CountA zählt alle nicht leeren Zellen, während Count nur die Zellen zählt, die Zahlen enthalten.

    3. Kann ich CountA auch mit Arrays verwenden?
    Ja, Du kannst CountA auch auf Arrays anwenden, indem Du das Array in die Funktion einfügst.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige