2015-11-07 51 views
0

我有一个访问2007年窗体与两个列中的18个文本框控件。他们在输入新样式时将颜色和颜色代码添加到供应商表格中。 第一栏的控件被命名为COLOR1,COLOR2等,和列二的控制被命名为代码1,代码2,等等如何使用变量字符串引用表单上的现有对象名称

下面的代码通过文本框控件那张表格上,并得到控制的名称和值正常。

我知道我需要把另一个if/then类型语句只在case语句选择的控件的名字以“color”开头时才执行动作。稍后我会补充。

如果您看到sql语句,我试图通过调用名称以“code”开头并以当前正在与“color”文本框关联的数字结尾的控件来插入新的颜色/代码组合在案例选择评估。
TL; DR,当文本框“color1”正在被评估时,我希望“code1”中的内容也是sql语句的一部分。最后的数字是两者之间的联系。

我敢肯定,我可能使用ctrlcode或类似的东西不正确的引用,但如果有人知道我想要做的,可以帮助我得到这个工作,我会很感激的。

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 

下一页

+0

Styletext是包含样式名称的表格控件文本框(而不是“text1”)的名称。 – RunningWithScissors

回答

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选项。这会迫使你编译所有变量并在编译时发现这些错误。

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

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

谢谢安德烈。我确实已经修复了我的Styletext部分(感谢提醒),这是我正在寻找的确切答案。我很惊讶,那是近在咫尺......我与frm。对显式/需要声明很好的调用。 这就是说,我可能会像汉斯那里一样进行一个for循环。如果我在某些时候构建了表单选项,我最初会避免这种类型,但是需要在每个框中检查“颜色”与“代码”,现在看起来效率较低。如果我进行更改,更改for声明中的数字并不是那么困难。 – RunningWithScissors

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 
+0

+1这是一个更清洁。但我想知道:为什么你使用'.Value'(在任务的两边)?习惯的力量,还是它解决了依赖'.Value'作为记录集字段和控件的默认属性时可能出现的问题? – Andre

+0

我希望在'.Value'中明确包含'.Value'。这不是真正的好处,但也不会造成伤害。 ;-)我发现它是一种有用的习惯,因为我已经准备好了默认属性不是被引用的情况......例如'TypeName(!Color)'将返回*“Field2”*而不是字段的'。价值' – HansUp

+0

我喜欢这里的代码答案。事后看来,使用for循环会更清晰,如果将它构建到超过9个盒子,for循环避免了在控件名称的文本字符串中找到数字所需的更多操作。 我也可以将单个数字框重命名为01到09,然后是10和以上等等,但即使如此,代码也只会变得臃肿而不需要通过每个ctl方法。 感谢您的建议。 – RunningWithScissors

相关问题