我正在以vba形式创建游戏。现在它创建了一个9x9的文本框数组,并使用给定的游戏信息填充和禁用文本框。在创建文本框时,我将它们命名为" fieldx-y"所以我可以轻松地查找它们。我想以某种方式将它们放入一个数组,以便我可以像字段(x,y)一样查找它们,然后对它们做一些事情,比如更改文本框的背景颜色或更改其中的信息。
这是我想用它来查找对象的函数,并将其返回以进行操作。
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
以下是我想从我的userform initialize sub
中操纵它的方法getField(5,5).Enabled=False
我确定我必须做错事,这可能是因为我对OOP和vba缺乏了解。
由于
答案 0 :(得分:0)
如果你正在做的只是启用控件,那么你实际上可能不需要返回文本框,在这种情况下不要将tb
变量添加到调用过程,并将你的函数更改为sub,像:
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
如果您执行需要将文本框返回到调用过程,请执行以下操作:
在您的调用过程中,您需要一个对象变量来表示返回的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.
答案 1 :(得分: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