Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1884to1888
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
Button "Datensatz Ändern" geht nicht
18.05.2022 15:29:38
Max
Hallo liebes Forum,
ich bin es mal wieder mit einem (wer hätte das gedacht ;-)) Problem: Ich habe etliche Foren durchsucht, um eine Schaltfläche zu programmieren, die die Einträge aus einer Listbox (die die Daten aus einer Tabelle zieht) um Einträge zu überschreiben bzw. zu ändern. Das ist mein Ergebnis:

Private Sub Button4_DatensatzÄndern_Click()
With Me.ListBox1
TextBox1 = wks.Cells(.List(.ListIndex, 1))
ComboBoxFirma1_Maschine = wks.Cells(ListBox1.ListIndex, 2)
TextBox5 = wks.Cells(.List(.ListIndex, 3))
Datum = wks.Cells(CDate(.List(.ListIndex, 0)))
TextBox10 = wks.Cells(.List(.ListIndex, 5))
TextBox11 = wks.Cells(.List(.ListIndex, 6))
TextBox12 = wks.Cells(.List(.ListIndex, 7))
TextBox13 = wks.Cells(.List(.ListIndex, 8))
TextBox14 = wks.Cells(.List(.ListIndex, 9))
TextBox15 = wks.Cells(.List(.ListIndex, 10))
TextBox16 = wks.Cells(.List(.ListIndex, 11))
TextBox17 = wks.Cells(.List(.ListIndex, 12))
End With
End Sub
Leider funktioniert das Ganze nicht wie erhofft und es ändert nichts an den Daten aus der Tabelle. Da wäre meine Frage an Euch, was ich falsch gemacht habe und wie ich es besser machen kann.
Hier ist einmal die vollständige Datei: https://www.herber.de/bbs/user/153123.xlsm
Danke im Voraus für Eure Hilfe! Und verzeiht mir bitte meine geringen Kenntnisse in Excel VBA!
VG Max

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 15:43:26
UweD
Hallo
WKS ist dem Fall nicht bekannt.
Du solltest Variable, die du in mehren Makros verwendest als Public definieren.
Dazu im Kopf eines Normalen Moduls

Public WKS As Worksheet
Und in den Einzelmacros das Dim dazu entfernen

Private Sub userform_initialize()
Dim LR As Integer, Zeil As Integer
Set WKS = Tabelle1
Zeil = 20
Me.Caption = WKS.Range("A5").Value
LR = WKS.Cells(WKS.Rows.Count, 1).End(xlUp).Row
With Me.ListBox1
.ColumnCount = 13
.ColumnWidths = "80;80;80;80;80;80;80;80;80;80;80;80;80"
.ColumnHeads = True
.RowSource = "'" & WKS.Name & "'!A" & LR - Zeil + 1 & ":M" & LR
.SetFocus
End With
End Sub
LG UweD
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 15:53:47
Max
Hallo Uwe,
Ich danke dir für deine schnelle Antwort, bin aber ehrlich gesagt etwas überfragt, wie ich das Ganze umsetzen soll. Ich habe kein Modul angelegt, sondern nur die Userform erstellt.
Bitte verzeih mir meine Unwissenheit :(
VG Max
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 16:05:28
UweD
Hallo
du kannst beides machen. Entweder in jedem Codeteile wieder definieren
oder wie geschrieben...
Ein Normales Modul anlegen
dort im Kopf die Variablen als Public definieren.
Diese wird Makroübergreifend anwendbar
Beim userform_initialize()
wird dann WKS mit Tabelle1 belegt
und steht dann später auch beim Button so zur Verfügung
LG UweD
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 16:17:07
Max
Hallo Uwe,
ah jetzt verstehe ich. Danke für die Erklärung!.
VG Max
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 15:57:37
Max
Habe ich es so richtig verstanden?

  With Me.ListBox1
Set wks = Tabelle1
TextBox1 = wks.Cells(.List(.ListIndex, 1))
ComboBoxFirma1_Maschine = wks.Cells(ListBox1.ListIndex, 2)
TextBox5 = wks.Cells(.List(.ListIndex, 3))
Datum = wks.Cells(CDate(.List(.ListIndex, 0)))
TextBox10 = wks.Cells(.List(.ListIndex, 5))
TextBox11 = wks.Cells(.List(.ListIndex, 6))
TextBox12 = wks.Cells(.List(.ListIndex, 7))
TextBox13 = wks.Cells(.List(.ListIndex, 8))
TextBox14 = wks.Cells(.List(.ListIndex, 9))
TextBox15 = wks.Cells(.List(.ListIndex, 10))
TextBox16 = wks.Cells(.List(.ListIndex, 11))
TextBox17 = wks.Cells(.List(.ListIndex, 12))
End With
End Sub
VG Max
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 16:11:54
Herbert_Grom
Hallo Max,
wenn ich Uwe richtig verstanden habe meinte er es so:

Private Sub Button4_DatensatzÄndern_Click()
Dim wks As Worksheet
With Me.ListBox1
TextBox1 = wks.Cells(.List(.ListIndex, 1))
ComboBoxFirma1_Maschine = wks.Cells(ListBox1.ListIndex, 2)
TextBox5 = wks.Cells(.List(.ListIndex, 3))
Datum = wks.Cells(CDate(.List(.ListIndex, 0)))
TextBox10 = wks.Cells(.List(.ListIndex, 5))
TextBox11 = wks.Cells(.List(.ListIndex, 6))
TextBox12 = wks.Cells(.List(.ListIndex, 7))
TextBox13 = wks.Cells(.List(.ListIndex, 8))
TextBox14 = wks.Cells(.List(.ListIndex, 9))
TextBox15 = wks.Cells(.List(.ListIndex, 10))
TextBox16 = wks.Cells(.List(.ListIndex, 11))
TextBox17 = wks.Cells(.List(.ListIndex, 12))
End With
End Sub
Servus
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 16:15:59
Max
Hallo Herbert,
Auch dir danke für deine Unterstützung! Ich habe es jetzt genauso umgesetzt und erhalte eine neue Fehlermeldung mit "Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt".
Jetzt bin ich verwirrt...
VG Max
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 16:43:10
UweD
Wenn du es in jedem Codebereich per Dim definierst, musst du dort dann auch mit Set das Blatt zuweisen.
Oder
als Public definieren (im normalen Modul)
dann nur noch einmal per Set zuweisen.
Da das "userform_initialize()" zuerst ausgeführt wird, wenn eine Userform angesprochen wird,
Muss dort dass das Set rein.
In allen anderen Codebereichen dann kein Set mehr
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 16:47:38
Herbert_Grom
Hallo Max,
sorry, das war mein Fehler! Ich hatte das "Set" (s. Uwe) vergessen!
Servus
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 17:01:22
Max
Nochmals hallo Uwe, Hallo Herbert,
Danke für Eure Hilfe und Eure Geduld mit mir! Ich habe jetzt ein Modul erstellt und wks als Public definiert. Dann habe ich das Ganze mit Set zugewiesen. Ich hoffe bis hierhin alles richtig gemacht zu haben. Wenn ich jetzt starte und versuche die Taste auszuführen, zeigt es mir jedoch schon wieder eine neue Fehlermeldung an: "Laufzeitfehler 5: Ungültiger Prozedurablauf oder ungültiges Argument".
Jetzt bin ich komplett verwirrt...
Meine Userform:

Private Sub userform_initialize()
Dim LR As Integer, Zeil As Integer
Set wks = Tabelle1
Zeil = 20
Me.Caption = wks.Range("A5").Value
LR = wks.Cells(wks.Rows.Count, 1).End(xlUp).Row
With Me.ListBox1
.ColumnCount = 13
.ColumnWidths = "80;80;80;80;80;80;80;80;80;80;80;80;80"
.ColumnHeads = True
.RowSource = "'" & wks.Name & "'!A" & LR - Zeil + 1 & ":M" & LR
.SetFocus
End With
End Sub
Meine Schaltfläche:

Private Sub Button4_DatensatzÄndern_Click()
With Me.ListBox1
TextBox1 = wks.Cells(.List(.ListIndex, 1))
ComboBoxFirma1_Maschine = wks.Cells(ListBox1.ListIndex, 2)
TextBox5 = wks.Cells(.List(.ListIndex, 3))
Datum = wks.Cells(CDate(.List(.ListIndex, 0)))
TextBox10 = wks.Cells(.List(.ListIndex, 5))
TextBox11 = wks.Cells(.List(.ListIndex, 6))
TextBox12 = wks.Cells(.List(.ListIndex, 7))
TextBox13 = wks.Cells(.List(.ListIndex, 8))
TextBox14 = wks.Cells(.List(.ListIndex, 9))
TextBox15 = wks.Cells(.List(.ListIndex, 10))
TextBox16 = wks.Cells(.List(.ListIndex, 11))
TextBox17 = wks.Cells(.List(.ListIndex, 12))
End With
End Sub
Liegt es jetzt doch an meiner Umsetzung oder etwas anderem?
VG Max
Anzeige
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 23:28:54
Yal
Hallo MAx,
Cells (..) erwartet immer 2 Eingabe: Zeile und Spalte.
Du übergibst das Ergebnis von
.List(.ListIndex, 5)
Das ist nicht 2 getrennte Werte, sondern nur eine.
Eventuell müsste es so aussehen:
wks.Cells(.List(.ListIndex), 5)
VG
Yal
AW: Button "Datensatz Ändern" geht nicht
18.05.2022 23:43:15
ralf_b
Hmm, und wo kommt der Fehler?
1. Vermeide Umlaute
2. ComboBoxFirma1_Maschine = wks.Cells(ListBox1.ListIndex, 2)
TextBox5 = wks.Cells(.List(.ListIndex, 3))
' erkennst du den Unterschied
3. Cells(Zeile, Spalte) ist die häufigste Anwendung.
TextBox5 = wks.Cells(.List(.ListIndex, 3))
'hier wird der Wert aus der aktuellen Zeile der Listboxspalte 4 als Zähler der Zelle genutzt. Also steht z.b. in der Listbox 5 , ist wks.cells(5) . die 5. Zelle im Blatt
'Es fehlt die Spaltenangabe.
4. Der Ausdruck "Datensatzändern_click" läßt vermuten das du damit die Werte in der Tabelle ändern möchtest. Aber du machst das Gegenteil. Du schreibst Werte in die UFcontrols. Durch die Verwendung von Rowsource hast du zwei Möglichkeiten die Werte in die Tabelle zu bekommen. Entweder du änderst die Werte in der Listbox oder in der Tabelle.
5. z.b. TextBox13 = wks.Cells(.ListIndex +20 , 8) ' Listindex ist z.B. 0 ( =1 .Eintrag) + 21 weil die Tabelle ab Zeile 21 beginnt
6. .RowSource = "'" & wks.Name & "'!A" & LR - Zeil + 1 & ":M" & LR
' Zeil Ist der Beginn der Tabelle oder ?
.RowSource = "'" & wks.Name & "'!A" & Zeil & ":M" & LR
Anzeige
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 10:28:34
Max
Hallo Uwe, Hallo Yal,
Ich danke Euch vielmals für Eure Hilfe!
Ich schäme mich aber wirklich, dass ich es nicht hinbekomme Eure Tipps umzusetzen. Ich probiere seit 2h Eure Codes und Tipps aus, aber es funktioniert bei mir einfach nicht. Es zeigt mir auch keine Fehlermeldung an, leert aber alle Textfelder ohne zu speichern und ich weiß beim besten Willen nicht warum. Ich lade Euch nochmals die Datei hoch, in der ich herumgespielt habe.
https://www.herber.de/bbs/user/153142.xlsm
Langsam echt am Verzweifeln...
Gruß und Danke Max
Anzeige
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 11:52:00
UweD
Hallo Max
wenn du Cells verwendest, musst du die Zeile UND Spalte angeben. Cells(Zeile, Spalte)
Zeile und Spalte müssen dann auch zulässige Werte annehmen.

TextBox2 = wks.Cells(.ListIndex + 75, 0)    'er zeigt mir hier einen Fehler an
Die Zeile holst du aus der ausgewählten Position der Lisbox. Das passt.
Aber es gibt keine Spalte Null in einem Tabellenblatt (.ListIndex + 75, 0 )
LG UweD
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 14:52:27
Yal
Moin Max,
ich verstehe weiterhin nicht, warum diesen Multipages für Firma und Maschine, wenn Du eh je eine Auswahl für Firma und Maschine separat benutzst.
Du könntest vielleicht auch deine Controls besser benennen: txtZeitverlust1 ist sprechender als TextBox10.
Nutze auch Caption die dazu passen: Textbox1 -> Label3, Textbox2 -> Label1, Textbox5 -> Label28 !!!
In dem Code, verzichte so weit es geht auf Leerzeilen und nutzt dafür sehr konsequent das Einrücken. Es wird zu eine bessere Lesbarkeit trotz kompakteren Code.
Code, der sich wiederholt, sollte man in einer separate Sub ablegen.
Der Makrorekorder benutzt gern Zeileunterbrechung (Zeichen _ ). Die musst Du nicht übernehmen.
Veraltete, auskommentierte Code, kann man kurz behalten, aber nicht in aller Ewigkeit. Schnell weg damit.
Aus:

Private Sub Button5_DatensatzErfassen_Click()
Dim rngTreffer As Range
Dim IngZeileFrei As Long
Dim i As Integer
If Me.TextBox2.Value = "" Then
MsgBox "Im Feld" & Me.Label1.Caption & "fehlt die Eingabe!"
Me.TextBox2.SetFocus
Exit Sub
End If
If Me.TextBox5.Value = "" Then
MsgBox "Im Feld" & Me.Label28.Caption & "fehlt die Eingabe!"
Me.TextBox5.SetFocus
Exit Sub
End If
If Me.TextBox1.Value = "" Then
MsgBox "Im Feld" & Me.Label3.Caption & "fehlt die Eingabe!"
Me.TextBox11.SetFocus
Exit Sub
End If
Set rngTreffer = Tabelle1.Range("A:A").Find _
(what:=Me.TextBox1.Value, lookat:=xlWhole)
If rngTreffer Is Nothing Then
IngZeileFrei = _
Tabelle1.Cells(Tabelle1.Rows.Count, 1).End(xlUp).Row + 1
For i = 1 To 10
Tabelle1.Cells(IngZeileFrei, i).Value = "_"       'Hier zeigt es eine Fehlermeldung beim Debuggen an
Me.Controls("TextBox" & i).Value
Next i
'Else
'MsgBox "Der Satz mit der Nr. " & Me.TextBox1.Value & _
'"Ist bereits vorhanden!"
End If
wird:

Private Sub Button5_DatensatzErfassen_Click()
Dim rngTreffer As Range
Dim IngZeileFrei As Long
Dim i As Integer
If Leerstand_pruefen(Me.TextBox2, Me.Label1.Caption) Then Exit Sub
If Leerstand_pruefen(Me.TextBox5, Me.Label28.Caption) Then Exit Sub
If Leerstand_pruefen(Me.TextBox1, Me.Label3.Caption) Then Exit Sub
Set rngTreffer = Tabelle1.Range("A:A").Find(what:=Me.TextBox1.Value, lookat:=xlWhole)
If rngTreffer Is Nothing Then
IngZeileFrei = Tabelle1.Cells(Tabelle1.Rows.Count, 1).End(xlUp).Row + 1
For i = 1 To 10
Tabelle1.Cells(IngZeileFrei, i).Value = Me.Controls("TextBox" & i).Value
Next i
End If
End Sub
Private Function Leerstand_pruefen(ByRef Ctr As Control, ByRef TextElt As Control) As Boolean
If Ctr.Value = "" Then
MsgBox "Im Feld" & TextElt.Caption & "fehlt die Eingabe!"
Ctr.SetFocus
Leerstand_pruefen = True
End If
End Function
VG
Yal
Anzeige
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 15:00:31
Max
Hallo Yal,
wie immer vielen Dank für deine Hilfe! Ich habe mich inzwischen von der Multibox getrennt und angefangen im Code aufzuräumen (also in der richtigen Datei). Ich erstelle jetzt 6 Userformen, die ich teilweise fast 1 zu 1 übernehmen kann, da die Funktionen fast gleich sind. Auch die Benennung muss ich noch anpassen, hätte ich wahrscheinlich schon von Beginn an machen sollen ;)
Wenn du mir jetzt noch erklären kannst, warum der Button mit "Datensatz ändern" nicht funktioniert (wahrscheinlich nur ein kleiner Fehler meinersets, deine Kollegen haben bereits Vorarbeit geleistet), dann kann ich euch die nächsten Tage ungestört lassen und habe erstmal alle Funktionen, die ich benötige ;-).
Wenn ich dir noch eine Frage stellen dürfte: Warum bist du so fit in VBA? Machst du etwas beruflich in die Richtung oder nur privates Interesse?
Vielen Dank und beste Grüße Max

AW: Button "Datensatz Ändern" geht nicht
19.05.2022 15:28:58
Yal
Hallo Max,
RowSource: https://www.herber.de/forum/archiv/1688to1692/1688774_ListBox_Rowsource_mit_Range_fuellen.html
Du willst vielleicht bei "Datensatz_ändern" vom Userform in das Blatt schreiben, oder?
Was muss dann links und was rechts des Zuweisungszeichens ("=") stehen?
Also nicht

Private Sub Button4_DatensatzÄndern_Click()
With Me.ListBox1
TextBox1 = wks.Cells(.ListIndex + 75, 1)
ComboBoxFirma1_Maschine = wks.Cells(.ListIndex + 75, 2)
TextBox5 = wks.Cells(.ListIndex + 75, 3)
TextBox2 = wks.Cells(.ListIndex + 75, 4)    'er zeigt mir hier einen Fehler an
TextBox10 = wks.Cells(.ListIndex + 75, 6)
TextBox11 = wks.Cells(.ListIndex + 75, 7)
TextBox12 = wks.Cells(.ListIndex + 75, 8)
TextBox13 = wks.Cells(.ListIndex + 75, 9)
TextBox14 = wks.Cells(.ListIndex + 75, 10)
TextBox15 = wks.Cells(.ListIndex + 75, 11)
TextBox16 = wks.Cells(.ListIndex + 75, 12)
TextBox17 = wks.Cells(.ListIndex + 75, 13)
'RowSource = "'" & wks.Name & "'!A" & Zeil & ":M" & LR
End With
End Sub
sondern

Private Sub Button4_DatensatzÄndern_Click()
Dim i
Const cVersatz = 75
With Me.ListBox1
wks.Cells(.ListIndex + cVersatz, 1) = TextBox1
wks.Cells(.ListIndex + cVersatz, 2) = ComboBoxFirma1_Maschine
wks.Cells(.ListIndex + cVersatz, 3) = TextBox5
wks.Cells(.ListIndex + cVersatz, 4) = TextBox2
For i = 6 To 13
wks.Cells(.ListIndex + cVersatz, i) = Me.Controls("TextBox" & i + 4)
Next i
End With
End Sub
VG
Yal
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 15:33:03
Yal
Äh? Ein With zu verwenden für den ListCount, das sich wiederholt...

Private Sub Button4_DatensatzÄndern_Click()
Dim i
Dim Zeile As Long
Zeile = Me.ListBox1.ListIndex + 75
wks.Cells(Zeile, 1) = TextBox1
wks.Cells(Zeile, 2) = ComboBoxFirma1_Maschine
wks.Cells(Zeile, 3) = TextBox5
wks.Cells(Zeile, 4) = TextBox2
For i = 6 To 13
wks.Cells(Zeile, i) = Me.Controls("TextBox" & i + 4)
Next i
End Sub
VG
Yal
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 16:51:36
Max
Hallo Yal,
nochmals vielen Dank, es klappt endlich, dass es die Spalten überschreibt. Zwar noch nicht an der richtigen Stelle, aber da finde ich bestimmt was im Netz.
Danke Danke Danke für deine Hilfe!
Viele Grüße Max
AW: Button "Datensatz Ändern" geht nicht
19.05.2022 19:59:52
Yal
Hallo Max,
nein, in dem Fall nicht im Netz, sondern in deinem Coding.
Lasst den Code in Schritt-Modus laufen und schaue den Inhalt der Variablen. Nur so kommst Du auf der Spur.
VG
Yal
AW: Button "Datensatz Ändern" geht nicht
20.05.2022 09:57:00
Max
Hallo Yal,
Ich verstehe wie du das Ganze Codetechnisch umgesetzt hast. Du setzt die Zeile als Variable fest und machst sie abhängig von dem ListIndex und addierst 75 darauf, somit musst du die Zeile nicht jedes mal neu eingeben, sondern nimmst einfach die Summe aus beiden und hast die Zeile. Da ich in meiner ListBox aber nur die letzten 20 EInträge anzeigen lasse, funktioniert dieses System nur bis 20 Einträge in der Tabelle sind, danach überschreibt es die Alten (ich setze dabei voraus, dass man immer nur den letzten Eintrag aus der ListBox verändert). Gibt es nicht eine Möglichkeit, die Zeilenanzahl direkt aus der Tabelle herauszulesen und die anstatt der "Zeile" in deinem Code einzufügen? Dann müsste das System doch funktionieren oder?
VG Max
AW: Button "Datensatz Ändern" geht nicht
20.05.2022 10:07:59
Yal
Hallo Max,
2 Strategien:
_ Du legst irgendwo in dem Eintrag der Listbox, z.b. auf eine nicht sichtbare "Spalte" den Nummer der Quellzeile aus dem Blatt. Da hast Du das Risiko, das durch einen Löschen/addieren von Zeile(n) diese Wert sehr schnell nicht mehr stimmt, oder
_ Du hast in der Quelle pro Zeile ein eindeutige Bezeichner ("Schlüssel", engl. "Key", den Du auch in der Listbox reinbringt), den Du per Suche sofort finden kann. Das ist die "Datenbank"-Ansatz. Datensätze, die nachträglich einzel geändert werden sollen, müssen auch eindeutig identifizierbar.
VG
Yal
AW: Button "Datensatz Ändern" geht nicht
20.05.2022 10:11:56
Max
Hallo Yal,
Danke für die zügige Antwort. Du meinst wie eine ID bei Sharepoint-Listen? Das ist eine gute Idee, ich versuch mal, ob ich das umsetzen kann.
Gruß Max

259 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige