2016-02-05 23 views
1

我有一個使用多值字段的Access 2010數據庫(Access內置方法在兩個表之間具有m:n關係)。
爲了跟蹤對數據庫的更改,每次更新相應表單時都使用AuditTrail VBA過程,並保存對歷史表的​​所有更改。通過AuditTrail保存對多值組合框的更改

現在,當我改變ComboBox的價值和循環到達綁定到多值字段的組合框,程序拋出,因爲不兼容的數據類型的錯誤:

For Each ctl In Screen.ActiveForm.Controls 
    If ctl.Tag = "History" Then 
     If Nz(ctl.Value) <> Nz(ctl.OldValue) Then 
      With rst 
       .AddNew 
       ![timestamp] = datTimeCheck 
       ![UserName] = strUserID 
       ![FormName] = Screen.ActiveForm.Name 
       ![recordid] = Screen.ActiveForm.Controls(IDField).Value 
       ![FieldName] = ctl.ControlSource 
       ![beforeValue] = ctl.OldValue 
       ![afterValue] = ctl.Value 
       .Update 
      End With 
     End If 
    End If 
Next ctl 

如何獲得的實際ValueOldValue從組合框轉換爲VBA中的字符串?

我試過combobox.focus然後combobox.Text 這個工作,但沒有幫助OldValue問題。

如何正確使用組合框的valueoldvalue屬性?組合框的官方VBA對象參考根本沒有幫助。 https://msdn.microsoft.com/en-us/library/office/ff821691.aspx

+0

謝謝@Andre你的改變。我不是一個本地人,我的訪問是在德國,所以我必須翻譯所有^^ –

回答

0

它不是一個完美的解決方案,只是一個快速&骯髒的解決方法:

修改代碼,以便它檢查不同ComboBox1和其他控件。 .Value.OldValue基本上是一組變體。

Dim afterValue as variant 
Dim beforeValue as Variant 

For Each ctl In Screen.ActiveForm.Controls 
    If ctl.Tag = "History" Then 
     If Ctl.name = "ComboBox1" then 
      err.clear 
      on error resume next 
      I=0 
      afterValue = "" 
      beforeValue = "" 
      while err=0 
       ' 
       ' Throws an error if 'out of range', i.e. after the last value 
       ' 
       afterValue = afterValue + Nz(Cstr(ComboBox1.Value(I))) + ";" 
       beforeValue = beforeValue + Nz(Cstr(ComboBox1.OldValue(I))) + ";" 

      wend 
     else 
      afterValue = ctl.Value 
      beforeValue = Nz(ctl.OldValue) 
     endif 
     If Nz(ctl.Value) <> a$ Then 
      With rst 
       .AddNew 
       ![timestamp] = datTimeCheck 
       ![UserName] = strUserID 
       ![FormName] = Screen.ActiveForm.Name 
       ![recordid] = Screen.ActiveForm.Controls(IDField).Value 
       ![FieldName] = ctl.ControlSource 
       ![beforeValue] = beforeValue 
       ![afterValue] = afterValue 
       .Update 
      End With 
     End If 
    End If 
Next ctl 
+0

ComboBox已經有一個內置的.OldValue屬性,我認爲,工作正常。 我的問題是,我不明白如何從.Value或.OldValue屬性中獲取「文本」值。 –

+0

我更新了我的答案 – Cisco

+0

@JanOechsler我的代碼有用嗎? – Cisco

2

ctl引用與選定的至少一個項目,你的測試條件的多值組合框...

Nz(ctl.Value) <> Nz(ctl.OldValue) 

...肯定會拋出一個類型不匹配錯誤。在這種情況下,ctl.Value實際上是一個變體數組,而Nz()無法應對它。這個問題基本上是相同的,因爲這...

Debug.Print Nz(Array(1,2,3)) '<- type mismatch error 

也許你寧願搶串聯組合選擇的串...

Debug.Print Join(ctl.Value, ",") 

如果這看起來有用,提防ctl.Value會在沒有選擇任何項目時爲空。並試圖Join()空也會觸發類型不匹配錯誤。

注意這些問題也適用於ctl.OldValue

但是可能還有另一個複雜因素。根據我的測試,我懷疑OldValue對於多值組合框是否可靠。如果您也發現這種情況,請使用表單的當前事件將組合的初始選擇存儲在表單級變量中,並在審計過程中引用該變量(而不是OldValue)。