ListBox, Frame und BeforeUpdate

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    ListBox, Frame und BeforeUpdate

    Hallo,

    ich habe hier ein Problem. Bevor ich die ListBox in den Frame gepackt habe lief der Code einwandfrei. Danach kommt der Fehler:


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub lb_table_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    2. fn = Replace(Me.Name, "frm", "")
    3. Set c = Me.Controls("lb_table")
    4. Set wks = ThisWorkbook.Worksheets(fn)
    5. cntCol = wks.Cells(1, Columns.Count).End(xlToLeft).Column
    6. For i = 1 To cntCol
    7. Me.Controls("tb_0" & i) = c.List(c.ListIndex, i - 1)
    8. Next i
    9. End Sub



    VB.NET-Quellcode

    1. For i = 1 To cntCol
    2. Me.Controls("tb_0" & i) = c.List(c.ListIndex, i - 1)
    3. Next i
    Bilder
    • Bild.PNG

      5,12 kB, 451×256, 77 mal angesehen
    Dateien
    • 2017 - upload.zip

      (250,93 kB, 105 mal heruntergeladen, zuletzt: )
    Warum verwendest Du eigentlich dauernd sowas wie Me.Controls("lb_Table") und nicht einfach gleich lb_table? Das ist doch Excel bekannt, was Du damit meinst. Und dann hast Du auch IntelliSense-Unterstützung. Naja, wenn man das in Excel als IntelliSense bezeichnen will. Was auch dazu führt, dass Du in die Variablen reinschauen kannst, wenn ein Fehler auftritt. Dann wirst Du nämlich auch sehen, dass die Sub 2x aufgerufen wird und beim 2. Mal ListIndex = -1 ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ah ich glaube ich hatte vorher etwas da stehen wie Me.Controls("lb_" & fn) wobei fn der reduzierte name der UserForm als String war.
    Hab es jetzt so geändert, aber warum wird die Sub denn beim Zweiten mal mit Listindex -1 ausgeführt ? ?(
    i = 1 to 2
    dann sollte doch 1-1 und 2-1 rauskommen, oder hab ich das falsch verstanden?

    VB.NET-Quellcode

    1. Private Sub lb_table_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    2. fn = Replace(Me.name, "frm", "")
    3. Set c = Me.lb_table
    4. Set wks = ThisWorkbook.Worksheets(fn)
    5. cntCol = wks.Cells(1, Columns.Count).End(xlToLeft).Column
    6. For i = 1 To cntCol
    7. Me.Controls("tb_0" & i) = c.List(c.ListIndex, i - 1)
    8. Next i
    9. End Sub

    Also ich verstehe immernoch nicht so recht, warum das zweite mal ein -1 im ListIndex rauskommt. Ich hab einfach mal On Error Resume next dazu gepackt und es passiert genau das, was es vorher auch getan hatte nur ohne die Fehlermeldung. Den Fehler kann ich mir trotzdem nicht erklären.

    Sam85 schrieb:

    Ich hab einfach mal On Error Resume next dazu gepackt und es passiert genau das, was es vorher auch getan hatte nur ohne die Fehlermeldung.
    Naja, so geht's auch. Das ist, als ob man Try…Catch in VB.Net verwendet und nicht weiß, warum ne Exception kommt. Und es auch nicht recherchiert.

    Visual Basic-Quellcode

    1. Private Sub btn_save_Click()
    2. […]
    3. With c
    4. .Clear
    5. .List = tbl.DataBodyRange.Value
    6. End With
    7. […]
    8. End Sub

    Beim Klick auf den Speichern-Button löschst Du den Inhalt der gesamten ListBox und setzt die Daten neu. Jetzt dürfte klar sein, warum danach .ListIndex = -1 ist.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ah ok, ich hab mich gewundert weil die Fehlermeldung kam ja mit den Verweis auf das "BeforeUpdate" und auch erst nachdem ich die ListBox in den Frame getan habe. Vorher kam diese Fehlermeldung komischerweise auch nicht. ?(
    Ich wusste leider nicht wonach ich Recherchieren sollte, sonst hätte ich das sofort getan. Ich dachte erst das hängt einfach mit dem Frame zusammen und ich muss diesen einfach im Code ergänzen..dem war aber nicht so...
    Das heißt also das Save mit dem BeforeUpdate verträgt sich nicht so ideal, sollte ich dann auf ein anderes Event ausweichen statt BeforeUpdate um den ListBox Eintrag auf die TextBoxen zu übertragen?
    BeforeUpdate wird ja immer dann ausgelöst, wenn z.B. der SelectedIndex geändert wird, aber noch vor dem Change-Ereignis. Ob das inhaltlich passt, bleibt Dir überlassen.
    Das einfachste wär natürlich, wenn Du die On Error-Geschichte weglässt und einfach ein If c.ListIndex = -1 Then Exit Sub einbaust, notfalls noch mit einem Kommentar, warum das dort steht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank, so geht es. :)

    VB.NET-Quellcode

    1. Private Sub lb_table_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    2. fn = Replace(Me.name, "frm", "")
    3. Set c = Me.lb_table
    4. Set wks = ThisWorkbook.Worksheets(fn)
    5. cntCol = wks.Cells(1, Columns.Count).End(xlToLeft).Column
    6. If c.ListIndex = -1 Then
    7. Exit Sub
    8. Else
    9. For i = 1 To cntCol
    10. Me.Controls("tb_0" & i) = c.List(c.ListIndex, i - 1)
    11. Next i
    12. End If
    13. End Sub