Office: (Office 2016) Listbox mit mehreren Spalten

Helfe beim Thema Listbox mit mehreren Spalten in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, liebe Forum Gemeinde, nach kurzer Kommunikation per PN mit Karin (Beverly) habe ich auf Ihr Anraten ein Neues Thema erstellt. Ich weis, dass... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Merlin-1962, 25. November 2019.

  1. Listbox mit mehreren Spalten


    Hallo, liebe Forum Gemeinde,

    nach kurzer Kommunikation per PN mit Karin (Beverly) habe ich auf Ihr Anraten ein Neues Thema erstellt. Ich weis, dass dieses Thema schon einmal behandelt wurde, da es hier aber um "Folge Lösungen" geht, habe ich dieses Thema erneut aufgefasst.

    Nur ein kleines Vorwort:

    Ich bin absoluter Neuling in VBA. Also gaaaanz am Anfang. Bin jedoch bereit mich einzuarbeiten und habe einfach Interesse das Arbeiten mit Excel auch für Anwender ohne Kenntnisse durch Eingabemasken (UserForm) zu ermöglichen.

    Den endgültigen Anstoß dazu hat einfach die Situation ergeben, dass ich für einen Immobilienerwerb im europäischen Ausland eine Kostenkalkulation für die Bank erstellen muss. Da diese Kalkulation nicht nur durch mich, sondern auch durch meine Partnerin (Verzeihung!! Sie ist eine absolute 0 bei der Verwendung oder Arbeiten mit einer Excel Tabelle) zu erstellen ist, hatte ich nach kurzer Zeit die Nase voll, dass meiner Arbeiten in der Tabelle immer wieder durch Ihre Arbeit zum Schrott gemacht wurden.

    Im Prinzip, nachdem was ich hier alles gelesen habe dürfte mein Problem als absoluter Anfänger für die Forum Gemeine hier einWitz sein, der schnell gelößt werden kann.

    Ich weis nur nicht, ob Ihr alle den Nerv habt einem Neuling in der Art zu helfen, dass er nicht nur Codes kopiert sondern auch versteht was er zu tun hat.

    Denn eines muss ich gestehen, bisher bin ich nur -in meinen Augen - so weit gekommen, dass ich versucht habe mit verschiedenen Codes mit geringfügigen Anpassungen etwas zu realisieren.

    Zum Thema:

    Ich habe Eine Mappe mit 2 Tabellen. In der ersten Tabelle sollen / können Excel Anwender mit div Kenntnissen Eingaben tätigen. Die zweite Tabelle dient nur dazu um aktuelle Tageskurse von Währungen abzurufen.

    Nun soll dieses Projekt jedoch auch von ungeschulten Anwendern benutzt werden können. Verzeihung wie z.B. meine Partnerin, die absolut unbeholfen bei Excel ist.

    Aus diesem Grund die Userform. Hier soll die Auswahlmöglichkeit der Währung bestehen (Realisiert und Funktioniert) sowie in einer ListBox die Übersicht (Tabelle1) der Bereits erfassten Daten (Realisiert mit div. gerändeten Codes und funktioniert).

    Die jeweilige Auswahl aus der ListBox wird in TextBoxen angezeigt. (funktioniert auch schon).

    Nun soll nach Auswahl der zu Bearbeitung ausgewählten Zeile aus der Listbox die jeweiligen Textboxen bearbeitet / editiert werden können und nach Bearbeitung ohne einen Command Button - also beim Verlassen der TextBox direkt in der Listbox sowie auch in der Tabelle1 im richtigen Feld geändert werden.

    Ebenso sollen neue Sätze in der Listbox / Tabelle1 durch Auswahl der letzten Zeile in der Listbox (Eine Leerzeile) durch ausfüllen der TextBoxen hinzugefügt werden können.

    Die Auswahl in der ListBox funktioniert, das Ändern in den TextBoxen funktioniert auch, nur beim verlassen einer TextBox ändert sich nichts in der ListBox und auch nichts in der Tabelle1.

    Dass betrifft die Textboxen 2-8.

    Die übrigen Textboxen werden durch den jeweiligen Tageskurs der Währung berechnet und ausgefüllt. Dieser Schritt ist jetzt noch nicht relevant.
    Bzw. möchte ich versuchen dass dann aus dem hoffentlich bis dahin gelerntem zu realisieren.

    Ich habe die Original Datei angehängt, mit ein Paar gefüllten Angaben in Tabelle1.

    Bitte verzeiht mir bereits jetzt, solltet Ihr Euch diesem Thema annehmen, wenn ich als unwissender manchmal etwas nachfrage was im ersten Schritt logisch erscheint.

    Es währe schön wenn Ihr mir dabei helfen könntet, so dass ich vielleicht irgend wann auch in der Lage bin einem Neuling etwas zu helfen.

    Gruß

    Jürgen

    PS: Ursprungs Thema: http://www.office-hilfe.com/support/showthread.php/17242-Listbox-mit-mehreren-Spalten

    Die Daten in Tabelle2 werden durch ein ADD Inn von Excel bezogen.
     
    Merlin-1962, 25. November 2019
    #1
  2. Beverly
    Beverly Erfahrener User
    Hi Jürgen,

    ich empfehle dir, nicht das Change-Ereignis zum Ändern der Inhalte im Tabellenblatt zu verwenden sondern das After_Update-Ereignis, weil dadurch die Änderung im Tabellenblatt erst dann ausgeführt wird, wenn der komplette TextBox-Inhalt geändert wurde. So kannst du immer noch die Änderung rückgängig machen, solange die TextBox noch nicht verlassen wurde, indem du den ursprünglichen Text wieder einträgst, der noch in der ListBox zu sehen ist. Bei Verwendung des Change-Ereignis würden die Änderungen im Tabellenblatt und in der ListBox sofort ausgeführt, sodass du den ursprünglichen Inhalt nicht mehr siehst.

    Der Code würde prinzipiell so aussehen:

    Code:
    Private Sub TextBox2_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 1) = TextBox2
        UserForm_Initialize
    End Sub
    
    
    Für die anderen textBoxen gilt er analog, wobei du nur die 1 in die entsprechende Spaltennummer ändern musst.
    Die Zeilennummer für den Zelleintrag ergibt sich aus dem StartIndex 0 der listBox + deiner Startzeile 5 (in der die Daten beginnen) - deshalb für die Zeilennummer ListBox1.ListIndex + 5

    Mit dem Aufruf UserForm_Initialize wird die ListBox anschließend wieder neu gefüllt mit den nunmehr geänderten Daten.

    Beachte auch unbedingt, dass du für die TextBoxen, in welche du Zahlen einträgst, beim Übertragen in das Tabellenblatt die TextBox-Inhalte von Text in Zahlen umwandelst, denn andernfalls würden ja Texte in den Zellen stehen, mit denen du dann nicht mehr korrekt rechnen kannst.

    Bis später,
    Karin
     
  3. Hallo Karin,

    ich habe Deinen Code für die Textboxen in die Userform eingebaut.

    Code:
    Private Sub TextBox2_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 1) = TextBox2
        UserForm_Initialize
    End Sub
    Private Sub TextBox3_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 2) = TextBox3
        UserForm_Initialize
    End Sub
    Private Sub TextBox4_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 3) = TextBox4
        UserForm_Initialize
    End Sub
    Private Sub TextBox5_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 4) = TextBox5
        UserForm_Initialize
    End Sub
    Private Sub TextBox6_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 5) = TextBox6
        UserForm_Initialize
    End Sub
    Private Sub TextBox7_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 6) = TextBox7
        UserForm_Initialize
    End Sub
    Private Sub TextBox8_AfterUpdate()
        Cells(ListBox1.ListIndex + 5, 7) = TextBox8
        UserForm_Initialize
    End Sub
    Doch ergibt sich daraus folgendes Problem:

    Wenn ich in der Listbox einen Eintrag markiere geht der Cursor in die TextBox2 - soweit richtig. Ich ändere die TextBox zwei und nach verlassen wird auch das richtige Feld in der Listbox geändert und die Listbox auch korrekt angezeigt.

    Nun das Problem:

    Nach verlassen der Textbox2 springt der Cursor in die Textbox3 - was er auch soll.

    Nach ändern und verlassen der Textbox3 wird jedoch nicht das richtige Feld in der Tabelle bzw. auch in der Listbox geändert sondern grundsätzlich die 5 Zeile in der Tabelle bzw. der Textbox.

    Dies erscheint mir auch logisch, da nach dem Command "UserForm_initialize" die Listbox neu eingelesen wird, und die vor der ersten Änderung in Textbox2 getätigte Auswahl durch die neue Initialisierung ja auf null gestellt wird.

    Wie könnte man den Verlusst der Auswahl beim Neu Initialisieren abfangen?

    Gruß

    Jürgen
     
    Merlin-1962, 26. November 2019
    #3
  4. Beverly
    Beverly Erfahrener User

    Listbox mit mehreren Spalten

    Hi Jürgen,

    Indem man den ListIndex anschließend wieder herstellt. Dazu kann man die Tag-Eigenschaft der TextBoxen verwenden und darin den ListIndex speichern. Nach dem Initialisieren der ListBox holt man dann den relevanten ListIndex wieder aus dem Tag, wobei man beachten muss, dass im Tag immer nur Texte stehen - d.h. der Inhalt muss in zahl umgewandelt werden.
    Außerdem sollte geprüft werden, ob in der ListBox überhaupt etwas ausgewählt wurde:

    Code:
    Private Sub TextBox2_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 1) = TextBox2
            TextBox2.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox2.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            TextBox2.Tag = ""                          ' Taginhalt leeren
        End If
    End Sub
    
    

    Bei deinem Code ist mir aufgefallen, dass du meinen Hinweis bezüglich der Umwandlung von Zahlenwerten aus den textBoxen nicht berücksichtigt hast - wenn du den Zellinhalt dann prüfst wirst du feststellen dass zwar eine Ziffer drin steht aber diese eib Text ist - das ist auch logisch, weil (wie der Name schon besagt) in TextBoxen Text steht. Deshalb muss der Code für TextBox-Zahlen so aufgebaut sein.

    Code:
    Private Sub TextBox3_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then
            Cells(ListBox1.ListIndex + 5, 2) = CDbl(TextBox3) ' TextBox-Inhalt in Dezimalzahl umwandeln
            TextBox3.Tag = ListBox1.ListIndex
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox3.Tag)
        End If
    End Sub
    
    

    Beachte, dass es für jeden Zahlentyp einen eigenen Umwandlungsbefehl gibt - CDbl für Dezimalwert, CLng für Longwert, CInt für Integer.

    Bis später
    Karin
     
  5. Hi Karin, Super, werde ich in meiner Mittagspause direkt einbauen und ausprobieren,

    nur eine Frage vorab:

    Beim Umwandeln in den Zahlentyp werden dann auch die Nachkommastellen (2) mit eingetragen? Es sollen dann aber auch die Nachkommastellen welche 0 sind angezeigt werden. Beispiel 13,00

    Oder muss hier noch eine Formatierung durchgeführt werden?

    Denn mir ist aufgefallen, dass bisher eine Eingabe 13,78 auch so in die Tabelle und in der Listbox angezeigt wurden jedoch eine Eingabe von 13,00 in die Tabelle und in die Listbox nur mit 13 übergeben wurden.

    Gruß Jürgen
     
    Merlin-1962, 26. November 2019
    #5
  6. Beverly
    Beverly Erfahrener User
    Hi Jürgen,

    der Wert 13,78 ist ein Dezimalwert mit 2 Nachkommastellen - der Wert 13,00 jedoch ist ein Ganzzahlwert, der nur durch die Zellformatierung als Dezimalzahl dargestellt wird. Somit musst du nach dem Eintrag ins Tabellenblatt der Zelle noch das Format zuweisen - nach diesem Prinzip:

    Code:
    Private Sub TextBox3_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then
            Cells(ListBox1.ListIndex + 5, 2) = CDbl(TextBox3) ' TextBox-Inhalt in Dezimalzahl umwandeln
            [COLOR=#ff0000]Cells(ListBox1.ListIndex + 5, 2).NumberFormat = "#0.00"[/COLOR] ' Zahlenformat mit 2 Dezimalstellen
            TextBox3.Tag = ListBox1.ListIndex
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox3.Tag)
        End If
    End Sub
    
    

    Bis später,
    Karin
     
    Zuletzt bearbeitet: 26. November 2019
  7. Vielen lieben Dank Karin,

    kann das leider erst morgen einpflegen und testen, da ich wegen Krankheit eines Kollegen noch die Nachtschicht übernehmen muss.

    LG

    Jürgen
     
    Merlin-1962, 26. November 2019
    #7
  8. Listbox mit mehreren Spalten

    Hi Karin,
    das funzt alles super. bin schon ein wenig weiter gegangen. Wie Du in der Testdatei sicher gesehen hast, wird beim öffnen der Userform direkt in die ComboBox gestprungen. Hier siehst du nur eine leere Zeile und durch das aufklappen dann die Währungen. nun probiere ich schon wie ein Weltmeister mit null Ahnung abzufangen, dass wenn der Anwender nichts in die leere Zeile schreibt oder nichts aus den Auswahlmöglichkeiten wählt eine Mitteilung erhält (MSG Box) und nach dem OK in dieser wieder zurückkommt in die ComboBox. Ich habe schon einiges probiert aber nach dem Verlassen der MSG Box geht der Cursor nicht zurück in die ComboBox sondern springt in die erste TextBox.

    Code beim verlassen der ComboBox (nur mit Return):

    Code:
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     Select Case KeyCode
     Case 13 'Return
        If deinWert = 0 Then
            MsgBox "Währung muss gewählt oder eingegeben werden!!", vbOKOnly + vbExclamation, "Warnung!"
            
            'xxxx an dieser Stelle habe ich nachfolgendes probiert
        Else
            ListBox1.ListIndex = 0
            ListBox1.SetFocus
        End If
     End Select
    End Sub
    Code an xxxx Stelle

    Code:
    ComboBox1.SetFocus
    springt dennoch in TextBox1

    Code:
    Cancel = True
    bringt Fehlermeldung "Variable nicht gefunden"

    daraufhin folgendes geändert:

    Code:
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    in

    Code:
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer, ByVal Cancel As MSForms.ReturnBoolean)
    erwirkt ein Fehler

    daraufhin erst an xxxx Stelle

    Code:
    UserForm_Initialize
    dann hinter der IF / Endif abfrage
    dann hinter dem End Select

    probiert.

    Somit war mein Gedanke, dass ich einfach nach Beendung der MSG Box die Userform neu initialisiere ebenfalls vernichtet. Er springt immer in TextBox1

    Hmmm einige von Euch werden schmunzeln ;), einige werden Listbox mit mehreren Spalten :rolleyes:, da die Lösung bestimmt ganz einfach ist.

    Karin oder all die anderen ich will lernen bitte erklärt mir das

    Gruß

    Jürgen
     
    Zuletzt von einem Moderator bearbeitet: 30. November 2020
    Merlin-1962, 27. November 2019
    #8
  9. Beverly
    Beverly Erfahrener User
    Hi Jürgen,

    wenn du die ComboBox ohne Auswahl nicht verlassen willst, dann musst du das Excit-Ereignis verwenden, weil dieses eine Abbruchbedingung anbietet:

    Code:
    Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If ComboBox1 = "" Then
            MsgBox "Bitte eine Sorte auswählen"
            Cancel = True
        End If
    End Sub
    
    
    Bis später,
    Karin
     
  10. Hi Karin,

    hat bis dahin alles super funktionier. Ich melde mich morgen wieder mit einem Update der jetzt neuen Tabelle mit VBA und einigen Weiterentwicklungen. Eventuell auch mit Fragen zu dann noch zu lösenden Problemen.

    LG Jürgen
     
    Merlin-1962, 27. November 2019
    #10
  11. Hi Karin,

    wie gestern versprochen als Anhang die neue Excel Datei mit deinen eingearbeiteten Codes. Es funzt soweit super und ich habe einiges erweitert.

    Jedoch habe ich zwei neue Probleme.

    Aber erst mal der komplette Code:

    Code:
    Option Explicit
    Dim StTabelle As String
    Dim deinWert As Double
    Dim deinSorte As String
    Dim deinPreis As String
    Dim deinPreis2 As String
    
    Private Sub CommandButton1_Click()
        Call Aktualisieren
    End Sub
    
    
    Private Sub ListBox1_Click()
        TextBox2.Text = ListBox1.List(ListBox1.ListIndex, 0)
        TextBox3.Text = ListBox1.List(ListBox1.ListIndex, 1)
        'TextBox4.Text = ListBox1.List(ListBox1.ListIndex, 2)
        'TextBox5.Text = ListBox1.List(ListBox1.ListIndex, 3)
        'TextBox6.Text = ListBox1.List(ListBox1.ListIndex, 4)
        TextBox7.Text = ListBox1.List(ListBox1.ListIndex, 5)
        TextBox8.Text = ListBox1.List(ListBox1.ListIndex, 6)
        TextBox9.Text = ListBox1.List(ListBox1.ListIndex, 7)
        TextBox10.Text = ListBox1.List(ListBox1.ListIndex, 8)
        TextBox16.Text = ListBox1.List(ListBox1.ListIndex, 11)
        If ListBox1.List(ListBox1.ListIndex, 2) = "X" Then
            OptionButton3.Value = True
        Else
            OptionButton3.Value = False
        End If
        If ListBox1.List(ListBox1.ListIndex, 3) = "X" Then
            OptionButton4.Value = True
        Else
            OptionButton4.Value = False
        End If
        If ListBox1.List(ListBox1.ListIndex, 4) = "X" Then
            OptionButton5.Value = True
        Else
            OptionButton5.Value = False
        End If
        
    End Sub
    
    Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     Select Case KeyCode
     Case 13 'Return
        TextBox2.SetFocus
     End Select
    End Sub
    
    Private Sub OptionButton1_Click()
        deinPreis = TextBox15
        TextBox7 = deinPreis
        TextBox8 = TextBox15 * TextBox1
        TextBox9 = TextBox7 * TextBox3
        TextBox10 = TextBox8 * TextBox3
        
        If ListBox1.ListIndex > -1 <> "" Then
            Cells(ListBox1.ListIndex + 5, 12) = "Euro"
            Cells(ListBox1.ListIndex + 5, 6) = CDbl(TextBox7) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 6).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox7.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox7.Tag)
            Cells(ListBox1.ListIndex + 5, 7) = CDbl(TextBox8) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 7).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox8.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox8.Tag)
            Cells(ListBox1.ListIndex + 5, 8) = CDbl(TextBox9) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 8).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox9.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox9.Tag)
            Cells(ListBox1.ListIndex + 5, 9) = CDbl(TextBox10) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 9).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox10.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox10.Tag)
            OptionButton1.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(OptionButton1.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            OptionButton1.Tag = ""                          ' Taginhalt leeren
        End If
        ListBox1.SetFocus
    End Sub
    
    Private Sub OptionButton2_Click()
        deinPreis = TextBox15
        TextBox7 = deinPreis
        TextBox8 = TextBox15 / TextBox1
        TextBox9 = TextBox7 * TextBox3
        TextBox10 = TextBox8 * TextBox3
        
        If ListBox1.ListIndex > -1 <> "" Then
            Cells(ListBox1.ListIndex + 5, 12) = deinSorte
            Cells(ListBox1.ListIndex + 5, 7) = CDbl(TextBox7) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 7).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox7.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox7.Tag)
            Cells(ListBox1.ListIndex + 5, 6) = CDbl(TextBox8) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 6).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox8.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox8.Tag)
            Cells(ListBox1.ListIndex + 5, 9) = CDbl(TextBox9) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 9).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox9.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox9.Tag)
            Cells(ListBox1.ListIndex + 5, 8) = CDbl(TextBox10) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 8).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox10.Tag = ListBox1.ListIndex
            ListBox1.ListIndex = CLng(TextBox10.Tag)
            OptionButton2.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(OptionButton2.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            OptionButton2.Tag = ""                          ' Taginhalt leeren
        End If
        ListBox1.SetFocus
        
    End Sub
    
    Private Sub OptionButton3_Click()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 3) = "X"
            Cells(ListBox1.ListIndex + 5, 4) = ""
            Cells(ListBox1.ListIndex + 5, 5) = ""
            OptionButton3.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(OptionButton3.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            OptionButton3.Tag = ""                          ' Taginhalt leeren
        End If
    End Sub
    
    Private Sub OptionButton4_Click()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 4) = "X"
            Cells(ListBox1.ListIndex + 5, 3) = ""
            Cells(ListBox1.ListIndex + 5, 5) = ""
            OptionButton4.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(OptionButton4.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            OptionButton4.Tag = ""
        End If
    End Sub
    
    Private Sub OptionButton5_Click()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 5) = "X"
            Cells(ListBox1.ListIndex + 5, 3) = ""
            Cells(ListBox1.ListIndex + 5, 4) = ""
            OptionButton5.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(OptionButton5.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            OptionButton5.Tag = ""                           ' Taginhalt leeren
        End If
    End Sub
    
    Private Sub TextBox15_Change()
    
    End Sub
    
    Private Sub TextBox2_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 1) = TextBox2
            TextBox2.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox2.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            TextBox2.Tag = ""                          ' Taginhalt leeren
        End If
    End Sub
    
    Private Sub TextBox3_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then
            Cells(ListBox1.ListIndex + 5, 2) = CDbl(TextBox3) ' TextBox-Inhalt in Dezimalzahl umwandeln
            Cells(ListBox1.ListIndex + 5, 2).NumberFormat = "#,##0.00" ' Zahlenformat mit 2 Dezimalstellen
            TextBox3.Tag = ListBox1.ListIndex
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox3.Tag)
        End If
    End Sub
    
    Private Sub TextBox4_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 3) = TextBox4
            TextBox4.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox4.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            TextBox4.Tag = ""                          ' Taginhalt leeren
        End If
    End Sub
    
    Private Sub TextBox5_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 4) = TextBox5
            TextBox5.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox5.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            TextBox5.Tag = ""                          ' Taginhalt leeren
        End If
    End Sub
    
    Private Sub TextBox6_AfterUpdate()
        If ListBox1.ListIndex > -1 <> "" Then              ' prüfen ob in ListBox etwas ausgewählt wurde
            Cells(ListBox1.ListIndex + 5, 5) = TextBox6
            TextBox6.Tag = ListBox1.ListIndex             ' ListIndex auf Tag schreiben
            UserForm_Initialize
            ListBox1.ListIndex = CLng(TextBox6.Tag)    ' Auswahl in ListBox wieder herstellen, ListIndex aus Tag nehmen und in Long-Wert umwandeln
            TextBox6.Tag = ""                          ' Taginhalt leeren
        End If
    End Sub
    
    Private Sub Formular_Click()
        UserForm1.Show
    End Sub
    
    Private Sub UserForm_Initialize()
    Dim i As Integer, lz As Integer
    Dim j As Integer, ly As Integer
    Dim arr2 As Variant
    Dim arr As Variant
    With Sheets(1)
        ly = .Cells(Rows.Count, 1).End(xlUp).Row
        lz = .Cells(Rows.Count, 1).End(xlUp).Row
        ReDim arr(4 To lz, 1 To 12)
        ReDim arr2(3 To ly, 1 To 12)
        For i = 5 To lz
            arr(i - 1, 1) = .Range("A" & i).Text
            arr(i - 1, 2) = .Range("B" & i).Text
            arr(i - 1, 3) = .Range("C" & i).Text
            arr(i - 1, 4) = .Range("D" & i).Text
            arr(i - 1, 5) = .Range("E" & i).Text
            arr(i - 1, 6) = .Range("F" & i).Text
            arr(i - 1, 7) = .Range("G" & i).Text
            arr(i - 1, 8) = .Range("H" & i).Text
            arr(i - 1, 9) = .Range("I" & i).Text
            arr(i - 1, 10) = .Range("J" & i).Text
            arr(i - 1, 11) = .Range("K" & i).Text
            arr(i - 1, 12) = .Range("L" & i).Text
        Next i
        For j = 4 To 4
            arr2(j - 1, 1) = .Range("A" & j).Text
            arr2(j - 1, 2) = .Range("B" & j).Text
            arr2(j - 1, 3) = .Range("C" & j).Text
            arr2(j - 1, 4) = .Range("D" & j).Text
            arr2(j - 1, 5) = .Range("E" & j).Text
            arr2(j - 1, 6) = .Range("F" & j).Text
            arr2(j - 1, 7) = .Range("G" & j).Text
            arr2(j - 1, 8) = .Range("H" & j).Text
            arr2(j - 1, 9) = .Range("I" & j).Text
            arr2(j - 1, 10) = .Range("J" & j).Text
            arr2(j - 1, 11) = .Range("K" & j).Text
            arr2(j - 1, 12) = .Range("L" & j).Text
        Next j
    
    End With
    
    With ListBox1
        .ColumnHeads = False
        .ColumnCount = 12
        .ColumnWidths = "12cm; 2cm; 1cm; 1cm; 1cm; 4,0cm; 4,5cm; 4,0cm; 4,5cm; 4,0cm; 4,5cm; 4,0 cm"
        .List = arr
    End With
    With ListBox2
        .ColumnHeads = False
        .ColumnCount = 12
        .ColumnWidths = "12cm; 2cm; 1cm; 1cm; 1cm; 4,0cm; 4,5cm; 4,0cm; 4,5cm; 4,0cm; 4,5cm; 4,0 cm"
        .List = arr2
    End With
    TextBox1.Locked = True
    
    End Sub
    
    Private Sub UserForm_Activate()
    
        Dim deinWert As Double
        Dim BoI As Byte
        ComboBox1.Clear
        With Worksheets("Tabelle2")
            For BoI = 2 To 54
                ComboBox1.AddItem .Cells(BoI, 1)
                Next BoI
        End With
        StTabelle = "Tabelle2"
    
    End Sub
    
    Private Sub ComboBox1_Change()
    Dim deinWert As Double
           deinWert = Worksheets(StTabelle).Cells(ComboBox1.ListIndex + 2, 4)
           deinSorte = Worksheets(StTabelle).Cells(ComboBox1.ListIndex + 2, 1)
           Me.TextBox1 = Format(deinWert, "#,##0.0000")
    
    End Sub
    
    Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If ComboBox1 = "" Then
            MsgBox "Währung muss gewählt oder eingegeben werden!!", vbOKOnly + vbExclamation, "Warnung!"
            Cancel = True
        End If
        ListBox1.ListIndex = 0
        Label12.Caption = deinSorte
        Label15.Caption = deinSorte
        Label18.Caption = deinSorte
        Label21.Caption = deinSorte
        OptionButton2.Caption = deinSorte
    End Sub
    
    
    Jetzt die Probleme:

    1.) In der Listbox1 werden in den Spalten entweder alles Linksbündig oder alles Rechtsbündig ausgerichtet.
    Das ist in Excel auch anders mit den Eigenschaften in der ListBox nicht möglich.

    Es soll jedoch einen Trick geben der mit folgendem Code funktionieren soll.

    Code:
    Arr(3, iRowU) = Right(String(20, " ") & Format(Arr(3, iRowU), "#,##0"",-"""), 10)
    Ich habe mittlerweile probiert Ohne Ende komme jedoch nicht auf die Lösung wo der Code eingesetzt werden muss, bzw. wie er für die einzelnen Spalten geändert werden muss.

    Das zweite Problem betrifft die Währungs OptionButton1 und OptionButton2 welche in einem Frame untergebracht sind:

    Beim Starten der Userform sind beide auf Valid = False
    Man wählt die Währung aus, bekommt den aktuellen Wechselkurs angezeigt und der Cursor spring in die Listbox.
    Nach wahl eines Eintrages aus der Listbox springt der Cursor in die erste TextBox2, danach in TextBox3 ....
    Nach dem betätigen des OptionButton1 oder OptionButton2 werden Berechnungen und div Einträge / Aktuallisierungen in der Tabelle wie in der Listbox vorgenommem und der Cursor geht zurück in die ListBox.

    Wählt man jetzt einen anderen Eintrag und der Cursor geht in die jeweilige Textbox bleibt jedoch entweder der OptionButton1 oder OptionButton2 so eingestellt wie in der Bearbeitung der ersten Auswahl eingestellt.

    Es soll aber so sein, dass die OptionButton's nch Rückkehr in die ListBox wieder beide auf .Valid = False gestellt werden. Quasi die selbe Einstellung wie beim aufrufen der UserForm.

    Kannst Du oder ein anderer aus der Forumgemeinde weiterhelfen?

    Die aktuelle Datei ist die: Finanzierung2.xlsm

    LG

    Jürgen
     
    Merlin-1962, 28. November 2019
    #11
  12. Beverly
    Beverly Erfahrener User
    Hi Jürgen,

    zu Problem 1: WAS genau soll denn der "Trick" bewirken?

    zu Problem 2: setze die Einstellungen der OptionButton 1 und 2 zu Beginn des Click-Ereignisses der ListBox zurück

    Noch ein wichtiger Hinweis
    : im Click-Ereignis der OptionButton 1 und 2 solltest du zu Beginn prüfen, ob die TextBox15 bzw. die Variable deinPreis nicht leer sind - sonst gibt es einen Fehler bei der Berechnung weil durch "" geteilt werden soll.

    Bis später,
    Karin
     
  13. Listbox mit mehreren Spalten

    Hi Karin

    zu 1.) Der Trick soll bewirgen, das in der Listbox z.B. die Spalten mit Zahlen dann rechts ausgerichtet sind und die Spalten mit Text links, egal wie die Einstellung der ListBox ist. Man verrutscht durch Leerzeichen vor dem Ausdruck nach rechts und lasst dann durch einrücken nach links jeweils den gleichen Abstand von rechts. Hmmm kompliziert in Worten auszudrücken.

    zu 2.)

    Da mit der Prüfung wegen der Berechnung erscheint mir logisch und werde ich versuchen einzubauen. Ich habe bereits Probiert, im Click Ereignis der ListBox die Einstellung der OptioButtons mit dem Code:

    Code:
    OptionButton1.Valid = False
    OptionButton2.Valid = False
    zurück zu setzen.

    Hier kommt jedoch immer die Fehlermeldung: "Fehler beim kompillieren! Zuweisung an schreibgeschützte Eigenschaften nicht möglich!"

    LG Jürgen
     
    Merlin-1962, 29. November 2019
    #13
  14. Sorry Karin, bin ich ein kleiner TrottelListbox mit mehreren Spalten :eek:

    Der Code muss natürlich:

    Code:
    OptionButton1.Value = False
    OptionButton2.Value = False
    lauten dann funzt das auch Listbox mit mehreren Spalten :eek:Listbox mit mehreren Spalten :eek:Listbox mit mehreren Spalten :eek::p:p
     
    Merlin-1962, 29. November 2019
    #14
  15. Beverly
    Beverly Erfahrener User
    Hi Jürgen,

    zu Problem 1: den Code musstest du beim Füllen des Arrays so einbinden

    Code:
            arr(i - 1, 6) = Right(String(20, " ") & Format(.Range("F" & i).Text, "#,##0"",-"""), 10)
    Also einfach den Zellinhalt entsprechend formatiert ins Array schreiben. Ob die Formatierung dann tatsächlich das gewünschte Ergebnis bringt ist mir nicht bekannt.


    zu Problem 2: Der Code im Click-Ereignis der ListBox sieht bei mir wie folgt aus - er löst keinen Fehler aus:

    Code:
    Private Sub ListBox1_Click()
        TextBox2.Text = ListBox1.List(ListBox1.ListIndex, 0)
        TextBox3.Text = ListBox1.List(ListBox1.ListIndex, 1)
        'TextBox4.Text = ListBox1.List(ListBox1.ListIndex, 2)
        'TextBox5.Text = ListBox1.List(ListBox1.ListIndex, 3)
        'TextBox6.Text = ListBox1.List(ListBox1.ListIndex, 4)
        TextBox7.Text = ListBox1.List(ListBox1.ListIndex, 5)
        TextBox8.Text = ListBox1.List(ListBox1.ListIndex, 6)
        TextBox9.Text = ListBox1.List(ListBox1.ListIndex, 7)
        TextBox10.Text = ListBox1.List(ListBox1.ListIndex, 8)
        TextBox16.Text = ListBox1.List(ListBox1.ListIndex, 11)
        OptionButton1 = False
        OptionButton2 = False
    
        '... hier der restliche Code

    Bis später,
    Karin
     
Thema:

Listbox mit mehreren Spalten

Die Seite wird geladen...
  1. Listbox mit mehreren Spalten - Similar Threads - Listbox mehreren Spalten

  2. Suchfunktion für Listbox in Textbox

    in Microsoft Excel Hilfe
    Suchfunktion für Listbox in Textbox: Hallo an alle hier im Forum, ich bastel mal wieder ein wenig rum. Ich habe ein 2 spaltige Listbox. In der 1. Spalte stehen Zahlen von einstellig bis sechsstellig und in der 2. Spalte Namen. Im...
  3. Listbox befüllen

    in Microsoft Excel Hilfe
    Listbox befüllen: Hallo mein Name ist Carsten und ich bin neu hier im Forum und habe gleich eine Frage. Ich habe eine Userform mit verschiedenen voneinander abhängigen Listboxen. Das klappt auch soweit. Nur der...
  4. Suche mit Ausgabe mehrere Ergebnisse in ListBox

    in Microsoft Excel Hilfe
    Suche mit Ausgabe mehrere Ergebnisse in ListBox: Hi Freunde, ich habe jetzt ein neues Problem und hoffe Ihr habt die Lösung dafür. Mein Vorhaben: -Liste mit 16 Spalten und 1000 Zeilen -Suchfunktion Mittels UserForm in das Excelblatt einbetten...
  5. Inhalt aus mehreren Textboxen in Tabelle suchen und in Listbox ausgeben

    in Microsoft Excel Hilfe
    Inhalt aus mehreren Textboxen in Tabelle suchen und in Listbox ausgeben: Guten Morgen zusammen, hier im Forum bin ich auf folgenden Code gestoßen http://www.office-hilfe.com/support/showthread.php/17436-TextBox-Inhalt-auf-anderem-Tabellenblatt-suchen. Für meine...
  6. Userform mit mehreren Listboxen

    in Microsoft Excel Hilfe
    Userform mit mehreren Listboxen: Hallo zusammen, ich bastel mir gerade ein Userform mit zwei Listboxen zusammen. Ich komme mit den Werten KlassAkt.Caption = "Test8" SVAkt.Caption = 5 in das UserForm_Initialize() Jetzt...
  7. Listbox mit mehreren Spalten Auswahl einer einzelnen Spalte möglich?

    in Microsoft Excel Hilfe
    Listbox mit mehreren Spalten Auswahl einer einzelnen Spalte möglich?: Hallo Leute, ich habe eine Beispieldatei gemacht. Wenn ihr euch in KW34 die listbox anseht seht ihr unter jedem Wochentag zwei Daten (Lieferschein-Nr. und Datum). Ich würde nun gerne z.b....
  8. Listbox mit mehreren Spalten

    in Microsoft Excel Hilfe
    Listbox mit mehreren Spalten: Hallo Ich möchte eine Listbox mit Daten aus einer Tabelle mit mehreren Spalten füllen. Es können neue Daten hinzugefügt oder auch gelöscht werden. Habe lange im Internet gesucht und nur Beispiele...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden