Anzeige
Archiv - Navigation
1960to1964
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

Sub CountChars()

Sub CountChars()
23.01.2024 07:43:09
Nordic
Moin :)
für nachfolgende Anforderung gibt es sicherlich schlauere Lösungen, ich hab mich in einem ersten Schritt dem mal semioptimal angenähert.
Meine geschätzten KollegInnen möchten die Eingaben im Bereich W7:NX156 Zeile für Zeile mitgezählt\ausgewertet haben.
Ideal wäre natürlich, dass neben der Anzahl "f" (Fehlzeit) nur die Module berücksichtigt werden (bestenfalls schon bei der Eingabe) die der TN auch tatsächlich gebucht hat ("x" bei E$7:O$7).
Beispiel die der beiliegenden Demo: TN1 (B7) hat die Module 1,2,8 und 10. Nun soll in der Zeile gezählt werden wie oft die 1,2,8 und die 10 (für 10 gilt alternativ auch P ) eingegeben wurde. Für TN3 (B9) wäre es die Anzahl von 1,2,4 und 8. "f" für Fehlzeit wird immer gezählt.
Da jedes Modul eine bestimmt Anzahl von Tagen (Ressourcen: D2:E12) dauert wäre es natürlich vorteilhaft wenn IST dem SOLL gegenübergestellt wird (Beispiel: M1 = 2/3, M2 = 7/8, usw)
Um die Tabelle nicht noch weiter aufzublähen will ich das jeweilige Ergebnis ab B$7 in ein Kommentar schreiben.
Hierzu hab ich mir folgendes gebastelt, was jedoch Zeile für Zeile die gleichen Werte ermittelt, was natürlich nicht sein kann.
(Derzeit hab ich keine Unterscheidung nach gewähltem Modul, da mir hierzu der Ansatz fehlt. Daher versuch ich alles auszulesen)



Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 22 And Target.Cells.Count = 1 Then
If Target.Value = "x" Then
Target.EntireRow.Hidden = True
ElseIf Target.Value = "" Then
Target.EntireRow.Hidden = False
End If
End If

Dim MyRange As Range
Set MyRange = Me.Range("W7:NX156")

If Not Application.Intersect(MyRange, Range(Target.Address)) Is Nothing Then
Call CountChars
End If

End Sub




Sub CountChars()
Dim i As Long: i = 7
Dim rng As Range
Set rng = Worksheets("Projektplan").Range(Cells(i, 23), Cells(i, 388))
Dim Count_1 As Integer: Count_1 = 0
Dim Count_2 As Integer: Count_2 = 0
Dim Count_3 As Integer: Count_3 = 0
Dim Count_4 As Integer: Count_4 = 0
Dim Count_5 As Integer: Count_5 = 0
Dim Count_6 As Integer: Count_6 = 0
Dim Count_7 As Integer: Count_7 = 0
Dim Count_8 As Integer: Count_8 = 0
Dim Count_9 As Integer: Count_9 = 0
Dim Count_10 As Integer: Count_10 = 0
Dim Count_P As Integer: Count_P = 0
Dim Count_11 As Integer: Count_11 = 0
Dim Count_f As Integer: Count_f = 0
Dim cell As Range

For i = 7 To gLR
For Each cell In rng
Count_1 = Count_1 + Len(cell.Value) - Len(Replace(cell.Value, "1", ""))
Count_2 = Count_2 + Len(cell.Value) - Len(Replace(cell.Value, "2", ""))
Count_3 = Count_3 + Len(cell.Value) - Len(Replace(cell.Value, "3", ""))
Count_4 = Count_4 + Len(cell.Value) - Len(Replace(cell.Value, "4", ""))
Count_5 = Count_5 + Len(cell.Value) - Len(Replace(cell.Value, "5", ""))
Count_6 = Count_6 + Len(cell.Value) - Len(Replace(cell.Value, "6", ""))
Count_7 = Count_7 + Len(cell.Value) - Len(Replace(cell.Value, "7", ""))
Count_8 = Count_8 + Len(cell.Value) - Len(Replace(cell.Value, "8", ""))
Count_9 = Count_9 + Len(cell.Value) - Len(Replace(cell.Value, "9", ""))
Count_10 = Count_10 + Len(cell.Value) - Len(Replace(cell.Value, "10", ""))
Count_P = Count_P + Len(cell.Value) - Len(Replace(cell.Value, "P", ""))
Count_11 = Count_11 + Len(cell.Value) - Len(Replace(cell.Value, "11", ""))
Count_f = Count_f + Len(cell.Value) - Len(Replace(cell.Value, "f", ""))
Next cell

With Worksheets("Projektplan").Cells(i, 2)
If Not .Comment Is Nothing Then .Comment.Delete
.AddComment "Modul 1: " & Count_1 & vbNewLine & _
"Modul 2: " & Count_2 & vbNewLine & _
"Modul 3: " & Count_3 & vbNewLine & _
"Modul 4: " & Count_4 & vbNewLine & _
"Modul 5: " & Count_5 & vbNewLine & _
"Modul 6: " & Count_6 & vbNewLine & _
"Modul 7: " & Count_7 & vbNewLine & _
"Modul 8: " & Count_8 & vbNewLine & _
"Modul 9: " & Count_9 & vbNewLine & _
"Modul 10: " & Count_10 & vbNewLine & _
"betr.Erp: " & Count_P & vbNewLine & _
"Modul 11: " & Count_11 & vbNewLine & _
"--------------" & vbNewLine & _
"Fehltage: " & Count_f & vbNewLine
End With

Count_1 = 0
Count_2 = 0
Count_3 = 0
Count_4 = 0
Count_5 = 0
Count_6 = 0
Count_7 = 0
Count_8 = 0
Count_9 = 0
Count_10 = 0
Count_P = 0
Count_11 = 0
Count_f = 0

Next i
End Sub


https://www.herber.de/bbs/user/166284.xlsm

Wo ist der Fehler?
Euch einen entspannten Tag und VG, Nordic (Uwe)

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sub CountChars()
23.01.2024 08:11:10
MCO
Moin, Uwe!

Der Fehler ist offensichtlich:
Sub CountChars()

Dim i As Long: i = 7

Damit ist i immer 7 und nicht die aktuelle Zeile.

Der Aufruf der Sub muss mit der variablen erfolgen. Schreibe:
Sub CountChars(i As Long)

Dim rng As Range
Set rng = Worksheets("Projektplan").Range(Cells(i, 23), Cells(i, 388))


Der Aufruf heißt dann statt
Call CountChars

Call CountChars (target.row)

oder
CountChars target.row


Bei Workbooks_open kannst du das fest zuweisen
Private Sub Workbook_Open()

Application.ScreenUpdating = False

Dim DatLeiste As Range
Dim DatEinzel As Range
Set DatLeiste = Range(Cells(6, 23), Cells(6, 23).End(xlToRight))
For Each DatEinzel In DatLeiste
If Month(DatEinzel) = Month(Date) And Year(DatEinzel) = Year(Date) Then
Application.Goto DatEinzel, True
Exit For
End If
Next

CountChars 6

Application.ScreenUpdating = True
End Sub


Ich hoffe, es hilft :-)

Gruß, MCO
Anzeige
AW: Sub CountChars()
23.01.2024 09:03:59
Nordic
Moin MCO,
ich hab Deine Korrekturen mal eingebaut (CountChars erhält den Parameter 7 ;) ). Abgesehen davon, dass "10" auch als "1" mitgezählt wird bleiben die Ergebnisse für allen Zeilen gleich.

https://www.herber.de/bbs/user/166285.xlsm

VG, Uwe


AW: Sub CountChars()
23.01.2024 10:05:07
MCO
Hi!

In der Prozedur hattest du noch einen Zähler, der durch alle Zeilen geht (unnötig)
Ich hab den mal entfernt und die Auswertemethode geändert. Da der Wert in der Zelle immer eindeutig ist ("2" oder "f", aber nicht "2f") prüf ich den kompletten Wert auf Inhalt mit select case. Damit wird bei "10" auch nicht mehr "1" gezählt.

Außerdem wird bei Dim XX as integer der Wert immer auf 0 gesetzt und muss a) nicht zugewiesen werden mit 0 und b) auch nicht zurückgesetzt werden.

Damit ergibt sich diese Funktion, die auch das gewünschte Ergebnis liefert:
Sub CountChars(i As Long)

Dim rng As Range
Set rng = Worksheets("Projektplan").Range(Cells(i, 23), Cells(i, 388))

Dim Count_1 As Integer
Dim Count_2 As Integer
Dim Count_3 As Integer
Dim Count_4 As Integer
Dim Count_5 As Integer
Dim Count_6 As Integer
Dim Count_7 As Integer
Dim Count_8 As Integer
Dim Count_9 As Integer
Dim Count_10 As Integer
Dim Count_P As Integer
Dim Count_11 As Integer
Dim Count_f As Integer

Dim cell As Range

For Each cell In rng.SpecialCells(xlCellTypeConstants)

Select Case cell.Value
Case "1": Count_1 = Count_1 + 1
Case "2": Count_2 = Count_2 + 1
Case "3": Count_3 = Count_3 + 1
Case "4": Count_4 = Count_4 + 1
Case "5": Count_5 = Count_5 + 1
Case "6": Count_6 = Count_6 + 1
Case "7": Count_7 = Count_7 + 1
Case "8": Count_8 = Count_8 + 1
Case "9": Count_9 = Count_9 + 1
Case "10": Count_10 = Count_10 + 1
Case "11": Count_11 = Count_11 + 1
Case "P": Count_P = Count_P + 1
Case "f": Count_f = Count_f + 1
End Select
Next cell

With Worksheets("Projektplan").Cells(i, 2)
If Not .Comment Is Nothing Then .Comment.Delete
.AddComment "Modul 1: " & Count_1 & vbNewLine & _
"Modul 2: " & Count_2 & vbNewLine & _
"Modul 3: " & Count_3 & vbNewLine & _
"Modul 4: " & Count_4 & vbNewLine & _
"Modul 5: " & Count_5 & vbNewLine & _
"Modul 6: " & Count_6 & vbNewLine & _
"Modul 7: " & Count_7 & vbNewLine & _
"Modul 8: " & Count_8 & vbNewLine & _
"Modul 9: " & Count_9 & vbNewLine & _
"Modul 10: " & Count_10 & vbNewLine & _
"betr.Erp: " & Count_P & vbNewLine & _
"Modul 11: " & Count_11 & vbNewLine & _
"--------------" & vbNewLine & _
"Fehltage: " & Count_f & vbNewLine
End With
End Sub
Gruß, MCO
Anzeige
AW: Sub CountChars()
25.01.2024 07:44:16
Nordic
Moin MCO,
abgesehen davon, dass es ziemlich unsinnig ist "f" auszulesen, da ich den Wert schon aktuell habe, komme ich (auch nach dem Austausch mit den KollegInnen) zunehmend dahin, dass ich mich den Kommentaren vergaloppiert habe.
Letztlich geht es darum für jeden einzelnen TN den Überblick zu behalten wieviel Tage je gewähltem Modul (x in E:O) bereits verplant und wieviel noch zu planen sind.
Den Code hab ich mal verbaut, jedoch wir beim öffnen der Tabelle nur die erste Zeile (korrekt) "gelesen". Alle anderen bleiben leer.
Wenn ich im Bereich W:NX etwas ändere wird die Routine ausgelöst und die Ergebnisse korrekt in den entsprechenden Kommentar geschrieben.

https://www.herber.de/bbs/user/166401.xlsm

VG, Nordic (Uwe)






Anzeige
AW: Sub CountChars()
23.01.2024 14:53:57
Yal
Moin zusammen,

ich habe die Datei von Nordic nicht geöffnet, aber durch die Anmerkung von MCO was abgewinnen können.
Ich schlage folgende Zusammenfassung vor:

Sub CountChars()

Dim Arr
Dim R As Range
Dim Count()
Dim msg As String
Dim cell As Range
Dim i As Long

Arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "P", 11, "", "f")

For Each R In Worksheets("Projektplan").Range("W7:NX" & gLR).Rows
ReDim Count(UBound(Arr)) 'erzeugt einen leeren Array
msg = ""
For Each cell In R.Cells
For i = 0 To UBound(Arr)
Count(i) = Count(i) - (cell.Value = Arr(i)) 'der Boolean "True" = -1, False = 0
Next
Next cell
Arr(13) = ""
For i = 0 To UBound(Count)
msg = msg & "Modul " & Arr(i) & ":" & Count(i) & vbNewLine
Next
msg = Replace(msg, "Modul P", "Betr.Erp") '3 Sonderfälle
msg = Replace(msg, "Modul :", "--------------")
msg = Replace(msg, "Modul f", "Fehltage")

With Worksheets("Projektplan").Cells(i, 2)
If Not .Comment Is Nothing Then .Comment.Delete
.AddComment msg
End With
Next
End Sub


VG
Yal
Anzeige
Sehr schön!
24.01.2024 08:20:46
MCO
Gefällt mir super!
AW: Sehr schön!
24.01.2024 10:26:16
Yal
Danke.

mir fehlt gerade einen Fehler auf:

    Arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "P", 11, "", "f")

...
Arr(13) = ""

Die auszusetzende Position zwischen "11" und "f" ist die 12te, nicht die 13te! Immer sehr tückisch die Array-Index ab null.

Nun ist die Frage, was unseren Fragenden damit machen kann (ich war mit Kommentar im Code sehr sparsam...)

VG
Yal
Leicht abgewanderte Version
24.01.2024 10:49:22
Yal
Hallo zusammen,

wenn man die Anzeige-Vorbereitung im Array schon vornimmt, vermeidet man die Replace (man spart sich Mikro-Sekunden ;-)
Kommentartext kann festelegen, aber nur wenn Kommentar bereits vorhanden.

Sub CountChars()

Dim Arr
Dim R As Range 'R für Row
Dim Count()
Dim cell As Range
Dim i As Long

Arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "P", 11, "", "f")
'Index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13

For Each R In Worksheets("Projektplan").Range("W7:NX" & gLR).Rows
'Init
ReDim Count(UBound(Arr)) 'erzeugt einen leeren Array
'Aufzählen
For Each cell In R.Cells
For i = 0 To UBound(Arr)
Count(i) = Count(i) - (cell.Value = Arr(i)) 'der Boolean "True" = -1, False = 0
Next
Next cell
'Ausgabe vorbereiten (0 bis 10: standard)
For i = 0 To 10
Count(i) = "Modul " & Arr(i) & ": " & Count(i)
Next
'Ausgabe, 11 bis 13 einzeln, da Sonderfälle
Count(11) = "Betr.Erp: " & Count(11)
Count(12) = "--------------"
Count(13) = "Fehltage: " & Count(13)
'Kommentar (tricky: leer hinzufügen oder erzeugen, dann ersezten)
Worksheets("Projektplan").Cells(i, 2).AddComment("").Text Join(Count, vbNewLine)
Next
End Sub


VG
Yal
Anzeige
AW: Leicht abgewanderte Version
25.01.2024 07:53:00
Nordic
Moin Yal,
vorab lieben Dank für Deine Mühe :)
Der Code sieht in jedem Fall richtig gut aus, nur leider funktioniert er nicht so rund.
Beim Öffnen der Datei wir ein Kommentar in Zeile 6 geschrieben und die Werte stehen bei 0.
Wie bei MCO schon angemerkt war es unnötig "f" zu ermitteln. Das hab ich rausgenommen und das Array selbstverständlich angepasst.
Letztlich komme ich zunehmend zu dem Schluss, dass die gewünschten Infos in ein Kommentar zu schreiben nicht gerade die beste Idee war.
Im Grunde sollte es darum gehen für jeden einzelnen TN den Überblick zu behalten wieviel Tage je gewähltem Modul (x in E:O) bereits verplant und wieviel noch zu planen sind.
https://www.herber.de/bbs/user/166402.xlsm
VG, Nordic (Uwe)
Anzeige
AW: Leicht abgewanderte Version
25.01.2024 09:51:04
Yal
Hallo Uwe,

in Zelle E7 kommt die Formel
=ZÄHLENWENN($W7:$NX7;SPALTE(A1))
die nach unter auf jeden Teilnehmer und nach recht bis Spalte O erweitert wird. Mit Zahlenformat kann man die Nullen unterdrücken.

Dafür ist VBA überdimensioniert (nun, für die Kommentar war es ja nicht anders hinzubekommen).

VG
Yal
AW: Leicht abgewanderte Version
28.01.2024 13:00:15
Nordic
Moin Yal,
in der Tat liefert die Formel (fast) genau das was ich zur Übersicht brauche.
Allerdings auf Kosten der "x" Markierungen in den Spalten E:O, die ich benötige, da damit und den Fehlzeiten das voraussichtliche Enddatum berechnet wird.
Dies ist auch daher wichtig, dass zukünftige Anmeldungen in der Tabelle aufgenommen werden um einen Forecast auf die Auslastung in den nächsten Wochen zu haben.
Lässt sich das mit einer User-Form realisieren?
Beispiel für die ideale Ausgabe:

TnName (aus Spalte B$7)
M1: 2/3 (wenn x in Spalte E, Anzahl von "2" in W$7:NX$7, wert aus Ressourcen: E2
...
"P" gehört zu M10, sollte aber extra berechnet werden

Erstmal... Entspannten Sonntag und Gruß, Nordic (Uwe)
Anzeige
AW: Leicht abgewanderte Version
29.01.2024 09:05:37
Yal
Hallo Uwe,

bisher hattest Du als Ergebnis entweder einen "x" oder nichts. Jetzt hast Du einen Zahl oder nichts. Daher sollte deine Folgeprüfung nicht mehr auf dem "x" sondern auf dem "Nichts" setzen.
Wenn (E7>"";...

VG
Yal
AW: Leicht abgewanderte Version
29.01.2024 11:36:58
Nordic
Moin Yal,
so hat jeder seine eigene Herangehensweise.
In erster Line dient das Exceltool der frühzeitigen Planung der jeweils belegten Modulen (auch der zukünftigen Anmeldungen), der Auslastungsvorschau und letztlich auch später Auswertungszecken. Daher möchte ich auf die "x" (steht für gewähltes Modul) nicht verzichten.
VG, Uwe
AW: Leicht abgewanderte Version
29.01.2024 15:00:35
Yal
Hallo Uwe,

Gut. Du möchtest auf etwas nicht verzichten, aber wie lautet dann deine jetzige Frage (weil "Frage noch offen")?
Wenn diese lautet: "gehe bitte nochmal durch die ganze Anwendung durch, herstelle ein vollständige Konzept anhand der Anforderungen, die ich nach un nach verteilt habe, und mache eine schlüssige Realisierung daraus", werde ich leider passen müssen.
Wir können hier und da helfen, aber es ist und bleibt dein Werk.

VG
Yal
Anzeige
AW: Leicht abgewanderte Version
29.01.2024 15:41:55
Nordic
So ganz unrecht hast Du mit Deiner Kritik nicht. Sorry!
Ich wurschtel mich mal durch und schau wie weit ich mit dem nächsten Schritt komme.
Nochmals vielen Dank für den vielfältigen und geduldigen Support von Dir und den anderen Beteiligten.
VG, Uwe
AW: Leicht abgewanderte Version
29.01.2024 18:07:38
Yal
;-) Ich hoffe, mein "Schubser" kommt nicht zu schroff an. Gern antworten wir gezielte Fragen, wenn jemand nicht weiterkommt.

VG
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige