2017-02-14 10 views
0

我想在VBA中有一個子例程,通過迭代有條件地更改表單上20+個按鈕中每個按鈕的Enabled屬性,而不是手工編寫它們。這些按鈕的名稱與它們處理的表相似。例如:要處理的表格稱爲「CUTLIST」;其相應的按鈕被稱爲「but_CUTLIST」。還有另一個表包含要處理的表的列表(用於其他子目標中的迭代目的)。VBA中是否有方法遍歷表單上的特定對象?

我有什麼到目前爲止...

Private Sub txt_DataSet_GotFocus() 

Dim sqlQry as String 
Dim butName As String 
Dim tableList As Recordset 
Dim tempTable As Recordset 

Set tableList = CurrentDb.OpenRecordset("TableList") 'names of tables for user to process 
tableList.MoveFirst 'this line was corrected by moving out of the loop 

Do Until tableList.EOF 
    sqlQry = 'SQL query that determines need for the button to be enabled/disabled 
    Set tempTable = CurrentDb.OpenRecordset(sqlQry) 
    If tempTable.RecordCount > 0 Then 
     'begin code that eludes me 
     butName = "but_" & tableList!tName 
     Me(butName).Enabled False 
     'end code that eludes me 
    End If 
    tableList.MoveNext 
Loop 

End Sub 

如果我沒有記錯,JavaScript是能夠通過處理它們作爲文檔對象的元素通過可變呼籲的對象「數組」。例如:this[objID]=objVal對VBA來說這樣的事情是可能的,還是我只是想說這些都是錯的?

查看其他問題......這就是所謂的「反思」?如果是這樣,那麼這不能在VBA中完成。 :(

如果更多的解釋有助於更好地回答這個問題...我有一個實用程序對預先定義的表集運行SQL查詢每個表都有自己的按鈕,以便用戶可以根據需要處理對任何表的查詢根據事先對數據發生的情況,可能需要通過按下所述按鈕來查詢任何表的組合。不斷查閱日誌,查看已經完成的操作,會變得麻煩在處理好幾個數據集之後,我想讓這些按鈕單獨禁用,如果它們不是當前關注的數據集所需要的。我對如何實現這一點有另一種想法,但是讓這些代碼運行起來會更快我會學到一些東西

+1

'Me.Controls(butName)'... – Comintern

+0

您在通過記錄集循環的每次迭代中調用'tableList.MoveFirst' –

+0

@TimWilliams是的,謝謝。我只是快速寫出了代碼,並試圖查看我是否可以找出如何解決控件名稱問題。修正並註釋了示例代碼以反映您的更正。 – AJK

回答

1

我不是VBA的專家,但我會重新安排代碼利用這一事實,好處是可以在用戶通過表單控件集合迭代

事情是這樣的:

Dim ctrl as Control 

For Each ctrl in UserForm1.Controls 

    If TypeName(ctrl) = "Button" Then 
    ctrl.Enabled = True 
    End If 
Next 

您可以將按鈕名稱傳遞給其他函數(從此循環中)以確定是否啓用/禁用所討論的按鈕。

+0

這個概念看起來很有用。它可以讓我分別對啓用/禁用的邏輯進行編碼並隨意調用它,以便在按下按鈕後再次調用它。我最近認爲,在驗證成功的數據事務後,按鈕應該主動禁用它們自己。運營商工作的性質導致很多分心,所以任何一種進展指示都會有所幫助。 – AJK

+0

表單上的按鈕比要迭代的按鈕更多,所以不是'If TypeName(ctrl)=「Button」Then'我最終標記了所有要處理的按鈕,然後用'If ctrl.Tag =「tagName」Then'。將迭代代碼從啓用/禁用代碼中分離出來使項目更加靈活。非常感謝你。 – AJK