HERBERS Excel-Forum - das Archiv

Thema: Erweitern einer Formel über VBA

Erweitern einer Formel über VBA
Niko
Hallo zusammen,

so langsam stoße ich an meine Grenzen bezüglich Excel und VBA.

Kurze Beschreibung:

Meine Userform2 beinhaltet eine TextBox1 und einen CommandButton1. Über VBA soll nun nach betätigen des Button1 geprüft werden, ob der Eintrag in der TextBox1 in der Tabelle „MAs“ existiert. Wenn ja, soll eine MsgBox mit einem Hinweis ausgegeben werden und wenn nicht, soll der Eintrag hinzugefügt und dazu ein Tabellenblatt mit dem Eintrag aus TextBox1 erstellt werden. Das konnte ich soweit mit folgendem Code lösen:



Private Sub CommandButton1_Click()
Sheets("MAs").Activate
'Schleife zur Prüfung, ob Eintrag bereits existiert
For i = 1 To 100
'Wenn Zellwert ungleich Eingabe, dann durchsuche die nächste Zeile
If Cells(i, 1).Value <> UserForm2.TextBox1.Value Then

Else
'Sofern Zellwert gleich Eingabe gebe eine Meldung aus, dass MA existiert und be-ende die Prozedur
MsgBox ("MA existiert bereits. Bitte in Tabelle MAs prüfen...")
Exit Sub
End If

Next

'Tabellenblatt für neuen MA generieren
Dim NextRow As String
Dim LR As Integer

Sheets("MAs").Activate

'Nächste leere Zeile bestimmen
NextRow = Application.WorksheetFunction. _
CountA(Range("A:A")) + 1

OptionUnknown = True

'Daten aus Eingabemaske übertragen
Cells(NextRow, 1) = UserForm2.TextBox1.Value
Cells(NextRow, 1).Select

letzte = Sheets("MAs").Range("A" & Rows.Count).End(xlUp).Row


'Füge den neu erfassten MA ans Ende der Liste ein und erstelle neues
'Tabellenblatt mit der Bezeichnung des neuen MA.
Dim wksBlattdaten As Worksheet
Dim lngZeile As Long
Dim auslesen As String

Set wksBlattdaten = ThisWorkbook.Sheets("MAs")
lngZeile = 100 'Anzahl der Zeilen die er durchsuchen soll.

While wksBlattdaten.Cells(lngZeile, 1) <> Cells(letzte, ActiveCell.Column).Value
Debug.Print lngZeile
lngZeile = lngZeile - 1
Wend
Set wksBlattdaten = Nothing
Sheets.Add
ActiveSheet.Name = Sheets("MAs").Cells(letzte, ActiveCell.Column).Value
ActiveSheet.Paste
ActiveSheet.Range("A1").Select

Exit Sub

End Sub


Hier benötige ich jetzt eure Hilfe:

InTabelle1 Zelle A1 befindet sich eine Zählenwenns Funktion welche automatisch um Einträge erweitert werden soll. Ich habe z.B. mit dem o.g. Code zwei MAs erstellt den MA_1 und MA_2. In den dazugehörigen Tabellen steht nun in der Zelle B3 der Wert 1 welchen ich in Tabelle1 Zelle A1auslesen und die Summe wiedergeben möchte. Ich habe zu testzwecken manuell folgende Formel eingefügt:

=ZÄHLENWENNS(MA_1!B3;1)+ZÄHLENWENNS(MA_2!B3;1)


Ich erhalte als Wert die Zahl 2 zurück. Was soweit korrekt ist.

Was ich nun möchte ist, dass wenn ein weiteres Tabellenblatt über o.g. Makro hinzugefügt wird die Formel erweitert wird. Sagen wir ich füge das Tabellenblatt MA_3 hinzu, dann soll die Formel in Tabelle1 Zelle A1 wie folgt aussehen:

=ZÄHLENWENNS(MA_1!B3;1)+ZÄHLENWENNS(MA_2!B3;1)+ZÄHLENWENNS(MA_3!B3;1)


An dieser Stelle bin ich echt überfragt und weiß auch nicht, ob das überhaupt mit VBA lösbar ist. Er müsste nach dem ersten MA_1 bereits ein „+“ und die Zählenwenns Funktion einfügen mit der Bezeichnung des neu hinzugefügten MAs (was ich ja manuell gemacht habe). Die neue Bezeichnung könnte er sich über die Text-Box holen, da diese noch geöffnet ist oder über den letzten Eintrag in Spalte A der Tabelle „MAs“. Ich habe die Funktion bewusst Fett markiert, um zu veranschaulichen, was über VBA hinzugefügt werden sollte. Das müsste dann jedes Mal passieren, wenn ein neuer MA hinzukommt.

Vielleicht hat ja jemand eine Idee von euch.

Die Beispieldatei findet ihr hier: https://www.herber.de/bbs/user/168617.xlsm

VG

Niko

AW: Erweitern einer Formel über VBA
schauan
Hallöchen,

Zeichne mal das Hinzufügen eines MA in der ZÄHLENWNN-Formel auf. Ich denke, dann hast Du den erforderlichen Ansatz zur Lösung :-)
AW: Erweitern einer Formel über VBA
Niko
Hallo schauen,

glaub mir seit einer Woche habe ich etliches versucht aber keine Lösung gefunden. Wenn du einen interessanten Ansatz hast, dann her damit.
AW: Erweitern einer Formel über VBA
Onur
Diese Formel reicht:
=SUMME(MA_1:MA_3!B3)
Wenn MA_4 dazukommt, einfach MA_3 durch MA_4 ersetzen.
AW: Erweitern einer Formel über VBA
Niko
Ja korrekt nur das MA_4 nicht von mir händisch in die Zelle ersetzt, sondern durch VBA ermittelt werden soll wer der neue MA ist und daraufhin nicht MA_3 durch MA_4 ersetzen sonder die Formel erweitern, sodass der MA_4 mit berücksichtigt wird. Daniel hat bereits einen guten Ansatz beschrieben. Der müsste noch ans laufen gebracht werden dann hätte ichs.
AW: Erweitern einer Formel über VBA
Daniel
Hi

Nach dem Prinzip:

With Sheets("Tabelle1").Range("A1")

.Formula = .Formula & "+.CountIf('" & Textbox1.Text & "'!B3,1)"
End With


Gruß Daniel
AW: Erweitern einer Formel über VBA
Niko
Hallo Daniel und Danke für deine Antwort. Ja nach diesem Prinzip sollte es laufen. Leider bekomme ich beim Einsatz deines Codes einen Laufzeitfehler 1004 Anwendung- oder Objektdefinierter Fehler. Ich habe versucht das eine oder andere & bzw " zu versetzen, um auszuprobieren, ob ich die Eingabe splitte kann zwischen festen Begriffen und teils Variablen (Textbox1.text). Leider ohne Erfolg.
AW: Erweitern einer Formel über VBA
Onur
Poste mal die Datei - das müsste auch ohne VBA (bzw viel einfacher) gehen.
AW: Erweitern einer Formel über VBA
Piet
Hallo Niko

dein Code ist mords kompliziert, teilwseise doppelt und dreifach, das geht wesentlich einfacher.
Warum in einer UserForm einen neuen MA eingeben? Man kann die bestehende Liste Zeile um Zeile erweitern.
Leider eine alte Excel 2003Datei, das Makro kannst du ins Original kopieren.
https://www.herber.de/bbs/user/168637.xls

Das Sheet MAs habe ich nach vorne verschoben, und kopiere jede neue Tabelle nach hinten, ans Reiter Ende.
Statt eine Ellenlange Formel in Tabelle1 zu entwickeln kannst du doch ZählenWenn in das Sheet MAs übernehmen.
Da kannst du die Formel direkt neben jedem neuen Mitarbeiter eingeben, und ganz oben die Summe ziehen.
Ist das nicht sinnvoller als eine Ellenlange Formel in Tabelle1?

mfg Piet
AW: Erweitern einer Formel über VBA
Onur
Ich befürchte sogar, er mit der Formel nur die Anzahl der Blätter errechnen will....
AW: Erweitern einer Formel über VBA
Niko
Hallo Onur, habe die Datei hier hochgeladen.
https://www.herber.de/bbs/user/168617.xlsm
AW: Erweitern einer Formel über VBA
Onur
Nur zur Klarstellung: Das ganze kann so nur klappen, wenn die Namen der Blätter weiterhin so sind wie in deiner Datei (Also MA_ bis MA_999 usw, und nicht KlausMüller oder so).
AW: Erweitern einer Formel über VBA
Niko
Die Bezeichnung MA_1 ist variabel da ich über die Textbox1 eine Eingabe tätige. Ich kann den nächsten MA_2 nennen kann aber auch was ganz anderes wählen. Was ich in die Textbox1 eingebe wird in das Tabellenblatt "MAs" in die nächste freie Zelle geschrieben und ein neues Tabellenblatt mit diesem Namen bzw. Bezeichnung generiert. Die Formel auf dem Tabellenblatt1 in Zelle A1 muss stetig erweitert werden. Nicht wie es eben beschrieben war durch die neue Eingabe ersetzt werden. Ich möchte nicht bei jedem neu erzeugten Tabellenblatt die Formel händisch anfassen sonder es soll automatisch geschehen. Wenn ich die Formel manuell erweiter klappt natürlich aber das ist nicht das Ziel.
AW: Erweitern einer Formel über VBA
Onur
Meine Frage bzw die Aussage war: "Das ganze kann so nur klappen, wenn die Namen der Blätter weiterhin so sind wie in deiner Datei (Also MA_ bis MA_999 usw, und nicht KlausMüller oder so)." Alles andere ist Mist. Willst du ernsthaft bei 100 Mitarbeitern eine 5 meter lange Formel haben?
Oder wir machen eine UDF (Eigene Excel-Funktion) statt der langen Formel.
AW: Erweitern einer Formel über VBA
schauan
Hallöchen,


1)
https://www.herber.de/forum/archiv/612to616/613828_ZAeHLENWENN_und_3DBezuege.html

oder

2)
Hole die zu verrechnenden Daten auf Dein Blatt MAs und fasse sie dann dort zusammen.

oder
...
AW: Erweitern einer Formel über VBA
Onur
Wozu brauchst du eigentlich die Formel? Nur um zu zählen, wieviel Blätter bzw MA du hast oder noch aus anderen Gründen? WEnn ersteres, das geht anders viel einfacher.
AW: Erweitern einer Formel über VBA
Niko
Guten Morgen Onur,

nein, nicht um zu zählen wieviel MAs ich habe. Der vorgesetzte bat mich zu schauen, ob es möglich ist festzustellen wie viele MAs zu bestimmten Uhrzeiten anwesend sind um bestimmte Prozesse besser steuern zu können. Dafür erstelle ich für jeden MA ein eigenes Tabellenblatt in welchem sich in den Spalten B:NC Datumsangaben befinden und in den Zeilen 3-135 (07:00:00 - 18:00:00 Uhr) die Zeitangaben im 5min Takt. In Tabelle1 wollte ich später einen Jahreskalender erstellen an dem an jedem Tag zu jeder Uhrzeit dargestellt wird wie viele MAs gerade anwesend sind. Theoretisch kann jemand an dem Tag fehlen. Über eine weitere Userform habe ich bereits umgesetzt, dass Fehl,- bzw. Abwesenheitszeiten im ausgewählten MA erfasst werden. Für anwesend steht eine 1 für abwesend eine 0. Und nun kommt die Zählenwenns Funktion auf Tabelle1 zum Einsatz, die ich zunächst nur an einer Uhrzeit austesten wollte. In Tabelle1 A1 wird dann ausgewertet wer von den MA_s um 07:00:00 Uhr da ist.

Ich schließe nicht aus, dass ich mit meinen Kenntnissen zu kompliziert denke und vielleicht sogar völlig falsch begonnen habe weil es einfacher geht :) Es ist nur mein Ansatz wie ich es zu lösen versucht habe.
AW: Erweitern einer Formel über VBA
schauan
Hallöchen,

Der vorgesetzte bat mich zu schauen, ob es möglich ist festzustellen wie viele MAs zu bestimmten Uhrzeiten anwesend sind
... dann brauchst Du doch kein ZÄHLENWENNS sondern es reicht SUMME(Blatt1:Blattx!B3) - also pro Zeiteinheit dann 1x (mal abgesehen davon, ob die vielen Blätter sinnvoll sind). Wenn Du z.B. am Anfang ein bestimmtes Blatt hast, nennen wir es mal "Anfang" und am Ende ein Blatt "Ende" und Du packst alle MA-Blätter dazwischen, brauchst Du an der Formel nie was zu ändern.

AW: Erweitern einer Formel über VBA
Onur
AW: Erweitern einer Formel über VBA
Niko
Hallo schauan,

danke für den Tipp. Mit der Summenformel zwischen den Blättern Anfang und Ende klappts. Ich schaue mal, ob ich es hinbekomme, dass nun jedes neue Blatt zwischen Anfang und Ende generiert wird. Dann sollte es klappen. Mag sein, dass viele Tabellenblätter nicht sinnvoll ist aber ich habe gerade keine andere Lösung. Zum Glück sind wir aber eine kleine Abteilung mit 30 MAs. Von daher ist es noch "relativ überschaubar".
AW: Erweitern einer Formel über VBA
Onur
"es reicht SUMME" ? DAS wurde gestern um 18:31 schon gesagt .......
AW: Erweitern einer Formel über VBA
schauan
Du wolltest die Formel bei jedem neuen Blatt ändern, ich nicht...
AW: Erweitern einer Formel über VBA
Niko
Ja, das wurde um 18:31 schonmal erwähnt aber nur, dass die Formel Summe(MA_1:_MA_3) reicht und wenn MA_4 dazukommt dieser für MA_3 in der Formel ersetzt werden müsste. Des weiteren dürfte sich der Namen MA_1, MA_2 usw. nicht ändern, sonst würde es nicht funktionieren. Das hat aber das Problem nicht wirklich gelöst. Der entscheidende Hinweis kam von schauan und Daniel ein Tabellenblatt Anfang und ein Tabellenblatt Ende zu erstellen ("Dummyblätter") und die Summen zwischen den Blättern Anfang und Ende zu ermitteln. Nun sind beide Probleme gelöst. Zum einen spielt es jetzt keine Rolle wie die Tabellenblätter bezeichnet sind sofern sie zwischen Anfang und Ende stehen und zum anderen werden die richtigen Summen ermittelt. Des weiteren brauche ich so die Formel nicht mehr anfassen. Ich habe das mal in der Testdatei hinzugefügt und hochgeladen:
https://www.herber.de/bbs/user/168657.xlsm

Dir auch nochmal vielen Dank für deine Tipps. Am Ende zählt, dass das Problem gelöst wurde. Egal von wem und egal wie. Ich habe mit Sicherheit nicht die eleganteste Lösung für mein Projekt aber ich bin froh, dass es erstmal funktioniert.

AW: Erweitern einer Formel über VBA
Onur
Ich hatte dir (Heute 14:45:50 Uhr) auch eine Lösung OHNE Dummyblätter gepostet.
AW: Erweitern einer Formel über VBA
daniel
Hi
lege zwei Dummy-Blätter an (Start und Ende) und schreibe die Formel für diese beiden Blätter.
=Summe('Start:Ende'!B3)
in diesen beiden Blättern lässt du B3 natürlich leer (oder schreibst einen Text hinein).
jetzt musst du nur noch schauen, dass neu hinzugefügte Blätter, welche ausgewertet werden müssen, zwischen diesen beiden Dummy-Blättern liegen, das kannst du im Bedarfsfall auch einfach über das Verschieben mit der Maus machen.
Im Code natürlich schon beim Erstellen über den Paramter AFTER:=Sheets("Start") oder BEFORE:=Sheets("Ende").
Weitere Vorteil dieser Methode: wenn ein Mitarbeiter wegfällt, löscht du einfach das Blatt und musst die Formel nicht anpassen.

Gruß Daniel
AW: Erweitern einer Formel über VBA
Niko
Hallo Daniel, Hallo schauan,

ja jetzt habe ich es genau so gelöst. Die "Dummyblätter" habe ich einfach ausgeblendet. Das funktioniert jetzt wunderbar.

Ich möchte mich hiermit bei allen bedanken die mir ihren Input zur Verfügung gestellt haben, um das Problem zu lösen.