Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1912to1916
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ählen in aktiven Spalten (VBA)

Zählen in aktiven Spalten (VBA)
16.01.2023 12:32:52
Josef
Hallo Zusammen,
ich bin auf der Suche nach einem VBA-Code, der mir die Anzahl (in meinem Beispiel ist es das "A") in den aktivten Spalten zählt.
Folgendes muss passieren.
Ich markiere mehrere Zellen in einer Zeile und klicke auf den Button "Schaltfläche 1".
Dadurch werden in allen markierten Zellen der Buchstabe "A" eingetragen. Nun ist es aber so, dass eine msgbox aufpoppen soll, wenn von der gleichen Nr (Spalte A) das "A" mehrmals am selben Tag vorkommt. In der angehängten Datei wäre es an folgenden Tagen.
Tag2: hier kommt das "A" bei der Nr. 100 4 x vor
Tag6: hier kommt das "A" bei der Nr. 400 3 x und bei der Nr. 200 2 x vor.
Tag8: hier kommt das "A" bei der Nr. 100 4 x vor
Wie oft das bei der jeweiligen Nr. vorkommen darf, hängt von der Zahl in Spalte R ab.
Hoffentlich findet ihr eine Lösung für mein Problem.
Anbei dei xls
https://www.herber.de/bbs/user/157283.xlsm
Gruß Josef

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zählen in aktiven Spalten (VBA)
16.01.2023 14:09:35
Piet
Hallo
ein kleines aber gut durchdachtes Makro sollte dein Problem lösen. Eine alte Excel 2003 Datei, aber es funktioniert. Bitte testen
https://www.herber.de/bbs/user/157286.xls
mfg Piet
AW: Zählen in aktiven Spalten (VBA)
16.01.2023 14:23:26
Josef
Hallo Piet,
ich bin begeistert. Das funktioniert ja super. Und ich habe schon gedacht, dass es zu kompliziert wäre.
Vielen Dank
AW: Danke für die Rückmeldung oWt
16.01.2023 14:52:32
Piet
...
AW: Danke für die Rückmeldung oWt
16.01.2023 16:32:02
Josef
Hallo Piet,
jetzt brauche ich deine Hilfe doch noch einmal...
Irgendwie bekomme ich deinen Code nicht an die Originaldatei angepasst.
Wie müsste der Code aussehen, wenn die Max Werte nicht in Spalte Q:R sondern im Tabellenblatt 2 in Spalte f14:g25 stehen?
Anzeige
Mit andere Quelle
16.01.2023 18:52:34
Yal
Hallo Josef,
komische Fragestellung. Aber belustigend.

Sub Anzahl_A()
Dim D1 As Object
Dim D2 As Object
Dim R, C, K
Dim Sp As Long
Dim Msg As String
Set D1 = CreateObject("Scripting.Dictionary")
With Worksheets("Tabelle2")
'Beschränkung sammeln
For Each R In .Range("F14:F25")
D1(R.Value) = R.Offset(0, 1).Value
Next
End With
With Worksheets("Tabelle1")
'Tage durchgehen
For C = 2 To .Range("A1").End(xlToRight).Column
Set D2 = CreateObject("Scripting.Dictionary")
'einzelne Einträge sammeln
For R = 2 To .Range("A65535").End(xlUp).Row
If .Cells(R, C).Value = "A" Then D2(.Cells(R, 1).Value) = D2(.Cells(R, 1).Value) + 1
Next
'ggü Maxwert prüfen
For Each K In D2.keys
If D2(K) >= D1(K) Then Msg = Msg & vbLf & "Tag" & C - 1 & ", " & K & ": " & D2(K)
Next
Next
If Len(Msg) > 1 Then MsgBox Msg
End With
End Sub
Es gibt auch noch Möglichkeiten mit Power Query.
VG
Yal
Anzeige
AW: Zählen in aktiven Spalten (VBA)
16.01.2023 20:58:44
Piet
Hallo Josef
wie ich sehe gibt es eine Lösung von Yal. Sein Code ist sicher moderner, und schneller.
Meinen Code habe ich auf Tabelle2 umgeschrieben. Er hat einige Besonderheiten.
In Tabelle1 gibt es kein Limit für Spalten oder Zeilen. Das Makro findet LastZell und LastColumn!
Wenn du den Bereich "F14:G25" in Tabelle2 verschieben willst/ musst, ist das auch kein Problem.
Im Makro steht eine Const Anweisung mit der ersten Zelle "F14". Da musst du nur die Adresse aendern!
mfg Piet
  • Option Explicit 'überarbeitet: 16.1.2023 Piet für Herber Forum
    Dim AC As Range, lz1 As Long
    Dim AF As Range, lzF As Long
    Dim sp As Integer, lsp As Integer
    Dim Wert As Integer, Txt As String
    Const MaxAdr = "F14" '1. Zelle Max Wert
    
    Sub Anzahl_A_zählen()
    Dim Tb2 As Worksheet, rw 'Max
    Dim n As Integer, x As Integer
    Set Tb2 = Worksheets("Tabelle2")
    With Worksheets("Tabelle1")
    lz1 = .Range("A1").End(xlDown).Row
    lsp = .Range("A1").End(xlToRight).Column
    lzF = Tb2.Range(MaxAdr).End(xlDown).Row
    lzF = lzF - Tb2.Range(MaxAdr).Row + 1
    'Spalten B-L auswählen  (können mehr sein!)
    For sp = 2 To lsp
    'Max Werte aus Spalte F laden
    Txt = Empty  'Auswertung löschen
    For Each AF In Tb2.Range(MaxAdr).Resize(lzF, 1)
    Wert = AF.Value:  n = 0
    x = AF.Cells(1, 2).Value
    'Spalten B-L > Max durchsuchen
    For Each AC In .Range("A2:A" & lz1)
    If AC.Value = AF.Value And _
    .Cells(AC.Row, sp) = "A" Then n = n + 1
    Next AC
    If n > x Then Txt = Txt & Wert & " > " & x & " = " & n & vbLf
    Next AF
    'Auswertung > Max. für jeden Tag einzeln anzeigen
    If Txt  Empty Then MsgBox .Cells(1, sp) & vbLf & Txt
    Next sp
    End With
    End Sub
    

  • Anzeige
    AW: Zählen in aktiven Spalten (VBA)
    16.01.2023 23:46:03
    Yal
    Moin!
    "[..] eine Lösung von Yal. Sein Code ist sicher moderner, und schneller."
    Nein, nicht unebdingt ;-)
    Ich benutze Dictionaries, was die Handhabung leicher macht (muss man aber sich zuerst mit deren Funktionsweise auseinandersetzen), aber ein leichtes Performance-Nachteil bei kleinere Listen (sollte aber in Mikrosekunden-Bereich sein).
    Die grosse Frage ist: soll die MsgBox ganz am Ende oder pro Spalte erscheinen? Was nutzt Performance, wenn der Code 20 mal durch Nutzer-Interaktion unterbrochen wird.
    VG
    Yal
    AW: Zählen in aktiven Spalten (VBA)
    17.01.2023 08:21:50
    Josef
    Guten Morgen Yal,
    Vielen Dank, dass auch du dich meinem Problem annimmst.
    Ich habe gleich heute morgen mal deinen Code ausprobiert.
    Bei deinem Code ist es leider so, dass er mir für alle Spalte wo ein "A" enthalten ist eine MSGBox ausgibt. Ich jedoch benötige es nur für die aktiven Spalten. Und das auch nur, wenn die Anzahl der "A" in den aktiven Spalten den Max Wert übersteigt.
    Bsp.: Wenn ich die Zeilen B5:C5 markiere und überall per Button ein "A" einfügen, dann muss auch nur in den Spalten B:D überprüft werden, ob die Anzahl der "A's" den Max Wert übersteigen oder nicht. Wenn ja, dann muss auch nur für die Spalten eine Meldung kommen.
    Gruß Josef
    Anzeige
    AW: Zählen in aktiven Spalten (VBA)
    17.01.2023 13:26:34
    Yal
    Hallo Josef,
    "dass er mir für alle Spalte wo ein "A" enthalten ist eine MsgBox ausgibt." Wenn Du ganz ganz genau beobachtet, was in der einzigen Msgbox rauskommt, wirst Du merken, dass das nicht stimmt.
    Nur die Spalte der selectierte Zellen? So muss es gehen:
    
    Sub Anzahl_A()
    Dim D1 As Object
    Dim D2 As Object
    Dim R, C, K
    Dim Sp As Long
    Dim Msg As String
    Set D1 = CreateObject("Scripting.Dictionary")
    With Worksheets("Tabelle2")
    'Beschränkung sammeln
    For Each R In .Range("F14:F25")
    D1(R.Value) = R.Offset(0, 1).Value
    Next
    End With
    With Worksheets("Tabelle1")
    'Tage durchgehen
    For Each C In Selection.Columns
    Set D2 = CreateObject("Scripting.Dictionary")
    'einzelne Einträge sammeln
    For R = 2 To .Range("A65535").End(xlUp).Row
    If .Cells(R, C).Value = "A" Then D2(.Cells(R, 1).Value) = D2(.Cells(R, 1).Value) + 1
    Next
    'ggü Maxwert prüfen
    For Each K In D2.keys
    If D2(K) >= D1(K) Then Msg = Msg & vbLf & "Tag" & C - 1 & ", " & K & ": " & D2(K)
    Next
    Next
    If Len(Msg) > 1 Then MsgBox Msg
    End With
    End Sub
    
    VG
    Yal
    Anzeige
    AW: Zählen in aktiven Spalten (VBA)
    17.01.2023 14:10:21
    Josef
    Hallo Yal,
    irgendwo ist noch der Wurm drinnen. Der Code hat ein Problem mit dem Befehl (If .Cells(R, C).Value = "A" Then). Die Typen sind hier wohl unverträglich
    probiere If .Cells(R, C.Column).Value = "A" owT
    17.01.2023 15:06:09
    Yal
    AW: probiere If .Cells(R, C.Column).Value = "A" owT
    17.01.2023 15:20:05
    Josef
    Jetzt findet hier eine Typenunverträglichkeit statt Msg = Msg & vbLf & "Tag" & C - 1 & ", " & K & ": " & D2(K)
    AW: probiere If .Cells(R, C.Column).Value = "A" owT
    17.01.2023 15:28:41
    Josef
    Habe den Fehler gefunden. Auch bei Msg musste ich c durch c.column ersetzen.
    Allerdings habe ich nun das gleiche Problem wie bei deinem ersten Code. Und zwar erscheint die MSG-Box für jedes "A" das er findet (auch wenn der Max wert nicht erreicht wurde)
    AW: probiere If .Cells(R, C.Column).Value = "A" owT
    17.01.2023 15:29:58
    Josef
    -
    AW: probiere If .Cells(R, C.Column).Value = "A" owT
    17.01.2023 18:00:27
    Yal
    Hallo Josef,
    "Fehler gefunden": sehr gut! Willkommen im Klub der VBA-Checker.
    "erscheint die MSG-Box für jedes "A" das er findet"
    Das kann ich nicht nachvollziehen (Ich habe nur deinem Beispiel zur Verfügung):
    Markiere nur den Tag1, kommt keine Meldung
    Markiere ich Tag1, 2, 3, kommt eine Meldung: Tag2, 100: 4 (was mehr als 3 ist), Tag2, 400: 2 (was genau 2 ist *)
    Dito alle andere Spalten.
    Ich weiss nicht, wie Du prüfst oder die Meldung liest, aber ich kann das Verhalten, dass das Makro bei Dir vorzeigen soll, nicht reproduzieren.
    *: eventuell müsste die Prüfung "grösser-gleich als" in "grösser als" geändert werden. Hat aber mit der angebliche Fehler nicht zu tun.
    VG
    Yal
    Anzeige
    AW: probiere If .Cells(R, C.Column).Value = "A" owT
    18.01.2023 07:30:50
    Josef
    Guten Morgen Yal,
    dein Code funktioniert doch.
    Da in der Originaldatei die Datenspalte in Spalte D und nicht wie in der Testdatei in Spalte A beginnt, habe ich das Object "D2" ebenfalls anpassen müssen und das habe ich ständig übersehen 🤦‍♂️.
    Danke das du dir so viel Zeit dafür genommen hast.
    AW: Zählen in aktiven Spalten (VBA)
    17.01.2023 07:57:02
    Josef
    Guten Morgen Piet,
    vielen Dank, dass du dir das Thema noch einmal angeschaut hast. Leider erzeugt der neue Code einen Fehler "Die Methode Range für das Objekt_Worksheet ist fehlgeschlagen. Diesen Fehler bringt er für die Zeile 'LZF=lzf - Tb2.Range(MaxAdr).Row+1
    Dann dachte ich, ich probiere den Code von Yal. Leider erzeugt auch der einen Fehler. Bei ihm ist es der Zeilencode 'If .Cells(R, C).Value = "U" Then der im Debugger hervorgehoben wird.
    Anzeige
    AW: Zählen in aktiven Spalten (VBA)
    17.01.2023 17:35:30
    Piet
    Hallo Josef
    ich lade dir mal meine Beispieldatei hoch, bei mir laeuft der Code einwadfrei. Excel 2003 Format.
    Hat die Tabelle2 bei dir einen anderen Namen? Dann musst du im Code deinen Namen angeben!
    https://www.herber.de/bbs/user/157329.xls
    mfg Piet
    AW: Zählen in aktiven Spalten (VBA)
    18.01.2023 07:34:15
    Josef
    Guten Morgen Piet,
    ich habe es nun endlich mit dem Code von Yal angepasst bekommen.
    Danke das du dir so viel Zeit dafür genommen hast.
    Wünsche dir noch einen schönen Tag.
    Gruß Josef

    312 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige