使用VBA在Access表单上创建一个按钮来填充文本框

时间:2013-11-19 22:13:04

标签: sql vba ms-access access-vba

(请注意这是针对学校作业的,所以尽管有更有效的方法可以解决我面临的问题,但需要以特定的方式完成。)

我在Access上创建了一个名为“新生儿疾病风险计算器”的表单。这种形式的目的主要是根据DNA的构成,找出新生儿可能面临的疾病风险。以下是我的表单所需的功能:

表单有一个按钮和两个文本框。用户将NewBornID输入到第一个文本框中,然后单击该按钮。然后,第二个文本框根据SQL查询显示新生儿可能面临风险的疾病。这是我的小组伙伴写的查询(我知道它很草率,可以改写):

    SELECT Mutation.DiseaseAssociation, Newborn.NewBornID
FROM Newborn INNER JOIN ((Mutation INNER JOIN (DNA INNER JOIN DNAMutation ON DNA.DNA_ID = DNAMutation.DNA_ID) ON Mutation.MutationID = DNAMutation.MutationID) INNER JOIN NewbornDNA ON DNA.DNA_ID = NewbornDNA.DNA_ID) ON Newborn.NewBornID = NewbornDNA.NewBornID
WHERE (((Newborn.NewBornID)=[InputNewBornID]));

因此,由于我的编码经验很少,以下是我的问题:

1)甚至可以让结果TextBox以文本格式显示查询信息吗?

2)如果是这样,最好的方法是什么?我将在下面发布我的完整代码,但我似乎无法让文本框显示任何结果。我知道这是一个相当基本的问题,但我很清楚这一点,所以任何建议都会非常有用。

以下是按钮点击的代码:

Private Sub Comand0_Click()
Dim db As Database, rs As Recordset, strSQL As String

Set db = CurrentDb

strSQL = "SELECT Mutation.DiseaseAssociation, Newborn.NewBornID FROM Newborn INNER JOIN ((Mutation INNER JOIN (DNA INNER JOIN DNAMutation ON DNA.DNA_ID = DNAMutation.DNA_ID) ON Mutation.MutationID = DNAMutation.MutationID) INNER JOIN NewbornDNA ON DNA.DNA_ID = NewbornDNA.DNA_ID) ON Newborn.NewBornID = NewbornDNA.NewBornID WHERE Newborn.NewBornID=Forms!Calculator!txtSearch;"


Set rs = db.OpenRecordset(strSQL)
Me!lstDiag.RowSource = strSQL



End Sub

1 个答案:

答案 0 :(得分:1)

您的配合创建了一个查询,您的VBA代码尝试从该查询中检索结果。但是,查询WHERE子句包含此条件...

AND NewBorn.ID=sym

不幸的是,sym是一个VBA变量,而db引擎对此一无所知。似乎它会将sym解释为参数并抱怨您没有为该参数提供值。

我认为您现在应该忽略VBA代码并专注于修改查询。只有在您有工作查询后才能返回VBA并尝试使用它。

使用Access查询设计器创建并测试您的查询。选择源表并设置连接。接下来选择输出字段。最后创建一个查询参数并添加一个查询条件,将NewBorn.ID与该参数进行比较。切换到SQL视图时,WHERE子句的相关部分应与此类似......

NewBorn.ID = [YourParameterName]

当您测试该查询时,Access将显示一个输入框,要求您提供 YourParameterName 的参数值。

稍后当您使用VBA中的查询时,您可以在代码中提供参数值。但是,现在,请专注于查询。

现在您有一个工作参数查询,调整它以使用 txtSearch 文本框值代替参数,然后将该查询用于列表框Row Source

strSQL = "SELECT Mutation.DiseaseAssociation, Newborn.NewBornID" & vbCrLf & _
"FROM Newborn INNER JOIN ((Mutation INNER JOIN (DNA INNER JOIN DNAMutation ON DNA.DNA_ID = DNAMutation.DNA_ID) ON Mutation.Mutation = DNAMutation.MutationID) INNER JOIN NewbornDNA ON DNA.DNA_ID = NewbornDNA.DNA_ID) ON Newborn.NewBornID = NewbornDNA.NewBornID" & vbCrLf & _
"WHERE (((Newborn.NewBornID)=Forms!YourFormName!txtSearch));"
Me!lstDiag.RowSource = strSQL

您的表单包含一个名为 Command0 的命令按钮。您的表单的代码模块包含此过程......

Private Sub Comand0_Click()

但该过程名称与命令按钮名称不匹配。这没有错误(Command0_Click,2米!)并填充列表框...

Private Sub Command0_Click()
    'Dim db As Database, rs As Recordset, strSQL As String
    Dim strSQL As String

    'Set db = CurrentDb
    strSQL = "SELECT Mutation.DiseaseAssociation, Newborn.NewBornID FROM Newborn INNER JOIN ((Mutation INNER JOIN (DNA INNER JOIN DNAMutation ON DNA.DNA_ID = DNAMutation.DNA_ID) ON Mutation.MutationID = DNAMutation.MutationID) INNER JOIN NewbornDNA ON DNA.DNA_ID = NewbornDNA.DNA_ID) ON Newborn.NewBornID = NewbornDNA.NewBornID WHERE Newborn.NewBornID=Forms!Calculator!txtSearch;"

    'Set rs = db.OpenRecordset(strSQL)
    Me!lstDiag.RowSource = strSQL

    MsgBox "Hello World!"
End Sub