VBA表单 - 返回要操作的文本框对象

时间:2014-04-07 18:03:35

标签: forms vba

我正在以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缺乏了解。

由于

2 个答案:

答案 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