Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1932to1936
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

wir brauche eure Hilfe

wir brauche eure Hilfe
03.07.2023 18:43:34
Moni

Hallo zusammen, mein Mann, Freunde von uns und ich brauchen eure Hilfe.

Wir sind Laien und versuchen uns an einer Datei. aber es klappt leider nicht so wie gewünscht. Trotz Hilfe von Onur und GerdL... Dafür erstmal vielen Dank an euch!!

wahrscheinlich haben wir immer nur in Rätseln gesprochen oder nur Teile von dem erwähnt was wir gerne hätten..

Ich habe mal eine Datei hinzugefügt, wo alle Problem geschildert sind. Vielleicht kann uns jemand helfen oder wenigstens Tipps geben...( lasst es sein, es bringt sowieso nix, so einen Tipp nicht!!, jeder fängt mal klein an :-) )

wir wären wirklich sehr dankbar für weitere Hilfe oder Anregungen. lg Moni

https://www.herber.de/bbs/user/159801.xlsm

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: wir brauche eure Hilfe
03.07.2023 20:31:02
Yal
Moin Moni,

Eigentlich ist die Schaltfläche "Vom Listbox ins Textbox überschreiben" überflüssig, weil diese Aktion bereits erfolgt, wenn ein Element aus Listbox angeklickt wird.

Es sind 3 Aktionen:
_ von der Listbox in den Textboxen
_ von Textboxen in die Liste auf Blatt Tabelle2 (was eigentlich eine "intelligente Tabelle", die "Tabelle1" heisst. Die Namen sind äusserst unglücklich)
_ von der Liste auf Tabelle2 in die Listbox

Aber nur 2 Ereignisse:
_ klicken auf der Listbox
_ klicken auf "Speichern auf Blatt Tabelle2"
aber noch dem Wechseln zum Blatt "Tabelle1"

Daher sollte man die Aktionen-Prozedure von den Ereignis-Prozedure trennen.
Die 2+1 Ereignis-Prozeduren sind folgende:
Private Sub CommandButton1_Click()
    TextBoxInsTabelle_speichern
    Listbox_befuellen
End Sub

Private Sub ListBox1_click()
    VonListboxInsTextbox_übertragen
End Sub

Private Sub Worksheet_Activate()
    Listbox_befuellen
End Sub
Man sieht: Listbox_befuellen kommt zweimal vor!

Die 3 Aktion-Prozeduren:
Private Sub Listbox_befuellen()
'Die letzte befüllte Zeile aus Tabelle2 wird an erster Stelle in der Listbox auf Tabellenblatt 1 angezeigt
Dim X As Long
  
    With ListBox1
        .Clear
        .ColumnCount = 3
    End With
    With Worksheets("Tabelle2").ListObjects("Tabelle1")
        For X = .ListRows.Count To 1 Step -1
            If .ListRows(X).Range(1) > "" Then
                ListBox1.AddItem .ListRows(X).Range(1).Value
                ListBox1.List(ListBox1.ListCount - 1, 1) = .ListRows(X).Range(2).Value
                ListBox1.List(ListBox1.ListCount - 1, 2) = .ListRows(X).Range(3).Value
            End If
        Next
    End With
End Sub

Private Sub TextBoxInsTabelle_speichern()
    With Worksheets("Tabelle2").ListObjects("Tabelle1").ListRows.Add
        .Range(1) = TextBox1.Text
        .Range(2) = TextBox2.Text
        .Range(3) = TextBox3.Text
    End With
End Sub

Private Sub VonListboxInsTextbox_übertragen()
'Die Textboxen werden mit der Markierten Zeile der Listbox gefüllt
Dim R As Long
    
    With ListBox1
        TextBox1.Text = .List(.ListIndex, 0)
        TextBox2.Text = .List(.ListIndex, 1)
        TextBox3.Text = .List(.ListIndex, 2)
    End With
End Sub
CommandButton2 mit der aktuelle Funktion "markiertes auf Listbox in die Textboxen" ist überflüssig. Man könnte es verwenden, um den im Listbox markierte Eintrag zu löschen:
Private Sub CommandButton2_Click()
Dim R As Long

    With ListBox1
        For R = 0 To .ListCount - 1
            If .Selected(R) Then
                ZeileInTabelle_löschen .List(R, 0) & ";" & .List(R, 1) & ";" & .List(R, 2)
                Listbox_befuellen
                Exit For
            End If
        Next
    End With
End Sub

Private Sub ZeileInTabelle_löschen(ByVal Eintrag As String)
Dim L
    
    For Each L In Worksheets("Tabelle2").ListObjects("Tabelle1").ListRows
        If L.Range(1) & ";" & L.Range(2) & ";" & L.Range(3) = Eintrag Then
            L.Delete
            Exit Sub
        End If
    Next
End Sub
VG
Yal


Anzeige
AW: wir brauche eure Hilfe
03.07.2023 22:14:06
Moni
wow Yal!

vielen Dank!!!!!, für die Codes und die super Erklärung!!! lg Moni


AW: wir brauche eure Hilfe
03.07.2023 22:18:15
Yal
Ich Depp! Ich ärgere mich.

Private Sub CommandButton2_Click()
    With ListBox1
        ZeileInTabelle_löschen .List(.ListIndex, 0) & ";" & .List(.ListIndex, 1) & ";" & .List(.ListIndex, 2)
        Listbox_befuellen
    End With
End Sub
Ist doch wesentlich einfacher. Die Prozedur "ZeileInTabelle_löschen" bleibt unverändert.

VG
Yal


AW: wir brauche eure Hilfe
04.07.2023 06:45:04
Moni
hallo Yal.

es klappt soweit super.. aber was nicht klappt, ist die markierte Zeile mit den Textboxinhalten zu überschreiben. wenn ich commandbutton 2 drücke, wird die markierte Zeile gelöscht. das ist auch sehr gut.! soll dann jetzt auch so bleiben. Aber wir würden dann noch gerne einen Commandbutton 3 einfügen, der die markierte Zeile überschreibt. mit deiner Hilfe

lg Moni


Anzeige
AW: wir brauche eure Hilfe
04.07.2023 08:40:16
Yal
Hallo Moni,

geliefert wie bestellt, :-)
Vielleicht weil die Aufgaben in der gesamten Datei verteilt waren, habe ich die Anforderung "ersetzen" übersehen.
Es wäre dann eine Kombination von "Suche in der Liste auf Tabelle 2 der richtigen Eintrag" und" füge die Daten ein". Beide Teilaufgaben sind bereits vorhanden. Schafft ihr es diese zusammen zu bringen?
(Tipp: der Stand der Textboxen muss vor der Änderung, also bei der Übertragung Listbox zu Textboxen, "auf die Seite genommen" werden, um diese in der Speicherliste zu finden.)

VG
Yal


AW: wir brauche eure Hilfe
04.07.2023 09:02:05
Moni
guten Morgen Yal.

nein soweit sind wir leider noch nicht.


Anzeige
AW: wir brauche eure Hilfe
04.07.2023 09:09:50
Moni
so in der Art?
Sub Eintragüberschreiben()

    With Worksheets("Tabelle2").ListObjects("Daten").ListRows.Add
    With ListBox1
        .List(.ListCount - 1, 1) = TextBox1.Text
        .List(.ListCount - 1, 2) = TextBox2.Text
        .List(.ListCount - 1, 3) = TextBox3.Text
    End With
 End With
End Sub


AW: wir brauche eure Hilfe
04.07.2023 10:14:45
Yal
Hallo Moni,

VBA liest sich wie ein Roman...
Worksheets("Tabelle2").ListObjects("Daten").ListRows.Add
heisst: auf dem Blatt "Tabelle2" nimm das ListObject "Daten" (ListObject ist das VB-Pendant von "intelligente Tabelle", die man in Excel mit "Einfügen", "Tabelle" einrichtet) und an der Auflistung der Listenzeilen (ListRows, Auflistung oder "Sammlung" enden immer einen "s") wird eine Zeile hinzugefügt ".Add"

Mit einem "With" davor wird eine Referenzierung gemacht. Alles was zwischen "With" und "End With" mit einem Punkt anfängt, bezieht sich darauf. Also in dem Fall auf die hinzugefügte Zeile. Es sei denn ein With-End With sich dzwischen reinschleicht.

Daher der Code oben beinhaltet einige unnötigen Zeilen.

Was Ihr braucht ist: auf Basis der markierte Zeile in Listbox1 einen "Satz" (Semikolon-getrennt) erzeugen, in der Listobject diese Zeile suchen, wenn gefunden diese Zeile ersetzen.

VG
Yal


Anzeige
AW: wir brauche eure Hilfe
04.07.2023 11:00:47
Moni
danke für deine Mühe Yal !!

aber das bekommen wir noch nicht hin...

lg


AW: wir brauche eure Hilfe
04.07.2023 11:48:12
Yal
Hallo Moni & co,

Es muss eine neue Schaltfläche "CommandButton3" eingefügt werden (ActiveX-Element).

Der gesamte Code (siehe auch geänderte "ZeileInTabelle_ersetzen") sieht dan so aus:

'--------------------------------------------
' Eriegnis-Prozeduren
Private Sub CommandButton1_Click()
    TextBoxInsTabelle_speichern
    Listbox_befuellen
End Sub

Private Sub CommandButton2_Click()
    ZeileInTabelle_ersetzen ListIndexSatz_bilden, TextBox1.Text & ";" & TextBox2.Text & ";" & TextBox3.Text
    Listbox_befuellen
End Sub

Private Sub CommandButton3_Click()
    ZeileInTabelle_ersetzen ListIndexSatz_bilden 'zweite Param "Ersatz" nicht vorhanden = Löschen
    Listbox_befuellen
End Sub

Private Sub ListBox1_click()
    VonListboxInsTextbox_übertragen
End Sub

Private Sub Worksheet_Activate()
    Listbox_befuellen
End Sub

'--------------------------------------------
'"normale" Prozeduren
Private Sub Listbox_befuellen()
'Die letzte befüllte Zeile aus Tabelle2 wird an erster Stelle in der Listbox auf Tabellenblatt 1 angezeigt
Dim X As Long
  
    With ListBox1
        .Clear
        .ColumnCount = 3
    End With
    With Worksheets("Tabelle2").ListObjects("Tabelle1")
        For X = .ListRows.Count To 1 Step -1
            If .ListRows(X).Range(1) > "" Then
                ListBox1.AddItem .ListRows(X).Range(1).Value
                ListBox1.List(ListBox1.ListCount - 1, 1) = .ListRows(X).Range(2).Value
                ListBox1.List(ListBox1.ListCount - 1, 2) = .ListRows(X).Range(3).Value
            End If
        Next
    End With
End Sub

Private Sub TextBoxInsTabelle_speichern()
'Daten von Textbox1,2,3 werden in eine neue Zeile von Listobject gespeicehrt
    With Worksheets("Tabelle2").ListObjects("Tabelle1").ListRows.Add
        .Range(1) = TextBox1.Text
        .Range(2) = TextBox2.Text
        .Range(3) = TextBox3.Text
    End With
End Sub

Private Sub VonListboxInsTextbox_übertragen()
'Die Textboxen werden mit der Markierten Zeile der Listbox gefüllt
    With ListBox1
        TextBox1.Text = .List(.ListIndex, 0)
        TextBox2.Text = .List(.ListIndex, 1)
        TextBox3.Text = .List(.ListIndex, 2)
    End With
End Sub

Private Sub ZeileInTabelle_ersetzen(ByVal Eintrag As String, Optional Ersatz As String = "")
'Eintrag wird in Listobject gesucht, wenn Ersatz vorhanden: ersetzen, wenn nicht: löschen
Dim L
Dim Arr
    For Each L In Worksheets("Tabelle2").ListObjects("Tabelle1").ListRows
        If L.Range(1) & ";" & L.Range(2) & ";" & L.Range(3) = Eintrag Then
            If Ersatz = "" Then
                L.Delete
            Else
                On Error Resume Next
                Arr = Split(Ersatz, ";")
                L.Range(1) = Arr(0)
                L.Range(2) = Arr(1)
                L.Range(3) = Arr(2)
            End If
            Exit Sub
        End If
    Next
End Sub

Private Function ListIndexSatz_bilden() As String
    With ListBox1
        ListIndexSatz_bilden = .List(.ListIndex, 0) & ";" & .List(.ListIndex, 1) & ";" & .List(.ListIndex, 2)
    End With
End Function
Aufgaben werden hier klein-geteilt, z.B. "ListIndexSatz_bilden": diese wird an 2 Stellen gerufen/verwendet, daher macht es sinn, diese in einer separaten Function abzulagern, muss aber nicht (eine Function ist eine Sub, die eine Werte zurückgibt).

VG
Yal


Anzeige
AW: wir brauche eure Hilfe
04.07.2023 12:23:37
Moni
Hallo Yal !!

Es klappt genauso wie gewünscht.. Super vielen Dank von mir & Co.

Super das du auch die Schritte erklärst..

1000 Dank nochmal!!

lg Moni

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige