VBA Ablauf Userform1 und Datenmaske

ich habe folgendes problem in excel:

ich möchte gerne die userform1 laden wenn ich oben auf „Datenmaske“ klicke, nach der Auswahl des Arbeitsblattes resp. nach drücken von OK sollte man direkt zur Datenmase des jeweiligen Blattes kommen.
Und nach Eingabe der Daten und anschliessendem drücken auf „Schliessen“ sollte wiederum die Userform1 geladen werden…

Für Eure Hilfe wäre ich sehr dankbar…

Liebe Grüsse Sascha

File: http://www.file-upload.net/download-3719910/Dispo_Te…

Hallo Sascha,

ich möchte gerne die userform1 laden wenn ich oben auf
„Datenmaske“ klicke, nach der Auswahl des Arbeitsblattes resp.
nach drücken von OK sollte man direkt zur Datenmase des
jeweiligen Blattes kommen.

das geht so, Code im Modul der UF:

Sub CommandButton1_Click()
’ Ok
Unload UserForm1
Sheets(ComboBox1.Value).Activate
Sheets(ComboBox1.Value).ShowDataForm
End Sub

Und nach Eingabe der Daten und anschliessendem drücken auf
„Schliessen“ sollte wiederum die Userform1 geladen werden…

Da ist das Problem. Vba kriegt davon nix mit wenn du da auf Schließen klickst.

Vba für Excel kennt sogenannte Ereignsicodes auf die es automatisch reagiert.
Ein Ereignis ist die manuelle Änderung eines Zellinhaltes, oder das Hüpfen auf eine andere zelle.
Aber ich hab grad getestet, nichtmal Zelländerungen kriegt Vba mit die durch die Datenmaske machst.

Sorry, außer da diese datenmaske durch ein selbst geschriebene UF zu ersetzen sehe ich keine Möglichkeit.

Gruß
Reinhard

http://www.file-upload.net/download-3719910/Dispo_Te…

ok. vielen dank für die antwort…

ist es denn möglich die optionen der datenmaske, sprich suchen(kriterien) nächster datensatz, vorhergehender datensatz usw. ausser löschen zu übernehmen in einer userform?

denn in der datenmaske kann ich einen datensatz suchen und ihn auch editieren.
kann man das auch mit einer userform erreichen?

Hallo Sascha,

ist es denn möglich die optionen der datenmaske, sprich
suchen(kriterien) nächster datensatz, vorhergehender datensatz
usw. ausser löschen zu übernehmen in einer userform?

nein. Prinzipiell ist das was du siehst wenn du da in Excel auf Datenmaske klickst eine UF, aber es ist keine auf deren Aufbau du zugreifen kannst.

Du mußt dir da deine UF völlig neu selbst basteln so daß da die gleichen Elemente oder mehr oder weniger wie im Original sind.
Dann hast du das nur optisch gelöst.
Danach mußt du da noch einzelnen Elementen noch Code zuweisen damit sich da was tut wenn du in der UF z.B. auf den CommandButton „Schließen“ klickst.

Also, bastel da diese Maske nach mit/in einer UF.
Versuch zu kodieren was du hinkriegst.
Dazu dann eine Tabelle mit Daten, so wie du sie schon hast aber bite mal mit so Datenzeilen damit man gut testen kann.

Wenn’s dann hängt dann lad die mappe hoch und sage wo es hängt.

denn in der datenmaske kann ich einen datensatz suchen und ihn
auch editieren.
kann man das auch mit einer userform erreichen?

Natürlich, die Datenmaske ist quasi eine UF aber leider hat man keinen Einfluß darauf was geschieht wenn man da auf „Schliessen“ klickt.
In einer eigen UF ist das anders, da legst du fest was dann geschieht.
Festplatte formatieren o.ä. :smile:)

Gruß
Reinhard

Hallo Reinhard,

Ich habe nun mal eine Userform gezeichnet.
Wie schon gesagt, habe ich keine Ahnung wie man das ganze verknüpfen kann. In meiner Datei funktioniert es so gut. ich lade zuesrt die userform1, nach auswahl die dataform.
neu sollte es nach auswahl die userform2 laden. diese sollte bei den labels wie die datenmaske automatisch die zellüberschriften übernehmen und auch wie in der datenmaske die datensätze suchen und ändern, nächster datensatz, letzter datensatz, neuer datensatz uns schliessen beinhalten.

kannst du mir dabei helfen?

http://www.file-upload.net/download-3724697/Milch_Di…

lg sascha

Wie schon gesagt, habe ich keine Ahnung wie man das ganze
verknüpfen kann. In meiner Datei funktioniert es so gut. ich
lade zuesrt die userform1, nach auswahl die dataform.
neu sollte es nach auswahl die userform2 laden. diese sollte
bei den labels wie die datenmaske automatisch die
zellüberschriften übernehmen und auch wie in der datenmaske
die datensätze suchen und ändern, nächster datensatz, letzter
datensatz, neuer datensatz uns schliessen beinhalten.

kannst du mir dabei helfen?

http://www.file-upload.net/download-3724697/Milch_Di…

Hallo Sascha,

damit daß stabil läuft mußt du hier:

Sub CommandButton1_Click()
if check(Me.ComboBox1.Value) = false then
msgbox „falsche Auswahl“
exit sub
end if
Sheets(Me.ComboBox1.ListIndex + 1).Activate
Unload Me
UserForm1.Show
End Sub

In einem Standardmodul, z.B. Modul1:

function check(byval strText as string) as boolean
’ Überprüfung aller Blätter, wenn eines strText heißt dann check auf True setzen
end function

abprüfen ob es das Blatt auch gibt bevor due s aktivieren willst.
Wenn einer auf Ok klickt ohne was gewählt zu haben kommt Fehler, wie auch wenn er in die Combobox was manuell eingibt.
Funktion Check ist dazu ein Ansatz.

Die Codes für UF1 schaue ich nachher mal, muß jetzt weg.

Gruß
Reinhard

Nachtrag
Hallo Sascha,

ich hab da UF2 mit UF1 verwechselt im Code :smile:
Damit sowas nicht geschieht, markiere links UF1, dann F4 und vergib einen anderen Namen, zB:
UFAuswahl
dafür, für die andere auch also UFDatenerfassung o.ä.
In Codes dann auch diese Namen benutzen.

Gruß
Reinhard

Hallo Reinhard,
Habe es so gemacht… aber nun kommt immer die Fehlermeldung… auch wenn ich ein Tabellenblatt auswähle…?

http://www.file-upload.net/download-3725064/Milch_Di…

Sascha

Habe es so gemacht… aber nun kommt immer die
Fehlermeldung… auch wenn ich ein Tabellenblatt auswähle…?

http://www.file-upload.net/download-3725064/Milch_Di…

Hallo Sascha,

ist klar, eine Funktion die hinten als Boolean definiert ist beim Rückgabewert die liefert immer False.
Du mußt das:
’ Überprüfung aller Blätter, wenn eines strText heißt dann check auf True setzen
in der Funktion in Code umsetzen.

Kriegste das alleine hin? Man kann das verschieden angehen, probiere mal eine For-Schleife über alle Blätter und vergleiche darin den Blattnamen mit strtext.

Gruß
Reinhard

Hmmm… jetzt wird es kompliziert für mich…
da verstehe ich nur bahnhof.
ich weiss weder wie ich das machen soll, noch wo genau. sorry…
meine vba kenntnisse sind sehr beschränkt. würde diese sprache gerne lernen, nur fehlt mir das geld für kurse oder so was…
learning by doing ist mein motto. ich beginne gerade die einfachen codes zu verstehen… nur eine for-schleife und ähnliches… keine ahnung wofür das gebraucht wird. ich dachte die message box ist einfacher und soll sich nur einblenden wenn jemand nicht die auswahlliste verwendet…

ich kann aber auch gut ohne dieses feature leben, sofern es einfach nur funktioniert wenn ich was auswähle…

von dem her, wäre ich dir um die codes der UF2 sehr dankbar. Ansonsten müsste ich leider nur mit der einfachen dataform leben.

sorry dass ich das nicht hinkriege. ich versuche mir ernsthaft mühe zu geben…

lg sascha

irgendwie
if sheets check value strtext then
check=true

keine ahnung… :frowning:(

Hallo Sascha,

die Funktion könnte so aussehen:

Function Check(ByVal strText As String) As Boolean
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
 If wks.Name = strText Then
 Check = True
 Exit Function
 End If
Next wks
End Function

Und ich hatte einen Fehler drinnen, ändere mal diesen Code so ab:

Sub CommandButton1\_Click()
If Check(Me.ComboBox1.Value) = False Then
 MsgBox "falsche Auswahl - MSW auswählen!!!"
 Exit Sub
End If
Sheets(Me.ComboBox1.Value).Activate
Unload Me
UserForm2.Show
End Sub

Und mach bitte was ich sagte, erfülle die ersten drei Tabellen mit Leben, also so 15 datensätze.
Benenne die UFs um wie gesagt und auch in den UFs die Textboxen.
Also Textbox1 heißt dann TBTag, Textbox2 dann TBRmdb usw, desgleichen für die Läbels.

Und du hast ja in der einen UF schon einen Spinbutton eingebaut, das ist gut. Damit soll dann durch die datensätze geblättert werden, auch okay.
Füge aber noch ein Textfeld ein wo man später sieht welche Datensatznummer man grad sieht.

Und wenn du die mappe an andere schicken willst so versuche die Optik so aufzubauen daß sie der im Original der datenmaske ähnelt.
Dann kommen Fremde damit besser klar.

Ansonsten biste natürlich frei in Bezug auf Positionen und Größe der Elemente in der UF, farbliche Gestaltung u.v.m.

Gruß
Reinhard

Hallo Reinhard:smile:

Ich habe soweit alles erledigt.

Bei den Labels war ich mir nicht so sicher, da diese ständig ändern werden. bei jedem MSW (Milchsammelwagen) wird am schluss eine andere liste sein, resp. kann jederzeit die spaltenüberschrift (abladeort) ändern…

das design möchte ich gerne so behalten, da es für unsere chauffeure einfach bleiben soll… 95% aller wissen nicht was excel ist…:smile:

Habe noch einiges mehr eingefügt… das meiste funktioniert auch.
Aber die Datenmaske noch nicht…(komme da nicht weiter)
und auch bei den neuen Userformen funktioniert noch nicht alles.

Schau es Dir doch bitte mal an und gib mir Bescheid ob die Codes stabil funktionieren.
Wäre Dir dafür sehr dankbar…

http://www.file-upload.net/download-3728214/Milch_Di…

Liebe Grüsse
Sascha

Hallo Sascha,

Bei den Labels war ich mir nicht so sicher, da diese ständig
ändern werden. bei jedem MSW (Milchsammelwagen) wird am
schluss eine andere liste sein, resp. kann jederzeit die
spaltenüberschrift (abladeort) ändern…

ist okay, ich hab das wieder korrigiert. In deinem Fall bietet sich an alle diese 11 Labels hinten mit Index zu versehen um sie fortlaufend über diesen Index anzusprechen.
Genauso diese 11 Textboxen.

Bei den anderen mache das bitte so, daß du vorne einen Präfix davorsetzt welches Objekt das ist.
Stichwort ungarische Notation, danach einen sprechenden Namen.

Also wäre dann
txtBlatt
der korrekte Name für die Textbox die ich noch eingefügt habe
Und cmdSchliessen für den Schliessen-Button usw.

das design möchte ich gerne so behalten, da es für unsere
chauffeure einfach bleiben soll… 95% aller wissen nicht was
excel ist…:smile:

Du legst das Design fest. Die hinzugefügte Textbox kannste natürlich wieder rauswerfen. Ich dachte nur das kann Eingabefehler evtl. verhindern wenn in der UF der Datenerfassung auch der jeweilige Blattname nochmals erscheint.

Ich habe im Code die Startupposition der UF verändert.
Die drei Befehle kannste auch wieder rauswerfen.
Dazu kannst du dann manuell die Startupposition im F4 -Fenster wieder auf Fenstermitte stellen.

Habe noch einiges mehr eingefügt… das meiste funktioniert
auch.
Aber die Datenmaske noch nicht…(komme da nicht weiter)
und auch bei den neuen Userformen funktioniert noch nicht
alles.

Die Datenmaske funktioniert jetzt soweit, teste sie.
D.h., mann kann pro ausgewähltem Blatt durch alle Einträge durchblättern.

Das mit neuem datensatz fehlt noch, teste eerst mal das Durchblättern.
Dann sage mir Step by Stepwie du dir das genau vorstellst mit Eingabe eines neuen datensatzes?
Soll auch ein Lösch-Button mitrein um den aktuell angezeigten zu löschen, ggfs. mit Rückfrage „Wollen Sie wirklich“ usw.

Ggfs. kann man den Fahrern auch nur erlauben bestehende Datensätze anzuzuschauen und neu Hinzuzufügen aber bestehedne löschen geht nur mit Passwortkenntnis.

Der „Suchen/ändern“-Button ist mir unklar. Was soll denn da genau geschehen?

Schau es Dir doch bitte mal an und gib mir Bescheid ob die
Codes stabil funktionieren.

Was soll mit
Sub Inhalte_Löschen_Click()
gelöscht werden? A3:I34 in allen Blättern?
Dann muß der Code geändert werden, so wie er da steht löscht er nur das grad aktive Blatt.

Im anderen Code, woher weißt du daß der User nicht auf Abbrechen geklickt hat und die Datei ist NICHT gespeichert?
Application.Dialogs(xlDialogSaveAs).Show Dateiname
MsgBox „Datei gespeichert“

Und du erstellst da einen Neue mappe und löschst wieder dort nur A3:I34 eines Blattes.
Nachstehend die Codes der beiden prozeduren.
Erkläre mir auch da was du genau vorhast.

Dein UF Datum_Jahr heißt jetzt Datum_Jahr2
In der jetzigen UF Datum_Jahr gibt man nicht Monat und jahr ein, man wählt es aus. Das ist sicherer, nur korrekter Monat und jahr werden im Blatt geändert.
Achja, soll Datum und Jahr in allen Blättern geaändert werden oder nur im grad aktiven?

http://www.file-upload.net/download-3728214/Milch_Di…

Schau mal diese geänderte Mappe.

http://www.uploadagent.de/show-177444-1315802832.html

Gruß
Reinhard

Private Sub Inhalte\_Löschen\_Click()
frage = MsgBox("Sind Sie sicher?", vbYesNo)
If frage = vbYes Then
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
Next
 Range("A3:I34").Select
 Selection.ClearContents
 Range("A3").Select
 Sheets("MSW 1").Select
 MsgBox "Die Inhalte wurden gelöscht"
 Unload Konfi
 Auswahl\_MSW.Show
 End If
End Sub

Private Sub Neuer\_Monat\_Click()
frage = MsgBox("Sind Sie sicher?", vbYesNo)
If frage = vbYes Then
MsgBox "Zuerst bestehende Datei Speichern"
Dim Dateiname As String
Dateiname = Format(Date, "yyyy-mm-dd")
Application.Dialogs(xlDialogSaveAs).Show Dateiname
MsgBox "Datei gespeichert"

Dim z As Long
Dim Letztes As Long
Dim lArray() As Long
Letztes = ThisWorkbook.Worksheets.Count
ReDim lArray(1 To Letztes)
For z = 1 To Letztes
lArray(z) = z
Next z
ThisWorkbook.Worksheets(lArray).Select
ThisWorkbook.Worksheets(lArray).Copy
Sheets("MSW 1").Activate


 Range("A3:I34").Select
 Selection.ClearContents

 Sheets("MSW 1").Activate
 Range("A3").Select
 Sheets("MSW 1").Select
 MsgBox "Neuer Monat erstellt"
 End If
 Unload Konfig
 Datum\_Jahr.Show

 End Sub

Bei den anderen mache das bitte so, daß du vorne einen Präfix
davorsetzt welches Objekt das ist.
Stichwort ungarische Notation, danach einen sprechenden Namen.

Macht man schon lange nicht mehr, eigentlich sollte der Typ egal sein, denn auch das kann sich bei der Entwicklung ändern.

Für den anfang nicht schlecht, aber später behindert die Typenangabe .

Als Beispiel sei gesagt:

intTelefonnummer = 01234994499

wird dann später z.B. zu

intTelefonnummer = +49/1234/994499

somit wäre es eigentlich strTelefonnummer.

Ich hab mal mit ungarischer Notation angefangen und es dann wieder verworfen. Hab auch erst gedacht das es was bringt. Aber es hat eher später gestört , mag daran liegen das ich mit Klassen arbeite . Da nimmt man dann getIntTelefonnummer oder getStrTelefonnummer um die Art zu unterscheiden. Ich habs erst auch nicht glauben können das es stören kann. Aber aus Erfahrung wird man klug.

Ein gut gewählter Name sollte es klar machen.

ListeTelefonnummer und nicht ArrayTelefonnummer .
Und klar hat man ein VariablenHeft oder irgendwas wo man nebenbei Buchführung betreibt.

Ich will nicht sagen das es Falsch ist, aber es wird heut nicht mehr gebraucht.

Thomas Punkt.

intTelefonnummer = +49/1234/994499

und wie würde ich das jetzt bezeichnen ?

ganz einfach

Telefonkennung = +49/1234/994499

weil es eben schon nicht mehr nur nummern sind sondern gruppen.

Ein anderer würde es vielleicht so darstellen :

Telefonkennung = array( „+49“,1234,994499)

txtBlatt -> BalttInhalt oder wenn anderer Kontext BlattDatei etc.

dann brauche ich dies nicht zu ändern?

dann brauche ich dies nicht zu ändern?

Hallo Sascha,

*gg*, klar du denkst, schön wenn ich das nicht bbrauche, dann spare ich mir Arbeit.
Das ist leider falsch gedacht, völlig.

Wenn du dir jetzt im Vorfeld die zeit und machst um die variablennamen in sprechende Namen umzuwandeln so zahlt sich dieser Aufwand in der Zukunft sehr gewaltig aus.

In zwei Wochen ohne die datei zu sehen weißt du garantiert nicht mehr so genau wie heute was da eigentlich was genau ist wenn du da im Editor die Namen deiner 30 Objekte auf der einen UF liest.

Wie sehr hilfreich wäre es dann du hättest die Namen mit sprechenden namen versehen aus dem du mit einem Blick erkennen kannst, aha, eine Textbox, aha, eine Combobox usw.

Daß so wie Thomas es sagt die ungarische Notion „out“ ist sehe ich noch lange nicht so aber das kläre ich mit Thomas weil mich das schon interessiert.

Du hast jetzt, menschlich verständlich und grad Programmierer sind extrem schreibfaul :smile:, aus dem was Thomas schrieb herausgelesen daß man „das“ nicht braucht.
Haste auch gelesen was er sonst noch so schrieb? Hast du so ein „Variablenbuch“ oder was das ist von dem er schrieb?
Hast du „Klassen“? nein.
(Mal weglassend daß DieseArbeitsmappe, tabelle1 usw Klassenmodule sind)

Es geht hier in keinster Weise um Rechthaberei.
Die ganze Sache mit Namensvergabe, also Planung wie ich etwas benenne dient nur EINEM einzigen Zweck, es dem Programmierer so leicht wie möglich zu machen das Programm zu kodieren und wenn er nach einiger zeit wieder auf die Mappe trifft sich so schnell wie möglich wieder gleich reindenken zu können.

Noch etwas, je näher du dich „Regeln“ wie der ungarischen Notation oder von mir aus dem was Thomas sagte annäherte, desto leichter können sich auch Fremde darin einfinden und dir ggfs. helfen.

Stell dir mal vor, du fragst irgendwo an in der Vba Welt, mit längerem Code für eine UF mit 30 Elementen.
meinste da hat einer Bock dir zu helfen wenn er dazu erstmal eine halbe Stunde braucht um da den Variablennamen im Code die richtigen Elemente der UF zuordnen muß?

Genauso mit „Option Explicit“.
Das habe ich dir „eingeschmuggelt“. Okay, kann sein daß ich die mappe noch gar nicht hochlud, egal.
Warum tat ich das? Weil es auch wichtig ist.
Angenommen viel Code. Klappt nicht. Du suchst den Fehler, hast schon Ahnungen wodran das liegen könnte, bringt alles nix, dann stellste nach 2h fest, es lag daran daß du die Variable Letzte irgendwo Letze geschrieben hast.

Nach so Erfahrungen wirste anfangen Option Explicit zu lieben denn das verhindert es.

Und zu den Variablennamen, scheu dich nicht auch längere namen zu benutzen.
Wie txtWoDerOnkelMeinerOmmaMalWohnte

Wenn du die mit dim deklariert hast, dann gib mal
txt
oder
txtw
oder txtwo

ein und drück dann Strg + Leerzeichentaste…

So, Flasche leer, habe fertig *hicks* :smile:)

Konkret, lass das mit den Objektnamen erstmal ruhen.
Da mich das auch brennend interessiert kümmere ich mich schon drum zu klären ob das was Thomas schrieb für VB.net gilt und/oder auch für Vba.

Ich mach mich jetzt dran und versuche das umzusetzen was du zuletzt schriebst, dann lade ich eine mappe hoch, so in 30-60 min.
Dann como siempre testest und sagst mir was da geändert werden muß.
Übrigens, mir ist das xls Format lieber.
Andrerseits habe ich auch 2007 von daher wäre es egal aber es gibt ja auch andere Interessierte hier.

Gruß
Reinhard

Noch etwas, je näher du dich „Regeln“ wie der ungarischen
Notation oder von mir aus dem was Thomas sagte annäherte,
desto leichter können sich auch Fremde darin einfinden und dir
ggfs. helfen.

ich habe mal geändert nach Ungarischer Notation

Kannst Du mir bitte sagen ob ich das richtig gemacht habe?
Danke schon mal…

http://www.file-upload.net/download-3729973/Milch_Di…

Noch etwas, je näher du dich „Regeln“ wie der ungarischen
Notation oder von mir aus dem was Thomas sagte annäherte,
desto leichter können sich auch Fremde darin einfinden und dir
ggfs. helfen.

ich habe mal geändert nach Ungarischer Notation
Kannst Du mir bitte sagen ob ich das richtig gemacht habe?
http://www.file-upload.net/download-3729973/Milch_Di…

Hallo Sascha,

mal Firmenprogrammierer gibt es für dich kein falsch oder richtig.
Es gibt nur das "kannst du auch nach vier Wochen Urlaub wieder vor der mappe sitzend in einer UF wenn sie dir oben alle Elemente auflisten wie hier:

lbl1
Logo
cmdNeuer_Monat
cmdAbbruch

genau sagen welches Element ein Lbl ist oder eine Textbox oder oder.
Dadrum geht es. Hier sind es nur 4 Elemente.

Hättest du nix an den mane geändert würde da stehen:

Label1
Picture1
CommandButton1
CommandButton2

Was von beiden ist nun übersichtlicher?
Bedenke, in der anderen Uf hast du von so Elementen ca. 30.

Außerdem hast du mich aufgehalten *schwer rausred* :smile:
Deshalb vergiß das mit der Stunde wie ich sagte, gleich kommt Großstadtrevier *gg*

mañana o.ä. …

Gruß
Reinhard