Userform Button "Ändern"

Moderator: ModerationP

Userform Button "Ändern"

Beitragvon floeckle » 02. Dez 2020, 19:02

Hallo zusammen,

ich komme mal wieder nicht weiter und hoffe auf Hilfe. Das hat nämlich schon einige Male gut geklappt. :)

Ich habe eine Datenbank erstellt mit den Button SPEICHERN, SUCHEN, ÄNDERN
Per Doppelklick auf einen Datensatz in der Tabelle wird das Formular(Userform1) geöffnet. Der angeklickte Datensatz wird im Formular angezeigt.

SUCHEN funktioniert.
SPEICHERN funktioniert. Es wird die nächste freie Zeile gesucht und der Datensatz wird dort gespeichert.

Nun möchte ich einen aufgerufenen Datensatz im Formular ändern. Der Datensatz soll in der Tabelle entsprechend überschrieben werden

Mir fiel nichts Besseres ein, als dem Button ÄNDERN den Code von Button SUCHEN zuzuordnen.
Und einfach nur die Zuordnung umdrehen.
Also von
Me.TextBox_Standort.Value = ngTreffer.Offset(0, 4).Value wurde
rngTreffer.Offset(0, 4).Value = Me.TextBox_Standort.Value

Das klappt auch. Aber nur für die Textboxen.

Die Comboboxen speichern die Änderungen nicht.

Code von "Suchen"
Code: Alles auswählen
   'Suchfunktion

Private Sub CommandButton1_Click()
Dim rngTreffer As Range
With Tabelle1
Set rngTreffer = Sheets("Tabelle1").Range("A:A").Find(What:=TextBox_Mastnr.Value, Lookat:=xlWhole)
If Not rngTreffer Is Nothing Then
Me.ComboBox_Ortsteil.Value = rngTreffer.Offset(0, 1).Value
Me.ComboBox_Straße.Value = rngTreffer.Offset(0, 2).Value
Me.TextBox_Breitengrad.Value = rngTreffer.Offset(0, 3).Value
Me.TextBox_Standort.Value = rngTreffer.Offset(0, 4).Value
Me.TextBox_Längengrad.Value = rngTreffer.Offset(0, 6).Value
Me.ComboBox_Matnr.Value = rngTreffer.Offset(0, 5).Value
Me.ListBox_Werkstoff.Value = rngTreffer.Offset(0, 7).Value
Me.TextBox_Bemerkung.Value = rngTreffer.Offset(0, 10).Value
Me.TextBox_Prüfdatum.Value = rngTreffer.Offset(0, 8).Value

If rngTreffer.Offset(0, 9).Value = "6 Jahre standsicher" Then Me.OptionButton1.Value = True
If rngTreffer.Offset(0, 9).Value = "3 Jahre standsicher" Then Me.OptionButton2.Value = True
If rngTreffer.Offset(0, 9).Value = "6 Monate standsicher" Then Me.OptionButton3.Value = True
If rngTreffer.Offset(0, 9).Value = "sofort" Then Me.OptionButton4.Value = True
If rngTreffer.Offset(0, 9).Value = "nicht geprüft" Then Me.OptionButton5.Value = True
     

Else
If rngTreffer Is Nothing Then
MsgBox "Nicht vorhanden"
End If
Exit Sub

End If
End With

End Sub







Code von Ändern


Code: Alles auswählen
'Datensatz ändern


Private Sub CommandButton2_Click()
Me.Label1.Caption = Chr(232)

Dim rngTreffer As Range
With Tabelle1
Set rngTreffer = Sheets("Tabelle1").Range("A:A").Find(What:=TextBox_Mastnr.Value, Lookat:=xlWhole)
If Not rngTreffer Is Nothing Then

rngTreffer.Offset(0, 1).Value = Me.ComboBox_Ortsteil.Value
rngTreffer.Offset(0, 2).Value = Me.ComboBox_Straße.Value
rngTreffer.Offset(0, 3).Value = Me.TextBox_Breitengrad.Value
 rngTreffer.Offset(0, 4).Value = Me.TextBox_Standort.Value
rngTreffer.Offset(0, 6).Value = Me.TextBox_Längengrad.Value
'rngTreffer.Offset(0, 5).Value = Me.ComboBox_Matnr.Value
rngTreffer.Offset(0, 7).Value = Me.ListBox_Werkstoff.Value
rngTreffer.Offset(0, 10).Value = Me.TextBox_Bemerkung.Value
rngTreffer.Offset(0, 8).Value = Me.TextBox_Prüfdatum.Value


If rngTreffer.Offset(0, 9).Value = "6 Jahre standsicher" Then Me.OptionButton1.Value = True
If rngTreffer.Offset(0, 9).Value = "3 Jahre standsicher" Then Me.OptionButton2.Value = True
If rngTreffer.Offset(0, 9).Value = "6 Monate standsicher" Then Me.OptionButton3.Value = True
If rngTreffer.Offset(0, 9).Value = "sofort" Then Me.OptionButton4.Value = True
If rngTreffer.Offset(0, 9).Value = "nicht geprüft" Then Me.OptionButton5.Value = True
     

Else
If rngTreffer Is Nothing Then
MsgBox "Nicht vorhanden"
End If
Exit Sub

End If
End With

End Sub



Und hier noch der Code von SPEICHERN. Ich habe versucht, diesen abzuwandeln. Aber, er generiert dann zwar keine neue Mastnr. Der geänderte Datensatz wird aber in der Tabelle unten angefügt

Code: Alles auswählen
Private Sub CommandButton_Eingabe_Click()
CommandButton_Eingabe.Accelerator = "s" 'Shortcut

'Erste freie Zeile ausfindig machen

Dim last As Integer
last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1


'Ortsteil
Cells(last, 2).Value = ComboBox_Ortsteil

'Straße
Cells(last, 3).Value = ComboBox_Straße

'Breitengrad
Cells(last, 4).Value = TextBox_Breitengrad

'Standort
Cells(last, 5).Value = TextBox_Standort

'Mastnr.
Cells(last, 1).Value = TextBox_Mastnr * 1

'Materialnr.
Cells(last, 6).Value = ComboBox_Materialnr

'Werkstoff
Cells(last, 8).Value = ListBox_Werkstoff.Value

'Längengrad
Cells(last, 7).Value = TextBox_Längengrad

'Prüfdatum
Cells(last, 9).Value = TextBox_Prüfdatum

'Gewährleistung
If OptionButton1.Value = True Then Cells(last, 10).Value = "6 Jahre standsicher"
If OptionButton2.Value = True Then Cells(last, 10).Value = "3 Jahre standsicher"
If OptionButton3.Value = True Then Cells(last, 10).Value = "6 Monate standsicher"
If OptionButton4.Value = True Then Cells(last, 10).Value = "sofort"
If OptionButton5.Value = True Then Cells(last, 10).Value = "nicht geprüft"

'Bemerkung
Cells(last, 11).Value = TextBox_Bemerkung


End Sub


Ich wäre sehr dankbar, wenn ich Rat bekäme.

Viele Grüße

Anja
floeckle
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 09. Sep 2020, 14:32

Re: Userform Button "Ändern"

Beitragvon 1Matthias » 03. Dez 2020, 16:25

Moin!
Also auf die schnelle sieht dein Code richtig aus. Überträgt er nichts oder falsche Werte?
Beim Speichern solltest du aber nochmal schauen. Da passt die Zuordnung m.E. nicht ganz. Dort ist der Längengrad in Spalte 7 sonst in Spalte 6.
Prüfe am Besten nochmal die Namen (wobei die bei den anderen Codeteilen ja gleich sind). Gibt es sonst noch Code, der parallel läuft und evtl. die Comboboxen löscht?
Im Zweifel wäre es das beste, du lädst eine Datei mit der UF mal hoch.
Und noch ein Tipp: Da speichern und ändern immer das selbe machen (nur in einer anderen Zeile) würde ich das in eine Funktion packen und nur die Zeilennummer übergeben.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 716
Registriert: 15. Aug 2017, 18:36

Re: Userform Button "Ändern"

Beitragvon floeckle » 08. Dez 2020, 16:07

Hallo 1Matthias,

vielen Dank erstmal für Deine Antwort.

Ich habe mir das ganze noch mal in Ruhe angesehen. Ich hatte einige Fehler im Code. Jetzt funktioniert der Button aber. :D

Aber, dein Hinweis, dass eigentlich alles ok. aussieht, hat mir schon mal weitergeholfen und ich bin auf die Suche nach Fehlern gegangen.

Trotzdem hätte gerne den Code vom Button SPEICHERN genommen. Jedoch wird der Datensatz dann wieder unten an die Tabelle angefügt und das soll er ja nicht. Kannst Du mir da einen Tipp geben, was ich anstelle von "last" eingeben muss? Eventuell nur eine 0?

Code: Alles auswählen
Private Sub CommandButton_Eingabe_Click()
CommandButton_Eingabe.Accelerator = "s" 'Shortcut

'Erste freie Zeile ausfindig machen

Dim last As Integer
last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1


'Ortsteil
Cells(last, 2).Value = ComboBox_Ortsteil

'Straße
Cells(last, 3).Value = ComboBox_Straße

'Breitengrad
Cells(last, 4).Value = TextBox_Breitengrad

'Standort
Cells(last, 5).Value = TextBox_Standort

'Mastnr.
Cells(last, 1).Value = TextBox_Mastnr * 1

'Materialnr.
Cells(last, 6).Value = ComboBox_Materialnr

'Werkstoff
Cells(last, 8).Value = ListBox_Werkstoff.Value

'Längengrad
Cells(last, 7).Value = TextBox_Längengrad

'Prüfdatum
Cells(last, 9).Value = TextBox_Prüfdatum

'Gewährleistung
If OptionButton1.Value = True Then Cells(last, 10).Value = "6 Jahre standsicher"
If OptionButton2.Value = True Then Cells(last, 10).Value = "3 Jahre standsicher"
If OptionButton3.Value = True Then Cells(last, 10).Value = "6 Monate standsicher"
If OptionButton4.Value = True Then Cells(last, 10).Value = "sofort"
If OptionButton5.Value = True Then Cells(last, 10).Value = "nicht geprüft"

'Bemerkung
Cells(last, 11).Value = TextBox_Bemerkung


End Sub


Vielen Dank noch mal.
floeckle
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 11
Registriert: 09. Sep 2020, 14:32

Re: Userform Button "Ändern"

Beitragvon 1Matthias » 09. Dez 2020, 22:01

Moin!
ALso wenn du den selben Code nutzen willst, must du der Variablen last die Zeilennummer übergeben. Dafür gibt es versch. Varianten. Bspw. kannst du beim Enlesen in die Tabelle gleich die Zeilennummer mit einlesen (aber nicht anzeigen lassen) alternativ suchst du die richtige Zeile wieder. Habe deinen Code mal angepasst und die letzten Variante genommen. Ist allerdings ungetestet. Dabei wird wieder die Zeile an Hand der Masternummer gesucht. Wenn sie gefunden wird, wird die Zeilennummer genommen und an last übergeben.
Dazu habe ich noch dein last von integer auf long umgewandelt. Damit kannst du jetzt auch mehr als 33000 Zeilen ansprechen.
Bitte mal an einer Testdatei testen (nicht gleich am Original, nicht das Daten verloren gehen).
Code: Alles auswählen
Private Sub CommandButton_Eingabe_Click()
CommandButton_Eingabe.Accelerator = "s" 'Shortcut

'Erste freie Zeile ausfindig machen

Dim last As Long
'last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
Set rngTreffer = Sheets("Tabelle1").Range("A:A").Find(What:=TextBox_Mastnr.Value, Lookat:=xlWhole)
If Not rngTreffer Is Nothing Then
lst = rngteffer.Row
'Ortsteil
Cells(last, 2).Value = ComboBox_Ortsteil

'Straße
Cells(last, 3).Value = ComboBox_Straße

'Breitengrad
Cells(last, 4).Value = TextBox_Breitengrad

'Standort
Cells(last, 5).Value = TextBox_Standort

'Mastnr.
Cells(last, 1).Value = TextBox_Mastnr * 1

'Materialnr.
Cells(last, 6).Value = ComboBox_Materialnr

'Werkstoff
Cells(last, 8).Value = ListBox_Werkstoff.Value

'Längengrad
Cells(last, 7).Value = TextBox_Längengrad

'Prüfdatum
Cells(last, 9).Value = TextBox_Prüfdatum

'Gewährleistung
If OptionButton1.Value = True Then Cells(last, 10).Value = "6 Jahre standsicher"
If OptionButton2.Value = True Then Cells(last, 10).Value = "3 Jahre standsicher"
If OptionButton3.Value = True Then Cells(last, 10).Value = "6 Monate standsicher"
If OptionButton4.Value = True Then Cells(last, 10).Value = "sofort"
If OptionButton5.Value = True Then Cells(last, 10).Value = "nicht geprüft"

'Bemerkung
Cells(last, 11).Value = TextBox_Bemerkung

End If

End Sub

VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 716
Registriert: 15. Aug 2017, 18:36

Re: Userform Button "Ändern"

Beitragvon DerHoepp » 10. Dez 2020, 16:07

Moin,

das mag jetzt auf den ersten Blick verwirrend sein, aber du solltest überhaupt keine Zeilennummern verwenden. Nutze besser ein Listobject/Strg+T-Tabelle/"intelligente Tabelle". Ein Datensatz eines Listobjects wird immer genau durch ein .ListRow()-Objekt dargestellt. Neue Datensätze lassen sich mit .ListRows().Add() erzeugen, vorhandene Datensätze lassen sich beispielsweise über den Autofilter finden und dann über die zugehörige .ListRow bearbeiten.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9234
Registriert: 14. Mai 2013, 11:08


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste