使用VBA设置子窗体控件的记录源

时间:2013-08-09 13:26:59

标签: sql vba ms-access access-vba ms-access-2010

无聊的背景,我正在尝试如何正确地使用Access实现VBA - 希望在我的工作地点改进一个非常原始的Access“应用程序”。管理是一种心态,如果“它”起作用(无论多么糟糕),为什么要尝试改进“它”呢?

所有这一切,正在使用表单来显示要打开以进行编辑的表的列表。主窗体包含选择下拉框和最初链接到表的子窗体。我正在尝试在子窗体中打开选定的表,以便用户删除不需要处理的记录(这是有效的,感谢stackoverflow.com)。

无论如何,用户选择该表,然后创建sql语句。

  

选择[PLS_Elkins_072513]。[结构数],[PLS_Elkins_072513]。[结构评价],[PLS_Elkins_072513]。[结构注释2],[PLS_Elkins_072513]。[结构注释3],[PLS_Elkins_072513] [结构评论4 ],[PLS_Elkins_072513]。[结构注释5],[PLS_Elkins_072513]。[结构注释6],[PLS_Elkins_072513]。[结构注释7],[PLS_Elkins_072513]。[结构注释8],[PLS_Elkins_072513] [结构评价9 ],[PLS_Elkins_072513]。[结构注释10],[PLS_Elkins_072513]。[结构注释11],[PLS_Elkins_072513]。[结构注释12],[PLS_Elkins_072513]。[结构注释13],[PLS_Elkins_072513] [结构评价14 ],[PLS_Elkins_072513]。[结构注释15],[PLS_Elkins_072513]。[结构注释16],[PLS_Elkins_072513]。[结构注释17],[PLS_Elkins_072513]。[结构注释18],[PLS_Elkins_072513] [结构评价19 ],[PLS_Elkins_072513]。[结构注释20],[PLS_Elkins_072513]。[结构注释21],[PLS_Elkins_072513]。[结构C] omment 22],[PLS_Elkins_072513]。[结构注释23],[PLS_Elkins_072513]。[结构注释24],[PLS_Elkins_072513]。[结构注释25],[PLS_Elkins_072513]。[结构注释26],[PLS_Elkins_072513] [结构注释27],[PLS_Elkins_072513]。[结构注释28],[PLS_Elkins_072513]。[结构注释29],[PLS_Elkins_072513]。[结构注释30],[PLS_Elkins_072513]。[结构注释31],[PLS_Elkins_072513]。[结构注释]评论32],[PLS_Elkins_072513]。[结构评论33],[PLS_Elkins_072513]。[结构评论34],[PLS_Elkins_072513]。[结构评论35],[PLS_Elkins_072513]。[结构评论36],[PLS_Elkins_072513]。[结构评论34]评论37],[PLS_Elkins_072513]。[结构评论38],[PLS_Elkins_072513]。[结构评论39],[PLS_Elkins_072513]。[结构评论40],[PLS_Elkins_072513]。[结构评论41],[PLS_Elkins_072513]。[结构评论38]评论42],[PLS_Elkins_072513]。[结构评论43],[PLS_Elkins_072513]。[结构评论44],[PLS_Elkins_072513]。 [结构评论45],[结构评论46],[PLS_Elkins_072513]。[结构评论47],[PLS_Elkins_072513]。[结构评论48],[PLS_Elkins_072513]。[结构评论49],[PLS_Elkins_072513]。 [结构评论50]来自PLS_Elkins_072513;

以下代码用于设置记录集

Me.sfrmTempTable.Form.RecordSource = strSQL

接下来我得到一个对话框,要求我输入51个字段的参数值...我点击“输入”51次....

http://i138.photobucket.com/albums/q245/yosso22/Work%20Pictures/accessvba/enter_parameter_value_zps0f75f99d.png

VBA代码......

Private Sub EditStakingTable_Click()

Dim strSQL As String
Dim SelectTable As String

On Error GoTo Err_Handler

SelectTable = Me.InputTable.Value

' Check for a blank table name
If SelectTable = "" Then
    MsgBox "No Table Selected!!!", vbInformation, "Please select a table for editing."
    Exit Sub
End If

' Process - 6/13/13
' DoCmd.SetWarnings False ' Turn off warnings

strSQL = "SELECT [" & SelectTable & "].[Structure Number], [" & SelectTable & "].    [Structure Comment 1], [" & SelectTable & "].[Structure Comment 2], [" & SelectTable & "].    [Structure Comment 3], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 4], [" & SelectTable & "].    [Structure Comment 5], [" & SelectTable & "].[Structure Comment 6], [" & SelectTable & "].    [Structure  Comment 7], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 8], [" & SelectTable & "].    [Structure Comment 9], [" & SelectTable & "].[Structure Comment 10], [" & SelectTable & "].    [Structure Comment 11], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 12], [" & SelectTable & "].    [Structure Comment 13], [" & SelectTable & "].[Structure Comment 14], [" & SelectTable &     "].[Structure Comment 15], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 16], [" & SelectTable & "].[Structure Comment 17], [" & SelectTable & "].[Structure Comment 18], [" & SelectTable & "].[Structure Comment 19], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 20], [" & SelectTable & "].[Structure Comment 21], [" & SelectTable & "].[Structure Comment 22], [" & SelectTable & "].[Structure Comment 23], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 24], [" & SelectTable & "].[Structure Comment 25], [" & SelectTable & "].[Structure Comment 26], [" & SelectTable & "].[Structure Comment 27], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 28], [" & SelectTable & "].[Structure Comment 29], [" & SelectTable & "].[Structure Comment 30], [" & SelectTable & "].[Structure Comment 31], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 32], [" & SelectTable & "].[Structure Comment 33], [" & SelectTable & "].[Structure Comment 34], [" & SelectTable & "].[Structure Comment 35], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 36], [" & SelectTable & "].[Structure Comment 37], [" & SelectTable & "].[Structure Comment 38], [" & SelectTable & "].[Structure Comment 39], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 40], [" & SelectTable & "].[Structure Comment 41], [" & SelectTable & "].[Structure Comment 42], [" & SelectTable & "].[Structure Comment 43], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 44], [" & SelectTable & "].[Structure Comment 45], [" & SelectTable & "].[Structure Comment 46], [" & SelectTable & "].[Structure Comment 47], ["
strSQL = strSQL & SelectTable & "].[Structure Comment 48], [" & SelectTable & "].[Structure Comment 49], [" & SelectTable & "].[Structure Comment 50] FROM " & SelectTable & ";"

Debug.Print strSQL

Stop

' 8 / 09 / 13

Me.sfrmTempTable.Form.RecordSource = strSQL

' After tblStakingEdit has been opened, edited and closed
' copy (or rename) the tblStakingEdit table back to
' the originally named table

'DoCmd.SetWarnings True ' All done, turn on warnings back on.

Exit_Here:

Exit Sub

Err_Handler:
     If Err.Number = 2101 Then
     'Me.frmtesting.Visible = True
     'ignore or message
     Else
        MsgBox Err.Description
     End  If

     Resume Exit_Here

End Sub

代码运行后,我回到原始屏幕,但子窗体中的所有字段都显示“#Name?”。

最终产品的屏幕截图网址 “http://i138.photobucket.com/albums/q245/yosso22/Work%20Pictures/accessvba/final_screenshot_error_zpsa8ecb3a8.png

我必须要有一些东西可以忽略,因为我正在学习“飞”这样的话。我确实购买了一本MVP书“访问解决方案”,其中有很多很好的例子,但现在我不知所措,并且正在向stackoverflow.com集体寻求帮助。 : - )

1 个答案:

答案 0 :(得分:1)

接下来我得到一个对话框,要求我输入51个字段的参数值...我点击“输入”51次....

SELECT子句列出了51个字段。如果PLS_Elkins_072513中不存在这些字段,则db引擎将假定(不存在的)字段名称实际上是参数,并要求您为它们提供值51次。然后子窗体字段在窗体的记录集中找不到它们的控件源,因此Access显示#Name?

您的VBA代码包括......

Debug.Print strSQL

因此,从“立即”窗口复制该输出,在查询设计器中创建新查询,切换到SQL视图,然后粘贴复制的文本。这项工作应该可以帮助您弄清楚如何更改查询,以便Access可以接受它而无需询问参数。

在更大的图片视图中,我了解您所描述的策略,只有在所有可能的表选择包含相同的51个字段时才能使用。具有相同结构的多个表通常被认为是差的设计。

当您对所有这些进行排序时,您可以为用户提供另一种选择,允许他们选择一个表并查看/编辑它。

DoCmd.OpenTable Me.InputTable.Value, acViewNormal

这并没有给出自定义表单的所有功能,但是当你修复原始表单时,它是一个简单的临时kludge。