Hallo,
ich habe ein Problem und wollte erstmal wissen ob es überhaupt lösbar ist.
Ich habe 1 Projektplan und möchte dafür eine Eingabemaske mit VBA generieren.
Eine simple Maske - kein Thema, das die Maske bei der Übernahme in der Tabelle auf die 1. freie Zeile schreibt - auch kein Problem.
Nun möchte ich aber nicht für jede Zeile, die ich schreiben möchte, die Maske öffnen.
Die Maske so groß gestallten das ich alles in einen Fenster eintragen kann. Bekommt Excel das dann aber hin, alles geordnet und sauber untereinander in die Tabelle zu schreiben, da es ja mehrere Zeilen gleichzeitig beschreibt? Oder herscht dann „stau“ auf der 1. freien Zeile, weil die Maske dort alles schreiben will?
Ich baue eine kleine Maske wo ich jede Zeile einzeln eintrage und mit einem „weiter“ button in eine nächste Maske springen kann für zeile2, usw + einen Button „übernehmen“ um es dann in die Tabell zu schreiben.
Was wäre die besser Lösung, bzw. welche würde funktionieren.
Mir persönlich wäre Lösung 1 lieber.
PS: Ich beschäftige mich erst seit kurzem mit VBA. Daher bitte ich um nachsicht wenn ich eine Sache nicht gleich verstehe.
Hallo,
so wie ich sehe hast du ein Problem in MS Excel. Ich bin mehr auf MS Accesss fokusiert. Das Wording ist auch bei Excel etwas anderst. Besser wäre es wenn du ein Experte in MS Excel suchst, der hat vielleicht auch ein leichteren Ansatz zu deinem Problem.
VG
Was ist für Dich eine „simple Maske“?
Wenn Du mit einer normalen Userform arbeitest, kannst Du natürlich Variante 1 hinbekommen. Die Userform gestaltest Du mit den zur Verfügung stehenden Elementen wie z.B Textbox etc. Dann erstellst Du eine Befehlsschaltfläche mit der Du den "Private Sub CommandButton1_Click() "-Code startest. In diesen Code kannst Du nun alles programmieren, was Du möchtest. Also, die suche nach der nächsten freien Zelle (z.B: FreiesFeld = Range(„A1048576“).End(xlUp).Offset(1, 0).Row) und dann welchen Text er wohin übertragen soll (z.B. Cells(FreiesFeld, 1) = TextBox1.Text).
Ich hoffe, Dir hilft das schonmal.
Jepp, das ist eine einfache Maske für mich. Da ich in der Maske ja eigentlich mehrere Einträge schreibe die dann in der Tabelle untereinander stehen müssen,kommt dann das excel durcheinander wenn ich nur sage:Beim übernehmen schreibe in die nächste freie Zeile?
Die Werte werden ja theoretisch alle gleichzeitig in die Tabelle geschrieben bei dem Klick auf den Übernehmen Button.Oder habe ich da einen Denkfehler drin?
Es stellen sich einige Fragen:
Tabelle klingt nach Excel, ist das richtig?
Wo landen die Daten? In einer Mappe, in einer Tabelle?
Für wie viele Personen soll das sein?
Werden die Personen nacheinander aufgerufen und die Felder gefüllt (1 dann 2, dann 3) oder kann es auch durcheinander vorkommen (1, dann 4, dann 2, dann 3…)?
Kommt es vor, dass eine Person im lfd. Zeitraum keine Daten eingibt?
Wo bleibt der nächste Zeitraum (weitere Tabelle oder unten anhängen)?
Definiere Augabe (Zahl, Währung, Text,…)
Person1 ist sicher ein Dummy, hinter dem sich ein Name versteckt, ist das so?
Wo werden die Personen gepflegt?
Wie wird anschließend ausgewertet (nach Personen, nach Augabe oder nach Zeitraum sortiert)?
Da gehe ich dann mal vom Denkfehler aus
Excel und VBA machen nur das, was Du in den Code reinschreibst. Also, dass von selbst irgendwas in irgendeine freie Zelle geschrieben wird ist mir neu. Beim Klick auf Deinen Übernehmen-Button wird also Programmschritt für Programmschritt abgearbeitet. Wenn Du das testen willst, setze Dir einen Haltepunkt und gehe dann mit F8 Schritt für Schritt weiter.
Hier mal Beispielcode (zum Verständnis) für eine Userform mit einer Befehlsschaltfläche und einer Textbox.
Den Code gibst Du ein, indem Du im VBA-Editor doppelt auf die Befehlsschaltfläche klickst.
Private Sub CommandButton1\_Click()
UserForm1.Hide
FreiesFeld = Range("A1048576").End(xlUp).Offset(1, 0).Row
Cells(FreiesFeld, 1) = TextBox1.Text
For i = 1 To 5
Range("A1048576").End(xlUp).Offset(1, 0).Select
ActiveCell.Value = i
Next
End Sub
das klassische Herangehen ist in der Tat Variante 2. In Access lässt sich das zum beispiel vollständig mit den Assistenten generieren. Im 1. Formular, dem Hauptformular wird ein weiteres Formular in den Detailbereich erstellt. dies ist das Unterformular, welches die einzelnen Datensätze anzeigt. Lediglich das verknüpfende Element wird mitgeteilt.
Excel klingt richtig. Die Daten landen in einer Tabelle. Die anderen Fragen sind glaube ich zu kompliziert gedacht. Der einzige der einträgt bin ich bzw ein Kollege. Die Personen zu den Aufgaben werden manuell in die Maske geschrieben, Der Zeitraum wird in der Maske mit Start und Enddatum eingegeben. Als Ausgabe brauche ich Zahlen, Text und Datum.
Soweit das ich Personen pflege, wollte ich eigentlich nicht gehen. Eine Auswertung gibt es in dem Sinn nicht, da man vlt. auch to-do liste sagen könnte. Also welche person macht wann was.
Ich kenn mich damit zu wenig aus, ob es das in excel auch gibt. Aber ich werde wohl doch variante 1 probieren, da ich da alle Daten zu einem Projekt auf einen Blick habe und z.B. den Datumsabgleich zwischen Aufgabe 1 und 2 besser sehe.
ok, ich werde mal meine variante 1 probieren. schaun wir mal ob ich es hin bekomme.
Wenn die Maske steht und es noch ein paar probleme mit der programmierung gibt würde ich gern auf dich zurück kommen, denn da schau ich noch wie ein schwein ins uhrwerk .
ich kann ihnen leider nicht folgen. mir ist in ihrer Beschreibung nicht klar was in der eingabemaske stehen soll und was es da mit der ersten freie zelle zu schaffen hat.
Ok, Problem 1 ist da und das am Anfang. Hab 5 Textfelder + 1 buttom zum übernehmen. Nun hab ich folgenden Code um den Inhalt der Textfelder in die 1. freie Zeile des aktiven Tabellenblattes zu übernehmen:
Private Sub cmdeingabe_Click()
'Übernimmt Werte und schließt das Formular Projekte
Aus irgendeinen Grund kommt für: intErsteLeereZeile = ActiveSheet.Cells(Rows.Count, 1).End(x1Up).Row + 1 schon ein Laufzeitfehler. Woran könnte das liegen? Ist eigentlich 1:1 aus einem anderen Excel übernommen und da lief es.
Ich bin mir eben nicht sicher, was du mit „Maske“ meinst, aber hier meine kurze Meinung zu deinen beiden Ideen:
Mittels eines Userforms kannst du eine „Maske“ einblenden, in der du verschiedene Eingabefelder kreieren kannst. Die Größe kannst du selbst bestimmen und über die Namen der Felder kannst du jeden Inhalt einzeln auslesen, verarbeiten und dann eintragen, woimmer du es möchtest.
Du könntest auch einfach eine Inputbox nutzen und diese dann x-Mal nacheinander aufrufen. Nach dem Eintragen in die Inputbox kann der eingetragene Inhalt in deine Tabelle eingegeben werden und die nächste inputbox aufgerufen werden. Alternativ ginge das auch über 5 Userforms - was aber meiner Meinung nach zu aufwändig und übertrieben wäre.
Userforms haben den Vorteil, dass du Texte als Textfeld hinzufügen kannst, während eine Inputbox lediglich aus einem Text und einem Eingabebereich besteht - variabler wäre die Inputbox.
Soweit erstmal - ich empfehle eher die Variante mit der Userform, auch wenn das Einrichten etwas komplizierter ist (allerdings kannst du hier übersichtlich jede einzelne Abfrage eingeben lassen). Wenn es schnell gehen soll, dann nimm besser die Inputboxen.
Ich stelle dir hier eine nicht ganz perfekte Lösung vor. Perfekte Lösungen sind zu lang für dieses Board.
Meine Einfüll-Felder im Userform sind Textboxes mit folgenden Bezeichnungen:
Das müsstest Du jeweils anpassen. (TB_ von Textbox und CB_ von CommandButton)
Und in der Tabelle muss Zeile 1 mit den Überschriften gefüllt sein
Hier nun der Code:
Private Sub CB\_Speichern\_Click()
Dim NoSave As Boolean
Dim LastRow As Long
'Leere Eintragung verhindern
If TB\_Aufgabe = "" Then NoSave = True
If TB\_Mitarbeiter = "" Then NoSave = True
If TB\_Zeitraum = "" Then NoSave = True
If NoSave = False Then
'erste freie Zeile feststellen
LastRow = Range("A:A").SpecialCells(xlCellTypeBlanks).Row
'füllen der Zellen
Cells(LastRow, 1) = TB\_Aufgabe.Text
Cells(LastRow, 2) = TB\_Mitarbeiter.Text
Cells(LastRow, 3) = TB\_Zeitraum.Text
'Leeren der Textfelder nach speichern,, um Doppel zu verhindern
TB\_Aufgabe = ""
TB\_Mitarbeiter = ""
TB\_Zeitraum = ""
Else
MsgBox "Es müssen alle Felder ausgefüült werden!"
End If
End Sub
Private Sub CB\_Verwerfen\_Click()
TB\_Aufgabe = ""
TB\_Mitarbeiter = ""
TB\_Zeitraum = ""
End Sub
Gestartet wird das Formular entweder beim Öffnen des Blattes oder mit Makro:
Sub auto\_Open()
UserForm1.Show
End Sub
Sub FormularStarten()
UserForm1.Show
End Sub
Beide Sub stehen in einem Modul zur Mappe (da landen auch aufgezeichnete Makros)
also ich sehe kein grundsätzliches Problem alles direkt in die Maske einzugeben und dann automatisiert in die Mappe tragen zu lassen.
Du kannst ja beliebig die Felder Zeilen dynamisch vorgeben.
Bsp
Du gibt’s die GrundDaten ein und weißt welche Zeile das ist.
Dann könntest du die Detaildaten ja in die entsprechenden folgenden Zeilen eintragen lassen…