Bei Aktualisierung von Excel Datei das Change event sperren

  • Excel

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Bei Aktualisierung von Excel Datei das Change event sperren

    Ich habe in Excel mehrere Tabellenblätter (12 Stück also eines für jeden Monat). Nun hole ich mir aus Access die Daten für die Tabelle per Verbindung.
    Dann habe ich eine Funktion eingefügt die nach Änderung einer Zelle etwas macht.
    Nun ändern sich die Zellen ja auch beim Aktualisieren der Daten. Da soll aber meine Überwach nicht drauf reagieren.
    (Aktualisiert wird in Excel bei Daten>Alle Aktualisieren)


    Ein weiteres Problem ist, dass die Prüfung ob der Eintrag erfolgreich war immer sagt, dass er nicht erfolgreich war, ob er es ist.
    Hier stehen also genau die selben Werte.

    Visual Basic-Quellcode

    1. MsgBox ("Fehler:") & vbCr & ("Die Daten wurden evtl. nicht in der Datenbank gespeichert.") & vbCr & ("Bitte selbst vergleich ob die Daten überinstimmen.") & vbCr & ("Das steht in der Datenbank: ") & rs.Fields(DBAttribut) & vbCr & ("Das wurde bei Excel eingegeben: ") & Range(UpdateFeld & c.Row), , ("Fehler beim Aktualisieren")





    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim SQLBack As String
    3. Dim DB As String
    4. Dim Tabelle As String
    5. Dim ID As String
    6. Dim UpdateFeld As String
    7. Dim DBAttribut As String
    8. DB = "\\XXX.accdb" 'Pfad der Datenbank
    9. Tabelle = "Begleitarbeiten_TL_Liste" 'Tabelle in der der Datensatz aktualisiert werden soll
    10. ID = "Y" 'In welcher Spalte die ID steht
    11. UpdateFeld = "L" 'In welcher Spalte das Feld ist was aktualisiert werden soll
    12. DBAttribut = "XXXX" 'So heißt das Feld in der Datenbank das aktualisiert wird
    13. Dim objDatabase As Object 'für SQL Update
    14. Dim sSQL As String 'für SQL Update
    15. Dim Rng As Range, c As Range 'für den Change
    16. Set Rng = Intersect(Target, Range(UpdateFeld & ":" & UpdateFeld)) 'nur in L wird auf Chance überwacht
    17. If Not Rng Is Nothing Then
    18. For Each c In Rng
    19. 'Cells(c.Row, 1).Value = "Changed"
    20. Dim strQuest As String
    21. strQuest = MsgBox("Soll der Namegeändert werden? " & vbCr & _
    22. "Wählen Sie jetzt...", vbYesNo + vbQuestion, "Name ändern")
    23. 'Wenn die Abfrage mit "Nein" bestätigt wird,
    24. 'wird die Prozedur mit dem Befehl "Exit Sub" abgebrochen.
    25. If strQuest = vbNo Then
    26. MsgBox ("Es wurde nichts geändert"), , ("Abbruch")
    27. Exit Sub
    28. End If
    29. 'Es wird geändert
    30. 'MsgBox ("Erkannt wurde Zeile: " & c.Row)
    31. 'MsgBox ("Aktualisiert wird: " & Range("B" & c.Row)) 'Wert aus Spalte B und Zeile c.Row
    32. sSQL = "UPDATE " & Tabelle & " SET " & DBAttribut & " = '" & Range(UpdateFeld & c.Row) & "' WHERE ID =" & Range(ID & c.Row)
    33. Set objDatabase = CreateObject("DAO.DBEngine.120").OpenDatabase(DB)
    34. objDatabase.Execute sSQL, 128
    35. 'Next
    36. 'MsgBox ("JETZT ÄNDERN")
    37. sSQL = "SELECT " & DBAttribut & " FROM " & Tabelle & " WHERE ID =" & Range(ID & c.Row)
    38. Dim rs As Object
    39. Set rs = objDatabase.Openrecordset(sSQL)
    40. 'MsgBox ("Ich weiß noch: " & Range(ID & c.Row))
    41. If Not rs.EOF Then ' Prüfung auf leeres Recordset
    42. 'MsgBox ("Jetzt prüfe ich Db Inhalt: ") & rs.Fields(DBAttribut) & vbCr & ("Mit Excel Zellenwert: ") & Range(UpdateFeld & c.Row)
    43. If rs.Fields(DBAttribut) = " & Range(UpdateFeld & c.Row) & " Then
    44. MsgBox ("Prüfung war erfolgreich. In der DB steht: ") & rs.Fields(DBAttribut)
    45. 'MsgBox ("In der DB steht: ") & rs.Fields(DBAttribut)
    46. Else
    47. MsgBox ("Fehler:") & vbCr & ("Die Daten wurden evtl. nicht in der Datenbank gespeichert.") & vbCr & ("Bitte selbst vergleich ob die Daten überinstimmen.") & vbCr & ("Das steht in der Datenbank: ") & rs.Fields(DBAttribut) & vbCr & ("Das wurde bei Excel eingegeben: ") & Range(UpdateFeld & c.Row), , ("Fehler beim Aktualisieren")
    48. End If
    49. End If
    50. Next
    51. End If
    52. End Sub
    Um es etwas mit Fleisch zu füllen:

    Visual Basic-Quellcode

    1. Private ChangeEventDisabled As Boolean
    2. Private Sub Worksheet_Change(ByVal Target As Range)
    3. If ChangeEventDisabled Then Exit Sub
    4. ' hier der restliche Code
    5. End Sub
    6. Private Sub Aktualisieren_Click
    7. On Error Goto Done
    8. ChangeEventDisabled = True
    9. ' hier der Code, um die Aktualisierung anzustoßen
    10. Done:
    11. ChangeEventDisabled = False
    12. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    aggro600 schrieb:

    Ich meine Aktualisieren mit STRG+ALT+F5 also entwerder das ich auf den Button Klicke oder über die Tasten Kombi wobei der Button primär gedrückt wird.
    Das Button_Click-Event heisst so wie der Objektname des Buttons mit angehängtem "_Click" (z.B. Button1_Click).
    Ich kenne in ExcelSTRG+ALT+F5 hat damit nichts zu tun, das ist ein Universal-Shortcut und macht einfach auf alles ein Refresh, was aktualisiert werden kann (PivotTables, QueryTables...).
    Da musst du die Refresh-Events der einzelnen Tables abfangen.
    Bei einer QueryTable wäre das <QueryTable>_AfterRefresh (z.B. QueryTable1_AfterRefresh).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --