按变量寻址对象

时间:2019-07-02 14:16:30

标签: vba ms-access

在我的表单中,我有8个文本字段,它们用连续的数字命名(tbx_MyID 1 至tbx_MyID 8 )。我想遍历所有8个文本字段,以根据文本字段的值创建新记录。因此,我试图将文本字段名称存储在变量中,并通过此变量来处理文本字段。这只会产生一个错误,说明该对象不存在。

Private Sub btn_Enter_Click()
    Dim db As Database
    Dim rs As Recordset

    Set db = CurrentDb
    Set rs = db.OpenRecordset("tbl")

    Dim x As Integer
    x = 1
    While x < 9
        Dim y As String
        y = "tbx_MyID" & x
        rs.AddNew
        rs.Fields("ID") = Me!y.Value
        x = x+1
     Wend

    rs.Update
    rs.Close
    Set rs = Nothing
    db.Close 

End Sub

2 个答案:

答案 0 :(得分:2)

替换rs.Fields("ID") = Me!y.Value

rs.Fields("ID") = Me.Controls("tbx_MyID" & x)

它将起作用,因为基础控件类型(文本框)的默认属性是“文本”属性。

有很多方法可以动态引用表单上的控件。为文本框声明一个变量,获取对其的引用,然后专门引用Text属性,可能会更清楚:

Dim ctl As TextBox
Dim x As Integer

x = 1
While x < 9
ctl = Me.Controls("tbx_MyID" & x)
    rs.AddNew
    rs.Fields("ID") = ctl.Text
    x = x+1
Wend

答案 1 :(得分:2)

如前所述,您需要访问表单的Controls属性。

另外,您可能希望将文本框前缀和文本框的数量存储在常量中,以使代码更具可读性。

最后,even Microsoft suggestsWhile...Wend循环替换为Do...Loop构造。因此更新后的代码可能如下所示:

Option Explicit

Private Const TEXT_BOX_PREFIX As String = "tbx_MyID"
Private Const TEXT_BOX_COUNT As Integer = 8

Private Sub Command18_Click()
    Dim x As Integer
    Dim txtBox As Access.TextBox

    For x = 1 To TEXT_BOX_COUNT
        Set txtBox = Me.Controls(TEXT_BOX_PREFIX & x)

        Debug.Print txtBox.Value
        ' put your code to add/update records here.
    Next x
End Sub

如果您要澄清问题以表明文本框与新记录的关系如何,我可以更新答案以解决这一部分。