如何使用变量字符串引用表单上的现有对象名称

时间:2015-11-07 18:37:07

标签: ms-access access-vba ms-access-2007

我有一个访问2007表单,在两列中有18个文本框控件。它们是在输入新样式时向供应商表添加颜色和颜色代码。 第一列控件名为Color1,Color2等,第二列控件名为Code1,Code2等。

下面的代码遍历表单上的文本框控件,并获取控件的名称和值。

我确实认识到,如果case语句选择的控件的名称以" color"开头,我需要再设置一个if / then类型语句来执行操作。我稍后会添加。

如果您看到sql语句,我试图通过调用名称以&#34开头的控件来插入新的颜色/代码组合;代码"并以与"颜色相关联的数字结束"目前正在案例选择中评估的文本框 TL; DR,当文本框" color1"正在评估中,我想要的是" code1"也是sql语句的一部分。最后的数字是两者之间的联系。

我确定我可能使用了错误的ctrlcode或类似的参考资料,但如果有人知道我想要做什么并且可以帮助我实现这一目标,那么我&#39 ;欣赏它。

Dim sql As String, ctrlcode As Control  'Also tried as Object

For Each ctl In Me.Controls
Select Case ctl.ControlType
Case acTextBox           'Only searching textboxes
    'Debug.Print ctl.Name, ctl.Value
    If Not IsNull(ctl.Value) Then
        Debug.Print ctl.Name, ctl.Value, Right(ctl.Name, 1)
        **Next line fails   Runtime error 424, object required**
        Set ctrlcode = frm.Controls("code" & Right(ctl.Name, 1))
        Debug.Print ctrlcode.Value, "ctrlcode value"

        sql = "INSERT INTO tblVendorColors (Stylecode, color, colorcode, coloravail)" _
            & " VALUES (Styletext, '" & ctl.Value & "', '" & ctrlcode.value & "', true)"
    Debug.Print sql
    End If

Case Else
    ' pass
End Select

下一步

2 个答案:

答案 0 :(得分:3)

使用For i = 1 To 9循环显示文本框对。然后,您可以将文本框值引用为Me.Controls("Color" & i).ValueMe.Controls("Code" & i).Value

您可以向记录集添加一行并将值存储在那里,而不是构建和执行INSERT

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Long

Set db = CurrentDb
Set rs = db.OpenRecordset("tblVendorColors", dbAppendOnly)
With rs
    For i = 1 To 9
        If Not IsNull(Me.Controls("Color" & i).Value) Then
            .AddNew
            !Stylecode.Value = Me!Styletext.Value
            !Color.Value = Me.Controls("Color" & i).Value
            !colorcode.Value = Me.Controls("Code" & i).Value
            !coloravail.Value = True
            .Update
        End If
    Next
    .Close
End With

答案 1 :(得分:2)

    **Next line fails   Runtime error 424, object required**
    Set ctrlcode = frm.Controls("code" & Right(ctl.Name, 1))

而不是frm.,请使用Me.

您应该将Option Explicit放在所有模块的开头,并在VBA编辑器中设置Require Variable Declaration选项。这会强制您Dim所有变量并在编译时发现此类错误。

此外,如果Styletext是控件,则在构建SQL字符串时需要将其视为ctlctrlcode

" VALUES ('" & Me.Styletext & "', '" & ctl.Value ...