2016-05-23 8 views
0

Ich habe eine Funktion, die alle Steuerelemente in einem Formular durchläuft. Wenn das Tag "Audit" anzeigt, verfolgt es die Änderungen, die an diesem Feld vorgenommen wurden. Es hat bis jetzt gut funktioniert. Jetzt gibt es einen Fehler von "Operation wird für diesen Objekttyp nicht unterstützt". Wenn ich die Fehlerbehandlung abstelle und den Code überprüfe, füttert er aus irgendeinem Grund das tatsächliche Feld VALUE als den Kontrollnamen. Jede Hilfe würde sehr geschätzt werden. Hier ist der Code:Zugriff VBA-Schleife durch Steuerelemente Zeigt Feld Wert als Steuerelementname

Dim rst As Recordset 
Dim ctl As Control 
Dim datTimeCheck As Date 
Dim strUserID As String 
Dim dbs As DAO.Database 
Dim strSQL As String 

Set dbs = CurrentDb 
strSQL = "SELECT * FROM ChangeLog" 
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges) 

datTimeCheck = Now() 
strUserID = Environ("USERNAME") 
For Each ctl In Screen.ActiveForm.Controls 
    If ctl.Tag = "Audit" Then 
     If Nz(ctl.Value) <> Nz(ctl.OldValue) Then 
      With rst 
       .AddNew 
       ![ChangeTimeStamp] = datTimeCheck 
       ![UserId] = strUserID 
       ![FormName] = Screen.ActiveForm.Name 
       ![LeadID] = Lead 
       ![EstID] = Estimate 
       ![EOINumber] = Order 
       ![InstalID] = Install 
       ![FieldName] = ctl.ControlSource 
       ![FieldValueBeforeChange] = Nz(ctl.OldValue, "Blank") 
       ![FieldValueAfterChange] = Nz(ctl.Value, "Blank") 
       .Update 
      End With 
     End If 
    End If 
Next ctl 

Antwort

1

Nicht alle Kontrollen haben die ControlSource Eigenschaft wie Befehlsschaltflächen, Rechtecke und Linien. Nur datengesteuerte Objekte wie Textfelder, Kontrollkästchen, Kombinationsfelder, Listenfelder haben diese Eigenschaft. Erwägen Sie daher, Ihre Suche mit dem Textfeld ControlType zu konditionieren. Daher die Herausforderung, alle Formularsteuerelemente zu durchlaufen!

... 
For Each ctl In Me.Form.Controls 
    If ctl.ControlType = acTextBox And _ 
     ctl.Tag = "Audit" And _ 
     Nz(ctl.Value) <> Nz(ctl.OldValue) Then 
      With rst 
       .AddNew 
       ![ChangeTimeStamp] = datTimeCheck 
       ![UserId] = strUserID 
       ![FormName] = Screen.ActiveForm.Name 
       ![LeadID] = Lead 
       ![EstID] = Estimate 
       ![EOINumber] = Order 
       ![InstalID] = Install 
       ![FieldName] = ctl.ControlSource 
       ![FieldValueBeforeChange] = Nz(ctl.OldValue, "Blank") 
       ![FieldValueAfterChange] = Nz(ctl.Value, "Blank") 
       .Update 
      End With 
    End If 
Next ctl 
+0

Ich schätze den Vorschlag. Ich werde es definitiv nutzen können, um dies effizienter zu machen. Das löst das Problem jedoch nicht. Es erzeugt immer noch den gleichen Fehler. Ich habe ein Textfeld mit dem Namen "Adresse", und der Wert auf dem bestimmten Datensatz, mit dem ich gerade teste, ist "444 Shadow Hill". Wenn ich den Code ausführe, läuft er falsch und zeigt ctl als "444 Shadow Hill", wenn ich auf dem Debugging-Bildschirm darüber blättern werde. –

+0

In welcher Zeile markiert der Debugger? Auf 'ctl.ControlSource'? – Parfait

+0

on "Für jedes ctl In Screen.ActiveForm.Controls" –

Verwandte Themen