Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1732to1736
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
Inhaltsverzeichnis

Listbox Einträge hinzufügen, vorhandene ändern

Listbox Einträge hinzufügen, vorhandene ändern
13.01.2020 16:06:34
Peer
Hallo.
Ich habe in meinem Projekt eine Userform frm_Suche, bei der die Inhalte vom Sheet "Reiseziele" _ A1:C eingelesen werden.

Private Sub UserForm_Initialize()
''* H. Ziplies                                     *
''* 30.10.10                                       *
''* erstellt von HajoZiplies@web.de                *
''* http://Hajo-Excel.de
''die Sortierung der ListBox wird im Blattmodul "Reiseziele" Worksheet_Deactivate() geregelt
Application.ScreenUpdating = False
With Worksheets("Reiseziele")
' letzte belegte Zeile unabhängig von Excelversion für Spalte A (1)
LoLetzte = IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .  _
_
Rows.Count)
.Sort.SortFields.Clear
.Sort.SortFields.Add _
Key:=Range("B1:B" & LoLetzte), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
With .Sort
.SetRange Worksheets("Reiseziele").Range("A1:C" & LoLetzte)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.ScreenUpdating = True
' Adressbereich der Listbox zuweisen
lst_Zieladresse.RowSource = .name & "!A1:C" & LoLetzte
lst_Zieladresse.ColumnCount = 3  ' Spaltenanzahl der Listbox einstellen
End With
End Sub

In drei Textboxen werden die Listeneinträge bei Klick auf den Eintrag geschrieben.

Private Sub lst_Zieladresse_Change()
If lst_Zieladresse.Tag  "" Then Exit Sub
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0)
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
End Sub

und mit

Private Sub btn_Add_Click()
Dim lngEmptRow As Long
Dim i As Integer
With Sheets("Reiseziele")
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
End With
txt_PLZ = ""                                   'löscht Textboxen
txt_Ort = ""
txt_Strasse = ""
i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
End Sub
wieder in die Tabelle zurück geschrieben, wenn ich den Button btn_Add drücke.
Nun möchte ich den vorhandenen Eintrag in den Textboxen ändern und die Änderung zurückschreiben, ohne das der Wert doppelt erscheint (also nur überschreiben). Der neue Wert wird hinzugefügt.
Wie kann ich den selektierten Wert(e) überschreiben?
Bis jetzt schreibt mein Code nur die Werte in die Tabelle und aktualisiert die ListBox und es kommen "doppelte Werte" darin vor.
LG
Peer

29
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
13.01.2020 17:44:32
Matthias
Moin!
Lies in deine Listbox in einer vierten Spalte (die lässt du aber nicht mit anzeigen) die Zeile aus der Tabelle. Wenn du nun einen Wert anklickst, weißt du auch genau, in welcher Zeile die Grunddaten standen. Falls sich zwischen anklicken und abspeichern die Listbox bzw. deren listindex ändert, kannst du die Zeile auch in einer globalen Variable oder der tag Eigenschaft eines Controls zwischenspeichern.
VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
13.01.2020 18:40:57
Peer
Hallo Matthias.
Das habe ich schon mal gelesen.
Ich habe aktuell den Überblick verloren, wo ich die Spalte einfügen muss und wie.
Allein im
Userform_Initialize() und ListBox.ColumnCount=4
reicht nicht.
Auch

i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
hilft nicht.
Wie kann ich deinen Vorschlag umsetzen?
LG
Peer
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
13.01.2020 19:37:39
Werner
Hallo Peer,
du liest doch die Daten für die Listbox mit RowSource ein, und zwar ab Zeile 1 des Tabellenblattes.
Damit hast du doch quasi die Zeile wo die Daten her kommen schon in der Listbox.
Der erste Listboxeintrag kommt aus Zeile 1, der zweite aus Zeile 2......
Somit entspricht der Listindex des Eintrages + 1 der Zeile, aus der dein Datensatz kommt. + 1 weil in der Listbox der erste Eintrag den Index 0 hat.
Gruß Werner
AW: Listbox Einträge hinzufügen, vorhandene ändern
13.01.2020 19:50:38
Peer
Hallo Werner.
Vielen Dank für deine Hilfe.
Ok, aber wo schreibe ich das hin?
Beim Initialize Event?

' Adressbereich der Listbox zuweisen
lst_Zieladresse.RowSource = .name & "!A1:C" & LoLetzte
lst_Zieladresse.ColumnCount = 4  ' Spaltenanzahl der Listbox einstellen

oder bei

Private Sub lst_Zieladresse_Change()
'bei Klick auf Eintrag in Listbox Spalten in TextBoxen übertragen
If lst_Zieladresse.Tag  "" Then Exit Sub
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0)
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
End Sub

Und wie soll das aussehen?
var=lst_Zieladresse.List(lst_Zieladresse.ListIndex +1)

Gruß
Peer
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 09:31:19
Matthias
Moin!
Wenn du mit RowSource arbeitest (kann Datei nixht öffnen, deshalb wußte ich das nicht) brauchst du an deiner Listbox nix ändern. Also keine vierte Spalte etc.. Der Inhalt ist da ja ein Verweis auf das TAbellenblatt. Wenn das in Zelle A1 beginnt, ist dein erster Eintrag in der LB der zugehörige. Der hat dann aber den index 0 (LB ist 0 beginnend). deshalb dann 1 dazurechnen. Startet deine RowSource ab A2 dann halt +2 rechnen. DAmit weißt du schon, wo du grad was auswählst. Meine Variante war nur dafür gedacht, wenn du dir eine Liste selber zusammenstellst.
Einfügen würde ich das alle in dein Private Sub btn_Add_Click() . Nur dort ist es ja von Interesse. Dabei mußt du unterscheiden, ob du eine Zeile änderst oder eine neue einfügst. Für neue Zeilen bietet sich an den Listindex der lB auff -1 (also nix ausgwählt) zu setzen. Das kannst du ja mit einem kleinen Button "neu" machen. Damit weiß dein Code dann eindeutig was er machen soll. In der Prozedur könnte es dann so aussehen:
Private Sub btn_Add_Click()
Dim lngEmptRow As Long
Dim i As Integer
If lst_Zieladresse.ListIndex = -1 Then
'nix ausgewählt, neue Zeile
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Else
'die ausgewählte Zeile wird überschrieben, ggf. noch eine Msgbox und abklären ob  _
richtig
lngEmptRow = lst_Zieladresse.ListIndex + 1
End If
With Sheets("Reiseziele")
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
End With
txt_PLZ = ""                                   'löscht Textboxen
txt_Ort = ""
txt_Strasse = ""
i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
End Sub

VG
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 16:30:22
Peer
Hallo Matthias.
Vielen Dank für deine Erklärung.
Ich habe den Code jetzt einfach mal eingefügt um zu sehen, was er macht, aber ich bekomme die _ Meldung vom Debugger bei

If lst_Zieladresse.ListIndex = -1 Then
'nix ausgewählt, neue Zeile
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Else
'die ausgewählte Zeile wird überschrieben, ggf. noch eine Msgbox und abklären ob  _
richtig
lngEmptRow = lst_Zieladresse.ListIndex + 1
End If
Ihm fehlt der Bezug. Ich hatte davor Sheets("Reiseziele") gesetzt, aber er kommt nicht weiter.
Er bleibt dann bei

With Sheets("Reiseziele")
'lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
End With
hängen.
https://www.herber.de/bbs/user/134396.xlsm
Gruß
Peer
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 16:55:51
Matthias
Moin!
Ja, das hatte ich vergessen hochzusetzen. Weiß jetzt nicht, ob da vllt. beim Einfügen bei dir was schief gelaufen ist oder das end with fehlte. So sollte es passen - ungetestet.
Private Sub btn_Add_Click()
Dim lngEmptRow As Long
Dim i As Integer
With Sheets("Reiseziele")
If lst_Zieladresse.ListIndex = -1 Then
'nix ausgewählt, neue Zeile
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Else
'die ausgewählte Zeile wird überschrieben, ggf. noch eine Msgbox und abklären ob _
richtig
lngEmptRow = lst_Zieladresse.ListIndex + 1
End If
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
End With
txt_PLZ = ""                                   'löscht Textboxen
txt_Ort = ""
txt_Strasse = ""
i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
End Sub

VG
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 18:13:26
Peer
Hallo Matthias.
Stimmt, die With Anweisung gehört ganz oben hin, aber der Fehler bei

.cells(lngEmptRow, 1).Value = txt_PLZ_Text 
bleibt.
Das sind ja die Werte in den TextBoxen, die wieder zurück zu "Reiseziele" geschrieben werden?
LG
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 20:03:35
Matthias
Moin!
Wie gesagt, ich kann leider mit deiner Datei nicht arbeiten. Deshalb mal die Frage, was für ein Fehler tritt auf? An welcher Stelle tritt er auf (erst beim Zurückschreiben)? Ansosten schau mal, welchen Wert die Variable lngEmptRow beim Auftreten des Fehlers hat. Notfalls gib mal an Stelle vom .cells den kompletten Pfad an also worksheets("Reiseziele").cells usw.
VG
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 20:27:05
Peer
Hallo Matthias.
Warum konntest/kannst du mit meiner Datei nicht arbeiten?
Ich habe den Laufzeitfehler 1004 wahrscheinlich gefunden. Der Blattschutz.
Ich habe dies dahingehend geändert...

Private Sub btn_Add_Click()
Dim lngEmptRow As Long                          'schreibt Textboxen in Tabelle
Dim i As Integer                                'füllt Listbox aus Tabelle1
Sheets("Reiseziele").Unprotect
With Sheets("Reiseziele")
.Unprotect
If lst_Zieladresse.ListIndex = -1 Then
'nix ausgewählt, neue Zeile
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Else
'die ausgewählte Zeile wird überschrieben, ggf. noch eine Msgbox und abklären ob  _
richtig
'MsgBox "Eingabe bestätigen ", vbOKOnly, "Eingabe"
lngEmptRow = lst_Zieladresse.ListIndex + 1
End If
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
.Protect
End With
'löscht Textboxen
txt_PLZ = ""
txt_Ort = ""
txt_Strasse = ""
i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
Sheets("Reiseziele").Protect
End Sub

Aber ein neuer Wert wird zwar eingetragen, aber ein vorhandener, der in den drei TextBoxen geändert wird, nicht aktualisiert.
Gruß
Peer
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
14.01.2020 22:43:29
Matthias
Moin!
Wenigstens scheint der Fehler schonmal weg zu sein. Deine Datei hängt sich nach dem Start bei mir auf. Deine letzten beiden Userforms (ich glaube suche und tag) haben (zumindest für mein System) immer eine Fehler. Da ist nicht genügend Speicherplatz vorhanden. Wenn ich sie rauslösche geht die Datei - ist dann aber blöd, wenn man die UF testen muss/will.
Aber zu deinem Problem.
ICh vermute, dass der listindex verloren geht. Schaue mal im Code, wie beim Durchlauf des Markos der listindex ist. Ich vermute, er ist -1. Musste jezt beim Schreibem mal kurz Pause machen und habe die Datei nachgebaut. Fehler gefunden. Das Problem ist, dass deine unterschiedlichen Events sich gegenseitig beeinflussen. DAs Schreiben ins Blatt löst das Cange der LB aus, das dann wieder das Click der LB auslöst. Dadurch wird der Wert in der TB gelöscht nix eingetragen.
Lösung. Lege eine zweite globale Variable Schalter an - schalter 2. Ud setze den vorm SChreiben in das Blatt und danach wieder raus. Beim Change frage den Wert ab. Sollte so aussehen.
 Dim LoLetzte As Long                                ' Variable für Letzte Zeile
Dim schalter As Boolean, schalter2 As Boolean
Private Sub btn_Add_Click()
Dim lngEmptRow As Long                          'schreibt Textboxen in Tabelle
Dim i As Integer                                'füllt Listbox aus Tabelle1
Sheets("Reiseziele").Unprotect
With Sheets("Reiseziele")
.Unprotect
If lst_Zieladresse.ListIndex = -1 Then
'nix ausgewählt, neue Zeile
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Else
'die ausgewählte Zeile wird überschrieben, ggf. noch eine Msgbox und abklären ob _
richtig
'MsgBox "Eingabe bestätigen ", vbOKOnly, "Eingabe"
lngEmptRow = lst_Zieladresse.ListIndex + 1
End If
schalter2 = True
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
schalter2 = False
.Protect
End With
'löscht Textboxen
txt_PLZ = ""
txt_Ort = ""
txt_Strasse = ""
i = Sheets("Reiseziele").UsedRange.Rows.Count
With lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
Sheets("Reiseziele").Protect
End Sub
Private Sub lst_Zieladresse_Change()
If schalter2 = True Then Exit Sub
If lst_Zieladresse.Tag  "" Then Exit Sub
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0)
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
End Sub
Ehrlich gesagt, ist das aber unschön - zuviel Variablen, bei denen mal schnell den Überblick verliert. Auf Grund des RowSource aber wohl nicht ander möglich, da jedes Schreiben ins Blatt ein Click auslöst und damit die TB mit den altern Werten überschreibt.
VG
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 10:08:12
Peer
Hi Matthias.
Ich hatte die Fehlermeldung wegen des Arbeitsspeichers auch.
Der kam, wenn ich eine weitere Excel-Datei offen hatte und im Editor gearbeitet habe und danach geschlossen habe.
Keine Ahnung, warum das so ist. Ich kann dir die vollständige Datei auch einmal per PN schicken, die aber 600 kb groß ist.
Vielen Dank für deine Hinweise, die nun endlich funktionieren. Es stimmt, ich habe mehrere Events gleichzeitig, unabhängig von den Eingabe-Events in die Tabellen.
Momentan habe in den 3 TB den Wert aufgeteilt von dem selektierten Listeneintrag. Einmal wird durch Doppelklick der Wert in die vorherige Userform geschrieben und anderseits besteht auch die Möglichkeit, den selektierten Wert, der ja jetzt in den 3 TB steht, durch das Klick-Event des OK-Buttons zurückzuschreiben. Und weiter das Event, das den selektierten Wert über die 3 TB ändert bzw neu schreibt.
Vielleicht sollte ich mich von dem Doppelklick Event trennen.
LG
Peer
Anzeige
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 10:40:35
Peer
Hi Matthias.
Bei durchprobieren ist aufgefallen, das nach dem Hinzufügen des schalters2 die Suche-Routine _ bei

Private Sub lst_Zieladresse_Change()
'bei Klick auf Eintrag in Listbox Spalten in TextBoxen übertragen
If lst_Zieladresse.Tag  "" Then Exit Sub
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0) _
b>
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
End Sub
hängen bleibt.
"Kaufzeitfehler 381 - ListIndex des Eigenschaftsfelder ungültig"
LG
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 11:54:42
Matthias
Moin!
In der Routine musst du den Schalter aber auch einbauen. Weiß nicht ob du ihn auf Grund des Fehlers rausgenommen hast oder es nur übersehen hast. HIer nochmal, so sollte das Change aussehen:
Private Sub lst_Zieladresse_Change()
If schalter2 = True Then Exit Sub
If lst_Zieladresse.Tag  "" Then Exit Sub
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0)
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
End Sub

Zumindest in meinem Nachbau läuft der Code durch. Aufpassen noch, das du schalter2 auch angelegt hast. Wenn der Fehler weiter besteht, welchen Wert hat den der Listindex dort.
Bzgl. der Datei liegt es glaube ich nicht am Upload sondern der Datei. Wir hatten letztes Jahr ja auch mal versucht nur die UF in einer Datei hochzuladen. Da kam das gleiche Problem. Dafür überlege ich mir mal noch was.
VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 14:24:18
Matthias
Moin!
Ich nochmal allerdings offtopic (zumindest zum Teil). Da ich deine UF nicht öffnen und testen kann, hätte ich einen Vorschlag. Da ich mit den Code mittels OO rausziehen kann aber der Aufbau / Einstellungen fehlt, hätte ich hier einen kleinen Code gebastelt. Damit liest er deine (bei mir) problematisch UF aus und speichert die Einstellungen dazu. Diese werden in zwei Textdateien im selben Ordner wie deine Exceldatei abgespeichert. Wenn du die beiden TXT Dateien hochladen könntest, könnte ich sie mit dem Gegenstück erstellen und dann auch testen. Ist aber nur ein Vorschlag kein muss. Der Code macht sonst nix weiter. Er ist auch so angepasst (Namen der UF etc.), das (eigentlich :-) ) kein Fehler auftreten sollte.
Sub auslesen()
Dim elemart
Dim eintrag
Dim fso, ufdaten, meineuf
Set fso = CreateObject("Scripting.FileSystemObject")
meineuf = Array(frm_Tag, frm_Suche)
For i = 0 To 1
eintrag = ""
Set temp = meineuf(i)
Set ufdaten = fso.CreateTextFile(ActiveWorkbook.Path & "\" & temp.Name & ".txt", True)
With temp
eintrag = eintrag & .Width & vbCrLf
eintrag = eintrag & .Left & vbCrLf
eintrag = eintrag & .Top & vbCrLf
eintrag = eintrag & .Height & vbCrLf
eintrag = eintrag & .Caption & "#@#"
End With
ufdaten.Write eintrag
For Each elem In temp.Controls
elemart = TypeName(elem)
Debug.Print elemart
eintrag = eintrag & elemart & vbCrLf
eintrag = eintrag & elem.Name & vbCrLf
eintrag = eintrag & elem.Width & vbCrLf
eintrag = eintrag & elem.Left & vbCrLf
eintrag = eintrag & elem.Top & vbCrLf
eintrag = eintrag & elem.Height & vbCrLf
eintrag = eintrag & elem.Visible & vbCrLf
eintrag = eintrag & elem.Enabled & vbCrLf
eintrag = eintrag & elem.ZOrder & vbCrLf
If elemart = "ComboBox" Or elemart = "ListBox" Then
eintrag = eintrag & "#RS#" & elem.RowSource & vbCrLf
eintrag = eintrag & "#RS#" & elem.ColumnCount & vbCrLf
eintrag = eintrag & "#RS#" & elem.ColumnWidth & vbCrLf
End If
If elemart = "OptionButton" Or elemart = "CheckBox" Then
eintrag = eintrag & "#GN#" & elem.GroupName & vbCrLf
End If
If elemart = "OptionButton" Or elemart = "ToggleButton" Or elemart = "CheckBox" Or elemart = _
"Frame" Or elemart = "CommandButton" Or elemart = "Label" Then
eintrag = eintrag & "#CP#" & elem.Caption & vbCrLf
End If
eintrag = eintrag & "#@#"
ufdaten.Write eintrag
eintrag = ""
Next
Next
End Sub

VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 15:40:40
Matthias
Falls du den Code nutzt, ein kleiner Fehler war doch dabei:
eintrag = eintrag & "#RS#" & elem.ColumnWidth & vbCrLf
müsste
eintrag = eintrag & "#RS#" & elem.ColumnWidths & vbCrLf
heißen. Ein s am Ende von widths.
VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 19:30:02
Peer
Hallo Matthias.
Respekt für deine Mühe.
Entschuldige meine späte Antwort. Bin jetzt erst zuhause am PC, um weiter zu arbeiten.
Beim Sub wird i bemängelt.
Dim i as integer deklarieren?
Gruß
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 19:41:47
Peer
Hi.
Ich habe den Code mal so übernommen und einem Formularbutton zugeordnet. Dabei habe ich die Variablen i, temp, elem zum letzten Dim geschrieben und keinen Typ gegeben (also variant), weil diese Variablen wurden vom Debugger nicht gefunden worden.
Beim Start des Makros mit dem Button bleibt der Debugger beim ersten Array hängen (Array(frm_Tag, frm_Suche). Ich habe im Editor nachgeschaut, die UF's heißen wirklich so.
Gruß
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
15.01.2020 20:56:59
Matthias
Moin!
Mhhhmmm. HAbe es auch mal so umgestellt und auch einen Button eine UF mit selbem Namen eingebaut. HIer funktioniert es. Den Code brauchst du übrigens nicht an einen Button zuweisen. KAnnst ihn auch in ein Modul packen und starten. Habe noch ein bissl mit anderen Varianten probiert - kann das aber nicht nachstellen. Optional kannst du mal probieren, den Anfang so zu ändern und direkt die UF zuweisen (müsstest dann halt zweimal starten und dabei die zweite UF eintragen). Da ist das Array weg, die Schleife läuft nur einmal und temp hat gleich den UF.
Set fso = CreateObject("Scripting.FileSystemObject")
For i = 0 To 0
eintrag = ""
Set temp = frm_Suche
Set ufdaten = fso.CreateTextFile(ActiveWorkbook.Path & "\" & temp.Name & ".txt", True)

Wenn das nicht geht, dann bitte keine unnötigen Bemühungen. Das war nur ein Versuch, um die UF nachzubauen.
Hat mein letzter Hinweis mit dem Schalter2 Abhilfe geschaffen oder kommt da immr noch der selbe Fehler Ablauf?
VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
16.01.2020 06:28:51
Peer
Guten Morgen Matthias.
Ich bin deinem Rat gefolgt und habe die UF einzeln eingetragen. Dabei hat frm_Suche problemlos funktioniert, frm_Tag hingegen bringt den Fehler.
Userbild
Der Hinweis mit dem schalter2 brachte keine Besserung.
Inzwischen denke ich, dass die UF frm_Tag schuld ist.
Ich schicke dir mal zumimdest die frm_Suche.txt
https://www.herber.de/bbs/user/134440.txt
LG
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
16.01.2020 12:35:28
Matthias
Moin!
Das wäre die interessante UF gewesen :-) , wobei ich auf dem Bilder keinen Fehler (Zeile etc.) erkennen kann. Aber halb so schlimm. Habe die andere jetzt so (zumindest größtenteils) wie du sie hast. Deshalb zurück zum Topic. Wenn das Private Sub lst_Zieladresse_Change() Probleme macht würde ich es einfach rausnehmen. Außer das es zu vielen Änderungen / Eintragungen einspringt und Ärger macht, brauchst du es nicht. Müsstest dann halt den Schalter2 in das Click ereignis packen, da sonst deine Textboxen wieder durch die noch vorhandenen alten ListboxEinträge überschrieben werden und sich da dann nix ändert. Sollte dann so aussehen (zumindest der Anfang der Makros):
Private Sub btn_Add_Click()
Dim lngEmptRow As Long, i As Long, auswahl As Long
With Sheets("Reiseziele") 'schreibt Textboxen in Tabelle
.Unprotect
lngEmptRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If lst_Zieladresse.ListIndex  -1 Then
auswahl = MsgBox("Wollen Sie den Eintrag aktualisieren?" & _
vbCrLf & "JA - Eintrag wird aktualisiert" & _
vbCrLf & "Nein - es erfolgt ein neuer Eintrag" & _
vbCrLf & "Abbrechen - Vorgang wird beendet", vbYesNoCancel, "Sicherheitsabfrage")
If auswahl = 2 Then Exit Sub
If auswahl = 6 Then lngEmptRow = lst_Zieladresse.ListIndex + 1
End If
schalter2 = True
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
.Protect
End With
schalter2 = False
txt_PLZ = ""                                   'löscht Textboxen
txt_Ort = ""
txt_Strasse = ""
i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "3cm;3cm;3cm"
End With
End Sub
Private Sub lst_Zieladresse_Click()
If schalter2 Then Exit Sub
schalter = True
txt_OrtSuche = lst_Zieladresse
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0)
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
schalter = False
End Sub
Private Sub lst_Zieladresse_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
frm_Tag.Controls(Me.Tag) = _
Me.lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0) & " " & _
lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1) & ", " & _
lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
End Sub
Probiere mal, ob das besser geht. HAbe das Überschreiben noch angepasst. Ansonsten würde bei jedem Click in die LB der listindex feststehen und der Datensatz überschrieben werden. Das ist aber ungut, wenn du nur reinclickst um schon mal Daten zu haben. So kannst du jetzt noch auswählen, ob du überschreiben, neu anlegen oder abbrechen willst.
VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
16.01.2020 14:40:34
Peer
Hi Matthias.
Super, es klappt.
Ich bin deinem Ratschlag gefolgt und habe das lst_Zieladresse_Change() Event auskommentiert.
Und es macht, was es soll. Bis jetzt kann ich auch keinen Fehler feststellen.
Eins ist jetzt nur noch Kosmetik.
Ich müsste die Einträge nach Doppelwerten abfragen. Und ich muss beim Ändern oder Hinzufügen die alten SpaltenBreiten beibehalten.
Gruß
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
16.01.2020 19:10:00
Peer
Die Problemeatik mit dem Löschen habe ich folgend gelöst..

Private Sub btn_Del_Click()
'Wenn nichts ausgewählt ist, dann MsgBox
If lst_Zieladresse.ListIndex  -1 Then
Worksheets("Reiseziele").Rows(lst_Zieladresse.ListIndex + 1).Delete
End If
Sheets("Reiseziele").Protect
End If
End If
End Sub

Desweiteren habe ich das Klick Event der Listbox angepasst, denn nach der Suche sollte auch die _ Spalteneinträge in die TextBoxen

Rem
Private Sub lst_Zieladresse_Click()
If schalter2 Then Exit Sub
schalter = True
txt_OrtSuche = lst_Zieladresse
txt_PLZ = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 0)
txt_Ort = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 1)
txt_Strasse = lst_Zieladresse.List(lst_Zieladresse.ListIndex, 2)
schalter = False
End Sub

Und die Spaltenbreiten habe ich dem btn_Add_Click Event

i = Sheets("Reiseziele").UsedRange.Rows.Count
With frm_Suche.lst_Zieladresse
.ColumnCount = 3
.ColumnHeads = False
.RowSource = "Reiseziele!A1:C" & i
.ColumnWidths = "1,5cm;3cm;3cm"
gleich dem Userform_Initialize Event

' Adressbereich der Listbox zuweisen
lst_Zieladresse.RowSource = .name & "!A1:C" & LoLetzte
lst_Zieladresse.ColumnCount = 3 ' Spaltenanzahl der Listbox einstellen
lst_Zieladresse.ColumnWidths = "1,5cm;3cm;3cm"
gleich gesetzt.
Fehlt nur noch die doppelten Einträge prüfen, am besten mit Meldung verhindern und gegebenenfalls mit der Meldung löschen und das Sheet aktualisieren.
Aber wie?
LG
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
16.01.2020 20:44:10
Matthias
Moin!
Das könntest du bspw. mit einer Funktion testen. Dazu vor dem Eintragen in das Blatt eine Funktion zur Prüfung aufrufen. Das könnte dann so aussehen:
 schalter2 = True
If schonda = True Then
MsgBox "Dieser Eintrag existiert bereits. Der Eintrag / Änderungen werde nicht auszugefü _
gt.", , "doppelter Eintrag"
Else
.Cells(lngEmptRow, 1).Value = txt_PLZ.Text
.Cells(lngEmptRow, 2).Value = txt_Ort.Text
.Cells(lngEmptRow, 3).Value = txt_Strasse.Text
End If
.Protect
Die Funktion schonda packst du dann mit in die Userform (bspw. ganz unten). Die würde so aussehen.
Function schonda() As Boolean
Dim daten
Dim ende As Long, zeile As Long
With Sheets("Reiseziele")
ende = .Cells(.Rows.Count, 1).End(xlUp).Row
daten = .Range("A1:C" & ende)
End With
For zeile = 1 To ende
If daten(zeile, 1) = txt_PLZ.Text And _
daten(zeile, 2) = txt_Ort.Text And _
daten(zeile, 3) = txt_Strasse.Text Then
schonda = True
Exit Function
End If
Next
schonda = False
End Function

Damit sollten keine doppelten Werte erfasst werden. Die Funktion geht jetzt alle Werte durch. Aus Performancegründen könnte man das ggf. noch mal prüfen, da die Liste ja sortiert vorliegt. D.H. nach dem selben Namen kann abgebrochen werden. Bei deinen wenigen Werten geht das aber auch. Greife deshalb schon nicht für jede Zeile auf das Blatt zu. VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
17.01.2020 09:32:41
Peer
Moin, Markus.
Danke für deinen Vorschlag umgesetzt und ausprobiert.
Ich habe noch in der Funktion die TB mit
For zeile = 1 To ende
If daten(zeile, 1) = frm_Suche.txt_PLZ.Text And _
daten(zeile, 2) = frm_Suche.txt_Ort.Text And _
daten(zeile, 3) = frm_Suche.txt_Strasse.Text Then
schonda = True
Exit Function
End If
Next
anpassen müssen.
Jetzt habe ich trotzdem eine Frage.
Ich habe in Gedanken, das man eine "allgemeine" Funktion erstellen kann und dann für jede ListBox im Projekt anpasst.
Ist die Idee realisierbar?
LG
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
17.01.2020 11:49:21
Matthias
Moin!
Fast alles ist realisierbar. :-) Du must dir am Anfang nur überlegen, was die Funktion machen soll. Davon hängt dann der Rückgabewert ab. Dann musst du schauen, was du alles prüfen willst und wie allgemein (nur ein UF oder für mehrere, verschiedene Prüfungen etc.) du es haben willst. Jenachdem baust du deine Funktion auf. Hier mal ein Beispiel:
Function myprüfung(modi As Long, bereich As Range, ParamArray Boxen() As Variant) As Long
'modi - mögliche Rückgabe, bspw. 0 gibt zurück ob vorhanden, 1 wo vorhanden (Zeile), 2 wie oft  _
vorhanden, kann noch erweitert werden
'bereich - der Breich der überpüft werden soll, hier könte auch der LB-Lst bzw. der RosSource  _
Beriech stehen, dann muss aber noch was angepasst werden
'Boxen - sind die Boxen, die überprüft werden sollen, Anzahl ist egal
Dim treffer As Long, ende As Long, zeile As Long, spalten As Long, spalte As Long
Dim treffer1 As Long
Dim gleich As Boolean
treffer = 0
treffer1 = 0
With bereich
ende = .Rows.Count
spalten = .Columns.Count
End With
'Prüfen, ob mehr / weniger Spalten als übergebene Boxen
If UBound(Boxen) + 1  spalten Then
'Fehler deshalb -1
myprüfung = -1
Exit Function
End If
For zeile = 1 To ende
gleich = False
For spalte = 1 To spalten
'hier wird alles i Text formatiert und vergleichen, nur Zahlen müsste man erst weider  _
unterscheiden
If CStr(bereich(zeile, spalte)) = Boxen(spalte - 1) Then
gleich = True
treffer = treffer + 1
If treffer1 = 0 Then treffer1 = zeile
Else
gleich = False
End If
If gleich = False Then Exit For
Next
Next
Select Case modi
Case 0: myprüfung = IIf(treffer > 0, 1, 0) '0 steht für kein, 1 für Treffer
Case 1: myprüfung = treffer1 'die Zeile in der Range wo der 1. Treffer war
Case 2: myprüfung = treffer 'die Anzahl der Treffer
Case Else
End Select
End Function
Der Aufruf würde dann wie folgt geschehen:
temp = myprüfung(0, .Range("A1:C" & lngEmptRow), txt_PLZ, txt_Ort, txt_Strasse)
Du müsstest dann temp je nach deinem eingetragenen modi auswerten.
Habe es nur auf die schnelle gestrickt und getestet. Sollte laufen. Du müsstest es aber an deine Bedürfnisse anpassen. Nicht wurden die Anzahl der Textboxen ist nicht genau festgelegt. Beim Aufruf kannst du "beliebig" viele Eintragen. Falls sie mit der Spaltenanzahl der Range nicht übereinstimmen, wird -1 zurückgegeben. Die übrgebene Range kannst du auch anders angeben, muss halt nur eine Range sein. Wills du da die RowSoruce nehmen, müsste in der Funktion bereich als variante deklariert sein. Dann müsstest du dort aber noch die Range erstellen.
Teste einfach mal.
VG
AW: Listbox Einträge hinzufügen, vorhandene ändern
17.01.2020 20:20:25
Peer
Hallo Markus.
Bin gerade erst wieder länger am PC.
Ich habe deinen Text kurz überflogen und sehe, dass es für mein VBA-Anfänger Wissen noch viel zu lernen und zu verstehen gibt.
Ich bin dieses Wochenende stark eingespannt und nächste Woche auf Tagung in Berlin. Da wird nicht viel Zeit bleiben, weiter zu machen. Schade, denn aktuell macht es mit dir richtig Spaß. Könntest fast mein Lehrer sein. ;-)
Ich möchte mich für dein Engagement bedanken und werde mich wieder melden.
Dann werde ich einfach einen neuen Thread aufmachen.
LG
Peer
AW: Listbox Einträge hinzufügen, vorhandene ändern
17.01.2020 20:52:22
Matthias
Moin!
Kein Problem, wäre nächste Woche auch unterwegs. Bzgl. meiner letzten Funktion war (auf Grund der Schnelle) ein Logikfehler drin. Da Hochzählen von Treffer und Zuweisen an Treffer1, darf erst nach der Schleife passieren, da erst dann feststeht, ob es wirklich ein Treffer ist. So sollte es eher hinhauen:
Function myprüfung(modi As Long, bereich As Range, ParamArray Boxen() As Variant) As Long
'modi - mögliche Rückgabe, bspw. 0 gibt zurück ob vorhanden, 1 wo vorhanden (Zeile), 2 wie oft  _
vorhanden
'bereich - der Breich der überpüft werden soll, hier könte auch der LB-Lst bzw. der RosSource  _
Beriech stehen
'Boxen - sind die Boxen, die überprüft werden sollen
Dim treffer As Long, ende As Long, zeile As Long, spalten As Long, spalte As Long
Dim treffer1 As Long
Dim gleich As Boolean
treffer = 0
treffer1 = 0
With bereich
ende = .Rows.Count
spalten = .Columns.Count
End With
'Prüfen, ob mehr / weniger Spalten als übergebene Boxen
If UBound(Boxen) + 1  spalten Then
'Fehler deshalb -1
myprüfung = -1
Exit Function
End If
For zeile = 1 To ende
gleich = False
For spalte = 1 To spalten
'hier wird alles i Text formatiert und vergleichen, nur Zahlen müsste man erst weider  _
unterscheiden
If CStr(bereich(zeile, spalte)) = Boxen(spalte - 1) Then
gleich = True
Else
gleich = False
End If
If gleich = False Then Exit For
Next
If gleich = True Then
treffer = treffer + 1
If treffer1 = 0 Then treffer1 = zeile
End If
Next
Select Case modi
Case 0: myprüfung = IIf(treffer > 0, 1, 0) '0 steht für kein, 1 für Treffer
Case 1: myprüfung = treffer1 'die Zeile in der Range wo der 1. Treffer war
Case 2: myprüfung = treffer 'die Anzahl der Treffer
Case Else
End Select
End Function
Das nur der Vollständigkeit halber. Falls du evtl. der andern UF noch den Aufbau entlocken kannst (kann aber nicht sagen, was am Code geändert werden muss - vllt. liegt es auch an der UF selbst), könntest du ihn auch posten.
VG

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige