2014-04-07 61 views
0

我在vba表單中創建遊戲。現在它創建一個數組9x9的文本框並填充並禁用帶給定遊戲信息的文本框。在創建文本框時,我將它們命名爲「fieldx-y」,以便我可以輕鬆查找它們。我想以某種方式將它們放入一個數組中,以便我可以像field(x,y)那樣查看它們,然後對它們執行操作,例如更改文本框的背景顏色或更改其中的信息。VBA表單 - 返回要操縱的文本框對象

這是我想用來找到使用它的名稱的對象,並返回它被操縱的功能。

Public Function getField(x As Integer, y As Integer) As MSForms.TextBox 
    Dim field As MSForms.TextBox 
    For Each field In Me.Controls 
     If Right(field.Name, 1) = y And Left(Right(field.Name, 3), 1) = x Then 
      getField = field 
     End If 
    Next 
End Function 

這裏是我想從我的窗體操縱它初始化子

getField(5,5).Enabled=False 

我敢肯定,我必須做一些非常錯誤的,這是因爲面向對象的我缺乏瞭解可能和vba。

感謝

回答

0

既然你選擇了一個可預測的命名約定你可以使用你的命名約定直接調用這些控件。沒有必要遍歷所有的控件。另外,我將您的fieldx-y更改爲fieldx_y,因爲-是非法字符變量名稱。

Public Function getField(x As Integer, y As Integer) As MSForms.TextBox 
    set getField = me.controls("field" & x & "_" & y) 
End Function 
+0

這正是我想要以迂迴的方式來做的。我的功能也缺少「設置」。謝謝 – user3507905

0

如果你正在做的是能夠控制,那麼你可能實際上並不需要返回文本框,在這種情況下tb變量不添加到調用過程,並改變你的函數的子,如:

Public Sub getField(x As Integer, y As Integer) 
    Dim field As MSForms.TextBox 
    For Each field In Me.Controls 
     If Right(field.Name, 1) = y And Left(Right(field.Name, 3), 1) = x Then 
      '## Disable this textbox 
      field.Enabled = False 
      Exit For 
     End If 
    Next 
End Sub 

如果需要一個文本框返回到調用程序,然後執行以下操作:

在您的通話過程中,你需要一個O bject變量來表示返回的MSForms.TextBox:

Dim tb as MSForms.TextBox 
Set tb = getField(5,5) 
tb.Enabled = False 
在你的日常功能,然後

,因爲它是一個對象,你需要的Set關鍵字:

Set getField = field 
Exit For '## You need to escape the loop otherwise it will keep going, giving undesired results.