Wie kann ich in VBA-Excel per laufender Nummer meine Userform Einlesen und danach diese "Einlesung" bearbeiten?

...komplette Frage anzeigen UserForm Screenshot 1. Multipage - (VBA, einlösen, UserForm)

2 Antworten

Ich würde eine neue Funktion, bzw. ein Change-Ereignis an dem Eingabefeld für die Laufende Nummer.

Private Sub TXTlfdNr_Change()
  Dim i

For i = 2 To Sheets("DropDown-Menü's").Range("J15").Value + 1 If Me.TXTlfdNr.Value = CStr(Sheets("Gesamtdaten").Cells(i, 1).Value) Then Me.TXTLehrjahr.Value = Sheets("Gesamtdaten").Cells(i, 2).Value Me.CBAusbildungsart.Value = Sheets("Gesamtdaten").Cells(i, 3).Value Me.CBAusbilder.Value = Sheets("Gesamtdaten").Cells(i, 4).Value '... End If Next End Sub

Danke schonmal für die schnelle Antwort .. werde ich gegen 15 Uhr mal ausprobieren und dann Bescheid geben

1

Vielen Dank schon mal für diesen Code :) 

habe ihn nun bei mir eingepflegt ... mit ner kleinen Änderung:

Private Sub CBlfdNr_Change()
 'Ist jetzt ein DropDownmenü mit allen momentanen LfdNr.
Dim i
For i = 2 To Sheets("DropDown-Menü's").Range("J15").Value + 1
If Me.CBlfdNr.Value = CStr(Sheets("Gesamtdaten").Cells(i, 1).Value) Then

Me.TXTLehrjahr.Value = Sheets("Gesamtdaten").Cells(i, 2).Value
Me.CBAusbildungsart.Value = Sheets("Gesamtdaten").Cells(i, 3).Value
Me.CBAusbilder.Value = Sheets("Gesamtdaten").Cells(i, 4).Value

Er liest perfekt ein :) jedoch Überschreibt bzw. bearbeitet nicht die aktuelle auswahl :/ : wenn ich auf "Übernehmen" klicke:

- Setzt er mir den Datensatz unten neu rein .. also er bearbeitet ihn nicht sondern behandelt ihn wie einen neuen Datensatz .. was müsste ich dafür noch ändern?

Ps: Was mir jetzt vorhin auch noch einfiel ... geht das auch das ich per Button "Löschen" den ausgewählten datensatz lösche?

MfG Tim

0
@xXSnip3rXx

Beim Schreiben musst du auf ähnlicher Art und Weise erstmal schauen, ob du die ID findest. Sonst steht i am Ende der Schleife automatisch auf der nächsten, freien Zeile und du brauchst nur mittels Cells(i,... die neue Zeile beschreiben.

1
@xXSnip3rXx

Überschreiben ist vermutlich "schöner", wenn die laufende Nummer in der Reihenfolge bleiben soll. Ansonsten ist es
for i=1 to .... (wie Du schon die Spalte durchsuchst)
if cells(i,1)= (ebenfalls wie von Dir vorgesehen)
rows(i).delete
exit for
end if

Rufst Du nach dem CBlfdNr_Change dann die andere Sub auf? Dann könnte man beim Aufruf einen Parameter mitgeben, ob das ELZ anhand der letzten Zeile ermittelt werden soll oder eine vorhandene lfd. Nummer überschreibt.

Alternativ: In Deinem ersten Code die Bestimmung des ELZ etwas erweitern:

If WorksheetFunction.CountIf(Range((Sheets("Gesamtdaten").Cells(1, 1).Value), Cells(Sheets("Gesamtdaten").Cells(Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row, 1).Value)), Me.TXTlfdNr.Value) = 0 Then ELZ = Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row + 1
Else:
For i = 1 To Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row
If Sheets("Gesamtdaten").Cells(i, 1).Value = Me.TXTlfdNr.Value Then
ELZ = i
Exit For
End If
Next i

Hinweis: Ich hab direkt Deine Bezeichnungen für Sheets und Userform genommen beim Zusammenstellen - damit läuft es bei mir natürlich nicht und könnte noch ein paar Fehlermeldungen ausspucken

1
@Ninombre

Schonmal danke an euch zwei das ihr mir helfen möchtet :)


Nun Ich kenne mich fast nicht mit VBA aus ^^ ich habe die Userform mithilfe von verschiedenen TuT Viedeos und Foren beiträgen gefertigt / abgeändert vereinfacht ...

Könnte ich euch eine "abgeänderte" ( Datenschutz ^.^) Datei hochladen sodass ihr mir dort einen Teil Vormacht den ich dann weiterführen könnte ... ( am besten mit Erklärung :) )

Ich wüsste jetzt z.b. nicht was ich mit deinem Code richtig machen sollte @Ninombre ... wo soll ich ihn einfügen..:


Private Sub cmdÜbernehmen_Click()

Dim ELZ As Long

ELZ = Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row + 1
If WorksheetFunction.CountIf(Range((Sheets("Gesamtdaten").Cells(1, 1).Value), Cells(Sheets("Gesamtdaten").Cells(Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row, 1).Value)), Me.TXTlfdNr.Value) = 0 Then ELZ = Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row + 1
Else: ' Fehler "Else ohne If"

For i = 1 To Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row
If Sheets("Gesamtdaten").Cells(i, 1).Value = Me.TXTlfdNr.Value Then
ELZ = i
Exit For
End If
Next i
If Sheets("Gesamtdaten").Cells(i, 2).Value = Me.TXTLehrjahr.Value Then
ELZ = i
Exit For
End If
Next i


Dort? Da komm ein fehler raus .. :/

Würde euch das hochladen der Datei was helfen .. mir zu helfen?


MfG Tim

0
@xXSnip3rXx

Ninombre hat im Wesentlichen zwei Konzepte vorgeschlagen.

1) Statt die Zeile zu überschreiben, kannst du einfach die alte Zeile löschen (am Ende des Change-Ereignisses) und dann ganz normal, egal ob es die ID schon vorher gab oder nicht, die Eingabe als neuen Datensatz unten anhängen

2) Wenn du im Change-Ereignis der ID dir die Zeile der ID merken würdest, könntest du sie einfach beim Speichern wiederverwerten. Aber Achtung! Du musst Konsistenz gewährleisten, sollte die ID abgeändert werden.

1
@Suboptimierer

1) und woher weiß VBA welche Zeile es löschen soll?

2) Bei dem Code kommt der Fehler "Else ohne If" .. wie kann ich den Lösen ...?

0
@xXSnip3rXx

1) VBA findet die zu löschende Zeile wie im Change-Ereignis, welches ich gepostet habe. Nachdem du alle Werte ins Formular übernommen hast, gibst du den von Ninombre vorgeschlagenen Befehl ein: rows(i).delete

2) Verstehe Ninombres Code eher als Pseudocode. Das : hinter dem Else irritiert mich zum Beispiel. Hinter dem Then gehört ein Zeilenumbruch oder das Else muss in dieselbe Zeile wie das If. Aber auch lässt sie die Schleife bei 1 anfangen zu zählen.

Es sollte nur das Prinzip veranschaulicht werden.

1
@xXSnip3rXx

Obwohl .. ich habe jetzt doch ein größeres Problem .. (zum glück in der Test datei aufgefallen..)

Wo muss ich den befehl:
rows(i).delete jetzt hintuhen .. wenn ich ihn (irgenwie auch logisch -.-') ins change ereignis kopiere löscht er mir bei jder änderung der lfdnr die entsprechende zeile ... müsste ich einen vollkommen neuen Private Sub machen? Da wenn ich den befehl in den "ÜBernehmen" button hinzufüge, kommt nur ein error ...

0
@xXSnip3rXx

Der Löschbefehl muss natürlich innerhalb von 

If Me.CBlfdNr.Value = CStr(Sheets("Gesamtdaten").Cells(i, 1).Value) Then


stehen und zwar als letzte Zeile vor dem End If.

Versuch den Quellcode mal zu verstehen. Es darf nur dann eine ID gelöscht werden, wenn sie in der Liste gefunden wird.

Risiko ist, dass die Änderung verloren geht, wenn zwischen Change-Ereignis und Einfügen des neuen Datensatzes das Programm abstürzt. Wird die Maske ohne zu speichern geschlossen, geht der Datensatz ebenfalls verloren.

1
@Suboptimierer

Ich habe den befehl in der letzten spalte von diesem Befehel vor dem End If gesetzt ... aber dann löscht er bei jedem ändern der ID den gesamten datensatz ...

Ist das das "Risiko" .. wenn ja .. wie kann ich das umgehen...

0
@xXSnip3rXx

Dadurch entsteht ein Risiko. Die Idee ist folgendermaßen:

  1. Such die ID in der Liste
  2. bei Fund: Übertrage den Datensatz ins Formular
  3. Lösche den Datensatz in der Liste
  4. Pass den Datensatz im Formular an
  5. Schreibe den Datensatz als neuen Datensatz weg.

Du kannst das Problem umgehen, immer manuell speichern zu müssen, indem du Vor jedem Wechsel der ID (BeforeUpdate) den aktuellen Stand speicherst.

____________

Falls das zu kompliziert werden sollte, könntest du immer noch auf die Idee zurück fallen, keine Löschung vorzunehmen, sondern einfach beim Change der ID nach der ID suchen und die Formulardaten füllen und beim Speichern wieder suchen, bei Fund die Zeile aktualisieren, ansonsten eine neue hinten dran hängen.

0

Vielen Dank euch beiden :) Schnurrt wie eine Kleine Katze ;)


... kann leider nur einem von euch die "Hilfreichste antwort" geben ;) [3 Stunden to go ^.^]

Aber @Ninombre fühl dich mit Belobigt ;D

MfG Tim




Suboptimierer hat hier klar den wesentlichen Beitrag geleistet, insofern ist das absolut ok. Hab ja nicht mal eine eigene Antwort geschrieben ;-)

1
@Ninombre

Aber genau zu deinem kleinen beitrag habe ich eine frage ^^

Wie wo soll ich das genau einfügen .. bei der Change Funktion löscht er ja immer wieder mit der rows(i).delete nach jeder änderung der Lfdnr die spalte zu dieser ... wie kann ich das ändern? Suboptimierer versucht es mir oben zu erklären aber ich verstehe das nicht ganz .. :D dachte zuerst ich habe es verstanden .. war aber nichts :/

0
@xXSnip3rXx

Wie ist denn der vollständige Code, der bei der Change Funktion abläuft? Du liest die Daten zu einer vorhandenen lfd. Nummer ein - dann muss das Löschen erfolgen und danach das Schreiben. Genau kann ich die Stelle nicht benennen ohne Code.

Wie Suboptimierer allerdings auch schon sagte besteht bei dieser Variante das Risiko, dass der User zwar die vorhanden Daten lädt (und der Datensatz gelöscht wird) aber nicht die gänderten Daten speichert. Dann ist der Satz einfach weg.

Die mit ' kommentierten Zeilen gehören aus meiner Sicht raus:

mit dem Countif prüfen, ob es die lfd. Nummer schon gibt -> wenn 0 (es also nicht gefunden wird) Ermittlung über die letzte Zeile, sonst die If-Schleife solange bis die aktuelle Zeile in Spalte A -> cells(i,1) = lfd-Nummer aus der Userform ist. ELZ = i (damit ist ELZ die Zeile, die überschrieben werden soll) und die For-Schleife beenden.

Private Sub cmdÜbernehmen_Click()
Dim ELZ As Long
'ELZ = Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row + 1
If WorksheetFunction.CountIf(Range((Sheets("Gesamtdaten").Cells(1, 1).Value), Cells(Sheets("Gesamtdaten").Cells(Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row, 1).Value)), Me.TXTlfdNr.Value) = 0 Then ELZ = Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row + 1 Else

For i = 1 To Sheets("Gesamtdaten").Cells(Rows.Count, 1).End(xlUp).Row
If Sheets("Gesamtdaten").Cells(i, 1).Value = Me.TXTlfdNr.Value Then
ELZ = i
Exit For
End If
Next i
' If Sheets("Gesamtdaten").Cells(i, 2).Value = Me.TXTLehrjahr.Value Then
' ELZ = i
' Exit For
' End If
' Next i
1

die Datei ist halt nur ohne Stammdaten ^.^ Datenschutz

0
@Ninombre

sry :D musste langezeit was anderes machen .. pw wäre Ausbildung jedoch habe ich es jetzt schon hinbekommen .. danke tz. euch allen ;)

Wenn du interesse an der datei hast wie sie aktuell ist kann ich sie dir gerne mal zu kommen lassen ^^

0

Was möchtest Du wissen?