Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1628to1632
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

VBA Codierung drei Probleme

VBA Codierung drei Probleme
19.06.2018 21:08:52
Markus
Guten Abend zusammen,
ich habe erstmal 2-3 Baustellen, an denen ich mir mit meinem geringen VBA Kenntnissen leider schon die Zähne ausbeiße.
Und zwar folgendes, wie Ihr in meiner Tabelle erkennen könnt, hat diese Für mehrere Bereiche Userforms und ausgenommen jetzt von der Userform1_1 (Tagesstatistik).
1. Die Combobox habe ich derzeit über RowSource (Tabelle1!A1:A31) im Eigenschaftenfenster laufen, hätte allerdings gerne eine elegantere Lösung, dass das aktuelle Datum drin steht und ein Monat vor oder zurück auswählbar ist.
2. Wünsche ich mir die blauen Textboxen als Summenfelder, welche sofort beim Eintrag in die vorderen Textboxen, diese zusammen gezählt werden.
3. Sollen beim klick auf den Commandbutton (Übertragen) alle (Datum und Textboxen) Werte in das Tabellenblatt Poststelle übertragen, am besten mit einer Sicherheitsabfrage oder Messagebox vorher.
Sollten erneut Einträge getätigt werden, sollten diese dann unter dem neuen Datum sich drunter anschließen.
an Problem 1 und 2 sitze ich schon den ganzen Tag.
Evtl. gibt es hier jmd. der mir helfen mag und kann.
Im Voraus schon einmal vielen Dank
https://www.herber.de/bbs/user/122190.xlsm

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

Betreff
Datum
Anwender
Anzeige
Zu 1, Teillösung
21.06.2018 09:55:24
MCO
Guten Morgen!
Hier die Füllung der Combobox mit Datum:
Du mußt Rowsource aber rausnehmen!
Private Sub UserForm_Initialize()
first_date = CDate(WorksheetFunction.EoMonth(Date, -1) + 1)
For i = 0 To Format(WorksheetFunction.EoMonth(Date, 0), "dd") - 1
ComboBox1.AddItem first_date + i
Debug.Print first_date + i
Next i
ComboBox1.ListIndex = 0
End Sub
Für andere Monate mußt du ein umschaltfeld einfügen, dass die Variable Date vorgibt und diesen Code erneut laufen lässt.
Gruß, MCO
AW: Zu 1, Teillösung
21.06.2018 17:38:36
pops.Brownski
Hallo MCO,
vielen Dank, hat super funktioniert!
Jetzt muss ich nur mal schauen, wie ich das mit dem Monat hinbekomme. ;-)
Ich denke meine Probleme 2 und 3 werde ich separate Beiträge für eröffnen.
Danke noch einmal
Anzeige
AW: VBA Codierung drei Probleme
21.06.2018 17:44:01
fcs
Hallo Markus,
ich hab mir deine Datei/Userformen mal angesehen.
Ich hab auch schon für deine 3 Probleme Lösungsansätze.
1. Combobox
Auswahlliste im Makro generieren oder in Tabelle1 per Formel in 92 Zeilen die Datumswerte für den vorherigen, aktuellen oder nächsten Monat berechnen und die Row-Source anpassen.
2.Summenfelder (blau)
Damit die Summen automatisch bei jeder Textbox-Änderung aktualisiert werden muss für jede Einzelwert-Box ein Change-Ereignismakro angelegt werden, das dann die Summe der Textboxen berechnet und in die Summenbox einträgt.
Bei großen Anzahl an Textboxen erfordert das eine Menge an Code. Da Prüfe ich noch, ob man hier durch Verwendung von sog. Klassen-Modulen eine Reduzierung von Programmierauf erreicht.
3. Werte aus Formular in Tabellenblatt übertragen
hier muss man in dem Makro das die Werte einträgt als erstes die nächste frei Zeile im Tabellenblatt ermitteln, das ist ein Einzeiler im Code.
Und dann kann man über z.B.
Cells(Zeile, Spalte)=TextboxXYTZ.Value
Die Werte eintragen, ggf. zusätzlich noch mit Zahlen-Umwandlung per CLng oder CDbl.
Bei optimalen Namen für die Textboxen (Nr der Textbox identisch mit Spalten-Nr im Blatt oder zumindest fortlaufender Nr und in der Reihenfolge wie die Spalten auf dem Blatt) könnte man mit For-Next-Schleifen arbeiten, um die Werte einzutragen und müsste nicht für jede Box eine eigene Code-Zeile schreiben.
Du hast aber eine Große Anzahl an Userformen und Textboxen geplant und ich bin mir nicht sicher ob es da am Ende Probleme mit der Größe des VBA-Projektes.
Ein paar Fragen hab ich aber schon zum Blatt Poststelle und Userform1_1 :
1. Datumsformat in Spalte A und anderen Datums-Spalten
Im Blatt "Poststelle" schaffe ich es nicht in Spalte A ein Datum zur Anzeige zu bringen.
Weder per Eintrag über das Userform noch bei manueller Eingabe - Es wird immer der Zahlenwert des Datums angezeigt. Hast du da irgendetws besonderes eingerichtet?
Sogar wenn in der Spalte alles Lösche und die Spalte als "Datum-kurz" formatiere funktioniert es nicht.
Nur wenn das Datum als Text eintrage mit vorangestellt Hochkomma-sieht es wie ein Datum aus.
2. Du verwendest Frames um Blöcke von Textfeldern/Schaltflächen ein-/auszublenden.
Hier ist es geschickter mit Multipage-Object zu arbeiten und für jeden Frame eine Seite im Multipage anzulegen. Das vereinfacht etwas die Programm, ist aber wesentlich übersichtlicher wenn man das Userform gestaltet.
3. Willst du mit dem Userform nur Daten eingeben und ins Tabellenblatt schreiben?
Oder musst du auch Daten einlesen könne, die du schon im Tabellenblatt stehen hast?
4.Gibt es am Ende im Tabelenblatt je Datum eine durchgehende Zeile über alle Unterpositionen?
Oder wechselt das für die einzelnen Unterpositionen?
Gruß
Franz
Anzeige
AW: VBA Codierung drei Probleme
21.06.2018 18:39:31
pops.Brownski
Hallo fcs,
ja, da ich leider was VBA anbelangt an ganz schöner Grünschnabel bin, sieht es dementsprechend auch Chaotisch aus. Sorry
Ich erkläre mal kurz mein Gedanken hinter den ganzen Userformen:
Also die einzelnen Bereiche sollen über eine eigene UF Ihre Werte melden.
Auf den unterschiedlichen Blättern werden die Werte gesammelt.
Steuerung benötigt nur eine Handvoll Daten.
Übersicht, soll eine Übersicht über die gesamten Eingaben vom Tag geben.
Monitoring wird nur ein Pfad Verlinkung.
Daten Löschen, ist dafür gedacht, die Werte die eingetragen wurden, als Kopie abzulegen und den alten Datensatz dann zu entfernen/löschen.
Anbei setze ich meine Überarbeitete Datei ein, hier ist jetzt einiges an UF entfernt und einige neue Codes hinzugekommen.
Wahrscheinlich für ein Fachmann der absolute Codierungs- Horror :-D
Zu deinen Fragen,
1. Ich habe eine komplett neu Tabelle angefangen und hatte lediglich Codes die die korrekte Formatierung möglich machten. Durch den Tip oben von MCS, bin ich hier aber nun ein Stück weiter.
2. Der Tip mit den Multipage Objecten werde ich morgen mal ausprobieren, einfach und übersichtlicher ist immer besser!
3. Übertragen und auch abfragen, sowohl als auch. Ich möchte für Abfragen aber dann die Userform "UF_Suchen" nutzen.
4. Verstehe nicht ganz was gemeint ist, meinst du eine kompakte Form von allen Eingaben?
https://www.herber.de/bbs/user/122236.xlsm
Anzeige
AW: VBA Codierung drei Probleme
22.06.2018 15:04:38
fcs
Hallo Markus,
ich hab meine Lösungsansätze gestern Abend mal in deine neue Datei eingebaut.
Die Combobox-Auswahlliste hab ich so eingerichtet, dass Datumswerte des vorhergenden, aktuellen und folgenden Monats ausgewählt werden können.
Die automatische Summenbildung im Userform hab ich noch nicht ganz abgeschlossen. Ist halt immer eine Sucherei, bis man alle Textboxen zusammen hat die in der jeweiligen Summenbox zusammengezählt werden sollen.
Zur Auswahl des Bereichs, dessen Textboxen Angezeigt werden ollen hab ich jetzt Optionbuttens statt Checkboxen genommen. Dann muss man nicht bei Programierung die jeweils anderen Chechboxen auf falls setzen.
Das Verschieben der Steuerelemente aus den Rahmen in Seiten einer Multipage hab ich auch umgesetzt.
Ich werde heute Abend die restlichen Summenberechnungen in Userform1_1 und Userform1_2 umsetzen.
Evtl. auch ncoh die Vereinfachung mit Klassen für die Textboxen prüfen.
Hinweis:
Beim Übertragen der Werte in die Tabelle funktioniert CDec nicht wenn die Textbox leer ist oder keine Zahl enthält. Hier muss man sich in einem allgemeinen Modul eine kleine Function oder Sub schreiben, die Inhalt der Textbox prüft. Außerdem muss festgelegt werden, ob bei leerer Textbox ein Leerstring oder 0 ins Blatt geschrieben wird oder der Zellinhalt gelöscht werden soll.
Suche nach Datensätzen:
Es hängt davon ab nach was man suchen will und wie das Suchergebnis dargestllt werden soll ob ein komplett neues Userform für die Suche erstellt werden muss oder ob ma das gleiche Userform fü Suche und Eingabe verwendet. In deinem Fall wird wahrscheinlich nach dem Datensatz eines Datums gesucht werden - Diese Suche integriert man besser in das Eingabe-Formular um alle Daten anzuzeigen.
Gruß
Franz
Anzeige
AW: VBA Codierung drei Probleme
22.06.2018 16:33:25
pops.Brownski
Hallo Franz,
ja das mit den Cdec habe ich dann heute auch mal schmerzlich feststellen müssen. :-D
Deinen Tipp mit den Multipage habe ich heute mal eingebaut und funktioniert einwandfrei! Danke
Der User(auch Management) soll die Möglichkeit haben , Werte nach Datum und Bereich zu ermitteln oder zu suchen. Daher meine Idee mit der eigenen Userform.
Leider kenne ich mich mit den Funktionen Modul und Klasse noch gar nicht aus, ich habe schon einige Dateien gesehen aber das ist dann auch das höchste der Gefühle.
Bin seit zwei Wochen erst mit VBA beschäftigt und hier fehlt mir bei vielem noch ein zusammenhang.
Ich danke dir vielmals für die Unterstützung!
Ich habe heute ein weiteres Problem festgestellt, und zwar, bei der Poststelle hat das mit dem Übertragen in die nächste freie Zeile wunderbar geklappt, nun ist der gleiche Code in der Arbeitsvorbereitung und hier wird die gleiche Zeile immer wieder überschrieben.
Evtl hast du eine Ahnung woran das liegen kann?

Private Sub CommandButton1_Click()
Dim zeile As Long
zeile = Cells(Rows.Count, "A").End(xlUp).Row + 1
If zeile 
Gibt es hier evtl auch einen Code der eine Prüfung durchführt (evtl auch Addieren) wenn zwei Einträge mit selben Datum getätigt werden?
Mit dankbarem Gruß
Markus
Anzeige
AW: VBA Codierung drei Probleme-Userform
24.06.2018 17:51:56
fcs
Hallo Markus,
hier deine Datei mit allen Anpassungen in den Userformen.
https://www.herber.de/bbs/user/122278.xlsm
Die eingebauten Anpassung hab im Blatt "MASKE" in Textboxen eingetragen
ja das mit den Cdec habe ich dann heute auch mal schmerzlich feststellen müssen. :-D
Das kann man mit einem Makro steuern, das den Inhalt des Steuerelements(z.B. Textbox ) prüft und in die gewünschte Zelle einträgt - siehe hochgeladene Datei bzw. Beispiel unten.
Leider kenne ich mich mit den Funktionen Modul und Klasse noch gar nicht aus, ich habe schon einige Dateien gesehen aber das ist dann auch das höchste der Gefühle.

Ich arbeite da auch nicht täglich mit, aber bei riesigen Mengen an ähnlichen Steuerelementen, kann man schon einiges an Code einsparen und ich prüfe nochmals in deiner Datei was möglich ist.
Ich habe heute ein weiteres Problem festgestellt, und zwar, bei der Poststelle hat das mit dem Übertragen in die nächste freie Zeile wunderbar geklappt, nun ist der gleiche Code in der Arbeitsvorbereitung und hier wird die gleiche Zeile immer wieder überschrieben.
Evtl hast du eine Ahnung woran das liegen kann?

Bei dir wird die Zeile im aktiven Tabellenblatt ermittelt, wenn dies nicht das Blatt "Arbeitsvorbereitung" ist hast du ein Problem. Du musst dieses Blatt aktivieren oder mit einem Wit-Konstrukt arbeiten - siehe unten
Gibt es hier evtl auch einen Code der eine Prüfung durchführt (evtl auch Addieren)wenn zwei Einträge mit selben Datum getätigt werden?
Vor dem Eintragen prüfen, ob Datum in Spalte schon vorhanden ist - siehe Beispiel in deiner Datei.
Entsprechend dann den A
weiteren Ablauf im Makro steuern.
Gruß
Franz
Private Sub CommandButton1_Click()
Dim zeile As Long
'Prüfung der Eingabe-Werte
If fncPruefung = False Then Exit Sub
'Werte in Tabellenblatt eintragen
With ThisWorkbook.Sheets("Arbeitsvorbereitung")
zeile = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
If zeile  -1 Then
msgText = msgText & vbLf & "Bitte einen Eintrag in der Combox auswählen"
End If
If Textbox1 = "" Then
msgText = msgText & vbLf & "Textbox1 ist nicht ausgefüllt"
ElseIf Not IsNumeric(Textbox1.Value) Then
msgText = msgText & vbLf & "Wert in Textbox1 muss eine Zahl sein"
End If
If Textbox2 = "" Then
msgText = msgText & vbLf & "Textbox2 ist nicht ausgefüllt"
ElseIf Not IsNumeric(Textbox2.Value) Then
msgText = msgText & vbLf & "Wert in Textbox2 muss eine Zahl sein"
End If
If Textbox3 = "" Then
msgText = msgText & vbLf & "Textbox3 ist nicht ausgefüllt"
ElseIf Not IsNumeric(Textbox3.Value) Then
msgText = msgText & vbLf & "Wert in Textbox3 muss eine Zahl sein"
End If
fncPruefung = msgText = ""
If msgText  "" Then
fncPruefung = False
MsgBox "Fehlerhafte Eingaben" & msgText, _
vbOKOnly, "Prüfung Eingabe-Werte"
Else
fncPruefung = True
End If
End Function
'Funktionen zum Eintragen von Textwerten in Zellen
Function fncCDec(Zelle As Range, strWert As String, _
Optional optLeer As String = "Loeschen", _
Optional optText As String = "Fehler", _
Optional Meldung As String = "", _
Optional Fehlerwert) As Boolean
'Zahlenwert aus Textbox in Zelle eintragen
fncCDec = True
If strWert = "" Then
Select Case optLeer
Case "Loeschen"
Zelle.ClearContents
Case "0"
Zelle.Value = 0
Case ""
Zelle.Value = ""
End Select
ElseIf IsNumeric(strWert) Then
Zelle.Value = CDec(strWert)
Else
'strWert is keine Zahl
Select Case optText
Case "Text"
Zelle.Value = strWert
Case ""
Zelle.Value = ""
Case "Fehler"
If Meldung = "" Then
Meldung = "in Zelle """ & Zelle.Address(False, False, xlA1) _
& """ einzutragender Wert ist keine Zahl!"
End If
MsgBox Meldung, vbOKOnly, "Eingabe-Prüfung Wert"
fncCDec = False
If Not IsMissing(Fehlerwert)  "" Then Zelle.Value = Fehlerwert
End Select
End If
End Function
Function fncDatum(Zelle As Range, strWert As String, _
Optional optLeer As String = "Loeschen", _
Optional optText As String = "Fehler", _
Optional Meldung As String = "", _
Optional Fehlerwert) As Boolean
'Datumwert aus Textbox in Zelle eintragen
fncDatum = True
If strWert = "" Then
Select Case optLeer
Case "Loeschen"
Zelle.ClearContents
Case ""
Zelle.Value = ""
End Select
ElseIf IsDate(strWert) Then
Zelle.Value = CDate(strWert)
Else
'strWert is kein Datum
Select Case optText
Case "Text"
Zelle.Value = "'" & strWert
Case ""
Zelle.Value = ""
Case "Fehler"
If Meldung = "" Then
Meldung = "in Zelle """ & Zelle.Address(False, False, xlA1) _
& """ einzutragender Wert ist kein Datum!"
End If
MsgBox Meldung, vbOKOnly, "Eingabe-Prüfung Wert"
fncDatum = False
If Not IsMissing(Fehlerwert)  "" Then Zelle.Value = Fehlerwert
End Select
End If
End Function
Function fncText(Zelle As Range, strWert As String, _
Optional optLeer As String = "Loeschen") As Boolean
'Text aus Textbox in Zelle eintragen
fncText = True
If strWert = "" Then
Select Case optLeer
Case "Loeschen"
Zelle.ClearContents
Case ""
Zelle.Value = ""
End Select
ElseIf IsNumeric(strWert) Then
Zelle.Value = "'" & strWert
Else
Zelle = strWert
End If
End Function

Anzeige
AW: VBA Codierung drei Probleme-Userform
24.06.2018 19:30:48
pops.Brownski
Hallo Franz,
was soll ich dazu sagen? Das ist Wahnsinn und weit mehr als ich in den letzten zwei Wochen zusammen bekommen habe. :-D
Ich habe mir deine Version noch nicht komplett angeschaut aber ich bin jetzt schon vollkommen begeistert!
Also meine Problemchen hast du 1000%ig gelöst, vielen Dank dafür und toll das es hier solches Fachwissen gibt!
Ich habe auch schon ein paar weitere gefunden, allerdings werde ich hier erstmal selbst versuchen klar zu kommen, kann ja schlecht eine komplette Tabelle von anderen aufbauen lassen. ;-)
Tausend Dank nochmal und einen schönen Sonntag Abend.
Gruß Markus
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige