In Excel Button dynamisch zur Tabellen Zeile erstellen

  • Excel

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von aggro600.

    In Excel Button dynamisch zur Tabellen Zeile erstellen

    Ich habe eine Tabelle in Excel die Ihre Daten aus Access abruft. Nun möchte ich neben jeder Zeile einen Button haben der sich auf die jeweilige Zeile bezieht.

    Quellcode

    1. Sub Schaltfläche1_Klicken()
    2. Dim objDatabase As Object
    3. Dim sSQL As String
    4. sSQL = "UPDATE Test SET Vorname = " & Range("A1") & " WHERE ID =" & Range("A5") & ""
    5. Set objDatabase = CreateObject("DAO.DBEngine.120").OpenDatabase("D:\**************************.accdb")
    6. objDatabase.Execute sSQL, 128
    7. End Sub


    Da wo im Moment A1 und A5 stehen müsste dann irgendwann B1/B5, C1/C5, D1/D5, E1/E5... stehen ich denke das ist klar.

    aggro600 schrieb:

    Nun möchte ich neben jeder Zeile einen Button haben der sich auf die jeweilige Zeile bezieht.
    Das ist ein Riesen-Overhead an Controls.
    Ich würde da das BeforeDoubleClick-Event verwenden.
    Wenn du auf eine Zelle in Spalte 1 doppelklickst, kannst du die Update-Aktion ausführen.

    Oder du machst einen einzigen Update-Button, wo du Selection auswertest und die entsprechenden (ausgewählten) Rows aktualisierst.

    Noch eleganter wäre ein Context-Menu (RightClick) einzubauen, das ist allerdings etwas aufwendiger.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wäre es nicht nur ein mini Code, der ausließt, wieviele Zeilen meine Tabelle hat, in der Spalte XY dann immer einen Button einfügt und sich dann auf die Zeile bezieht, in der er liegt.

    Das mit dem makieren finde ich nicht so gut von der Bedienung her, da man evlt scrollen muss

    aggro600 schrieb:

    Wäre es nicht nur ein mini Code
    Der Code ist nicht aufwendig.
    Die Ausführung ist aufwendig.
    Zum einen hast du Unmengen von Controls. Spätestens bei 300 Controls läuft dir das Memory aus dem Ruder.
    Zum anderen musst du sie wieder neu verwalten, wenn sich der Inhalt verändert (wenn du eine Zeile einfügst oder löschst)

    Warum wertest du nicht den Doppelklick in Spalte 1 aus?
    Und am besten das auch nur, wenn in der Zeile eine Änderung stattgefunden hat.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    aggro600 schrieb:

    wohin muss doppelt geklickt werden?

    Ich würde eine leere erste Spalte dafür verwenden.
    Die Zellen kannst du ja zusätzlich als Flag verwenden, ob die Zeile geändert wurde.

    Visual Basic-Quellcode

    1. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, ByRef Cancel As Boolean)
    2. If Not Intersect(Target,Range("A:A")) Is Nothing Then
    3. SaveRow Target.Row 'hier kannst du deinen Datensatz speichern, Target ist deine doppelgeklickte Zelle
    4. Cancel = True ' no further doubleclick action
    5. End If
    6. End Sub


    aggro600 schrieb:

    Kann man nicht ein "ENTER" auswerten?
    Du kannst das Worksheet_Change-Event verwenden und bei jeder Zelländerung updaten.
    Wenn dann würde ich das aber höchstens zusätzlich zum DoubleClick verwenden, ob der Datensatz überhaupt aktualisiert werden muss.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Klar.
    Da fehlt eine Klammer.
    Sorry, aber ich schreibe solche Snippets aus dem Kopf ohne Verwendung einer IDE.
    Solche Syntaxfehler solltest du eigentlich selbst finden.

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim Rng As Range, c As Range
    3. Set Rng=Intersect(Target,Range("B:Z"))
    4. If Not Rng Is Nothing Then
    5. For Each c in Rng
    6. Cells(c.Row,1).Value = "Changed"
    7. Next
    8. End If
    9. End Sub
    10. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, ByRef Cancel As Boolean)
    11. If Not Intersect(Target,Range("A:A")) Is Nothing Then
    12. If Target.Value = "Changed" Then
    13. SaveRow Target.Row 'hier kannst du deinen Datensatz speichern, Target ist deine doppelgeklickte Zelle
    14. End If
    15. Cancel = True ' no further doubleclick action
    16. End If
    17. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Eigentlich klappt es jetzt, nur kann ich ausschließlich Zahlen und kein Text Updaten und die Prüfung

    Visual Basic-Quellcode

    1. If rs.Fields("Vorname") = Range("L" & c.Row) Then

    ist nicht erfolgreich obwohl sie es sein müsste denn bei

    Visual Basic-Quellcode

    1. MsgBox ("Jetzt prüfe ich Db Inhalt: ") & rs.Fields("Vorname") & vbCr & ("Mit Excel Zellenwert: ") & Range("L" & c.Row)


    bekomme ich die selben Werte angezeigt



    Hier der ganze Code:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim SQLBack As String
    3. Dim objDatabase As Object 'für SQL Update
    4. Dim sSQL As String 'für SQL Update
    5. Dim Rng As Range, c As Range 'für den Change
    6. Set Rng = Intersect(Target, Range("L:L")) 'nur in L wird auf Chance überwacht
    7. If Not Rng Is Nothing Then
    8. For Each c In Rng
    9. 'Cells(c.Row, 1).Value = "Changed"
    10. Dim strQuest As String
    11. strQuest = MsgBox("Soll der Hausheer geändert werden? " & vbCr & _
    12. "Wählen Sie jetzt...", vbYesNo + vbQuestion, "Hausherr ändern")
    13. 'Wenn die Abfrage mit "Nein" bestätigt wird,
    14. 'wird die Prozedur mit dem Befehl "Exit Sub" abgebrochen.
    15. If strQuest = vbNo Then
    16. MsgBox ("Nix gemacht")
    17. Exit Sub
    18. End If
    19. 'Es wird geändert
    20. 'MsgBox ("Erkannt wurde Zeile: " & c.Row)
    21. 'MsgBox ("Aktualisiert wird: " & Range("B" & c.Row)) 'Wert aus Spalte B und Zeile c.Row
    22. sSQL = "UPDATE Test SET Vorname = " & Range("L" & c.Row) & " WHERE ID =" & Range("Y" & c.Row)
    23. 'sSQL = "UPDATE Test SET Vorname = " & Range("A1") & " WHERE ID = 1"
    24. Set objDatabase = CreateObject("DAO.DBEngine.120").OpenDatabase("\\XXXX.accdb")
    25. objDatabase.Execute sSQL, 128
    26. 'Next
    27. MsgBox ("JETZT ÄNDERN")
    28. sSQL = "SELECT Vorname FROM Test WHERE ID =" & Range("Y" & c.Row)
    29. Dim rs As Object
    30. Set rs = objDatabase.Openrecordset(sSQL)
    31. 'MsgBox ("Ich weiß noch: " & Range("Y" & c.Row))
    32. If Not rs.EOF Then ' Prüfung auf leeres Recordset
    33. MsgBox ("Jetzt prüfe ich Db Inhalt: ") & rs.Fields("Vorname") & vbCr & ("Mit Excel Zellenwert: ") & Range("L" & c.Row)
    34. If rs.Fields("Vorname") = Range("L" & c.Row) Then
    35. MsgBox ("Prüfung war erfolgreich. In der DB steht: ") & rs.Fields("Vorname")
    36. 'MsgBox ("In der DB steht: ") & rs.Fields("Vorname")
    37. Else
    38. MsgBox ("Fehler:") & vbCr & ("Die Daten wurden nicht in der Datenbank gespeichert"), , ("Fehler beim Aktualisieren")
    39. End If
    40. End If
    41. Next
    42. End If
    43. End Sub