从另一种形式访问VBA可见控制表单

时间:2014-10-24 18:45:35

标签: forms vba access-vba

我有一个表和表单设置来控制数据库中的另一个表单。 我想创建一个代码,从我的字段中获取标题,并将其作为变量添加到我的代码中,以更改其他表单的可见性选项。

我的表单设置了我要控制的表单上所有对象的所有名称。

LSE_FORM_ADMIN =包含所有LSE_FORM_ALL名称的表。 表格设置为3列键,名称和复选框,我将其放入表单中以制作连续列表。

这是我在表单上的代码,但我一直在和运行时424:对象所需的错误:

    Private Sub Form_Current()
    Dim VARSET As Object
    Dim VAR As String
    VARSET = DLookup("TITLE", Table!LSE_FORM_ADMIN, "") 'keep getting error here
    VAR = VARSET
    If Me!CB = "-1" Then
    Form_LSE_FORM_ALL!VAR.Visible = True
    Else
    Form_LSE_FORM_ALL!VAR.Visible = False
    End If
    End Sub

有人可以帮我修复这段代码,以便它获取标题字段数据并将其作为一个变量添加到其余代码中吗?

4 个答案:

答案 0 :(得分:0)

在从表单执行表记录集时,真的不确定如何执行语法,需要一些帮助。 这是我的代码并尝试记录集:

Private Sub Form_Current()
Dim DB As Database
Dim RS As Recordset
Dim RST As String

    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("LSE_FORM_ADMIN")
    Set RST = RS              'GETTING OBJECT REQUIRED ERROR ON "RST ="

    Do Until RS.EOF
        RST = Me!TITLE
        RS.MoveNext
    Loop

If Me!CB = "-1" Then
Form_LSE_FORM_ALL!RS.Visible = True
Else
Form_LSE_FORM_ALL!RS.Visible = False
End If
End Sub

答案 1 :(得分:0)

我知道你要做什么,但是你的描述/引用并不匹配。请查看以下评论​​并澄清: 1.你说“......制作一个代码,从我的字段中取出标题......”但你的代码是“Me.Title”,“ME”是对表格的引用 - 而不是字段。 2.您的代码位于“Form_Current”事件中,这意味着它将为您处理的每条记录触发。这将有效,但我认为你只想做一次代码以提高效率。 3.您没有处理多个字段的规定。我认为您需要循环遍历表中的所有字段,将可见设置为true或false。

以下是我的建议,但一旦澄清问题,我会更新。

Option Compare Database
Option Explicit

Dim DB      As DAO.Database
Dim RS      As DAO.Recordset
'Dim RST     As Variant
'Dim RSTT    As Variant

 Public Sub FORM_CURRENT()

 Set DB = CurrentDb
 Set RS = DB.OpenRecordset("LSE_FORM_ADMIN")
 Do While Not RS.EOF                    ' Loop thru all field names for the form
    If RS!HideYN = True Then            ' Desire to hide the field?
        Me(RS!ctlname).Visible = False   ' Yes, hide the field.
    Else
        Me(RS!ctlname).Visible = True    ' No, show the field
    End If

    RS.MoveNext                         ' Get next field name
 Loop
 RS.Close
 Set RS = Nothing
 Set DB = Nothing
 'Set RST = Me!Title
 'RSTT = "Form_LSE_FORM_ALL" & "!" & (RST)

'If Me!CB = "-1" Then
'    RSTT.Visible = True    'getting Run-time error '424': object required
'Else
'    RSTT.Visible = False
'End If

End Sub

答案 2 :(得分:0)

很难确切地看到您要实现的目标,但是当您应该使用显式的Form或Control类型时,您的问题源于使用变量变量类型。使用你的上一个例子。

  

RSTT.Visible = True'获取运行时错误'424':需要对象

这是因为您已将RSTT声明为变体。这条线

RSTT = "Form_LSE_FORM_ALL" & "!" & (RST)

导致变量RSTT包含一个字符串,该字符串没有属性“.Visible”

Set DB = CurrentDb
Set RS = DB.OpenRecordset("LSE_FORM_ADMIN")

这些行是多余的,因为您已经在表格字段上提供了所需的值,这些值已经绑定到表LSE_FORM_ADMIN。

据我所知,你有一个连续表格(ADMIN?)绑定到表LSE_FORM_Admin。当您单步浏览此表单上的记录时,您希望触发代码,该代码获取TITLE字段/控件的值并使用它来设置具有相同名称的控件,在单独的表单Form_LSE_FORM_ALL上为(in)可见,取决于ADMIN表单上复选框控件名称CB的值?

如果您希望ADMIN表单对ALL表单进行“实时”更改,则应考虑使用CB复选框控件的事件。使用表单的当前事件意味着您所做的更改将不会反映在ALL表单中,直到您退出刚刚编辑的记录,然后返回,以在该记录上触发表单的Current事件。

使用CB复选框的AfterUpdate事件的示例

Private Sub CB_AfterUpdate()

Dim strRST As String
Dim frmTarget as Form
Dim ctlRSTT As Control

Set strRST = Me!TITLE
Set frmTarget = Forms("Form_LSE_FORM_ALL")
Set ctlRSTT = frmTarget.Controls(strRST)

ctlRSTT.Visible = Me!CB    'getting Run-time error '424': object required

End Sub

答案 3 :(得分:0)

最终代码,感谢Cheesenbranston。

Private Sub Form_AfterUpdate()
Dim strRST As String
Dim frmTarget As Form
Dim ctlRSTT As Control

strRST = Me!TITLE
Set frmTarget = Forms("LSE_FORM_ALL")
Set ctlRSTT = frmTarget.Controls(strRST)

    If Me!CB = "-1" Then
        ctlRSTT.Visible = True
        Else
        ctlRSTT.Visible = False
    End If
End Sub

@Cheesenbranston:您的原始代码更像是打开和关闭的切换,所以如果我的对象不可见,那么我的触发器复选框会在检查时使其可见,更符合我自己需要的生活质量,尽管如此工作。 strRST也不需要SET,因为它只是一个字符串。再次感谢= D非常快乐的一天!