2016-05-02 67 views
1

我使用Access VBA 2013應用程序,該項目的這一部分重點關注窗體控件和按鈕。用於設置窗體控件屬性的Eval()

由於預留了按鈕,我想鎖定/解鎖控​​制修改。 更多通用性,我希望通過這些事件稱爲潛艇稱之爲自制功能:

Sub LockAssociateControl(fctName As String, val As Boolean) 
    Dim code As String 
    code = "Forms!" & getModuleName & ".Controls!" & fctName & ".Locked = " & CStr(val) 
    Debug.Print (code) 'just to test 
    Eval code 
End Sub 

(getModuleName也是一個自制的函數,返回模塊的調用函數的正確名稱)

對於例如,這一個被稱爲象下面這樣:

Private Sub FirstName_Exit(Cancel As Integer) 
    Call LockAssociateControl("FirstName", True) 
End Sub 

和「代碼」變量,它設置(與模塊1屬「形式Module1.Controls Name.Locked =真!」 ted by getModuleName和Name作爲參數(我還沒找到更好的))

現在我想要評估這段代碼,以避免硬編碼每個事件子。

我的問題是,在​​線上發生了錯誤,並說:

錯誤代碼:2770到您在Visual Basic程序作爲OLE對象下文稱的對象不是一個OLE對象

我環顧了StockOverflow和其他論壇,找出​​有什麼問題,並且我發現這個函數的行爲並不是爲我想要的。所以我試圖找到另一種方式來做到這一點,因爲Evaluate函數不存在於Access等,但我沒有發現真正有用的東西。

我試圖用對​​參數字符串DoCmdCall或各種變換,但至今沒有奏效...

所以我的問題是:做任何你有這個問題的解決方案?如果沒有,你是否知道一個替代方案,不必在每個事件函數中寫入完整的語句,如:Forms!Module1.Controls!Name.Locked = False

+0

首先測試一下,如果你的方法是硬編碼的,那麼該怎麼辦?如果這有效,然後嘗試eval()。 –

+0

由於我沒有能力找到通用的方法來做,我確實做了一個我正在處理的表單的複製版本,而且我目前正在處理這個版本來處理代碼的其他方面。這是一個臨時的解決方案,但我希望不要因爲它的靈活性而永久卡住這個版本。 – Immoskyl

回答

1

你可以做你想做的,而無需使用​​容易...

Sub LockAssociateControl(fctName As String, pVal As Boolean) 
    Forms(getModuleName).Controls(fctName).Locked = pVal 
End Sub 

注意我從val改變參數名pVal以避免與Val()功能混淆了。

+1

非常感謝!在這裏工作得很好! =) – Immoskyl

相關問題