MS Access VBA代码可基于表单上的组合框选择来运行特定查询

时间:2018-09-22 21:22:52

标签: sql ms-access access-vba

我目前正在尝试开发VBA代码(案例陈述),该代码将基于用户从表单上的组合框中选择的查询名称来运行特定查询。当前,正在运行的查询与用户从组合框中选择的内容不匹配。

例如:

  • 当用户选择PlantNames(QryID 5)而不是运行qryPlantsLatin查询(正确)时,它正在运行qryNewPlants2查询(错误)。
  • 当用户选择PlantInventory(QryID 3)时,而不是运行qryNewPlants2查询(正确),而是运行qryPlantsLatin查询(错误)。
  • 当用户选择PlantInventoryAvailable(QryID 4)而不是运行qryPlantInventoryTotal查询(正确)时,它正在运行qryPlantsLatin查询(错误)。

代码:VBA –使用的事件处理程序–更新后

Private Sub cboPlantQrys_AfterUpdate()
Select Case PlantQueries
Case Me.cboPlantQrys = "5"
     DoCmd.Close
     DoCmd.OpenQuery "qryPlantsLatin" 
Case Me.cboPlantQrys = "3"   
     DoCmd.Close
     DoCmd.OpenQuery "qryNewPlants2"    
Case Me.cboPlantQrys = "4"
     DoCmd.Close
     DoCmd.OpenQuery "qryPlantInventoryTotal"
Case Else
     MsgBox "Improper Selection"
End Select
End Sub

组合框– cboPlantQrys –行源SQL

SELECT tblQueries.QryID, tblQueries.QryData, tblQueries.QryName, tblQueries.QryGroup
FROM tblQueries
WHERE (((tblQueries.QryGroup)="Plants"));

不幸的是,我不确定如何解决此问题,因为行源SQL和更新后事件VBA在我看来是合乎逻辑的(但显然我缺少了一些东西)。

2 个答案:

答案 0 :(得分:1)

实际上,由于要执行的查询的名称出现在ComboBox RowSource中,因此可以大大简化代码。

这是您的问题中所述的ComboBox RowSource:

SELECT tblQueries.QryID, tblQueries.QryData, tblQueries.QryName, tblQueries.QryGroup
FROM tblQueries
WHERE (((tblQueries.QryGroup)="Plants"));

这意味着ComboBox在运行时将有4列。在Access VBA代码中引用ComboBox或ListBox列时,列编号从0(零)开始。因此,QueryName列将是第2列(因为它是RowSource中的第3列)。

现在,只需检查是否已做出有效选择(即ComboBox不为null或为空),然后执行查询,即可从ComboBox记录源中动态提取名称。

Private Sub cboPlantQrys_AfterUpdate()

'Easiest way to check for Null or Empty String is the following
'When you concatenate a possible Null with a zero length string
'the result is a string, therefore if the Length of this is greater
'then zero, we know the user chose an item in the ComboBox list.
If Len(Me.cboPlantQrys & "") > 0 Then
    DoCmd.Close
    Docmd.OpenQuery Me.cboPlantQrys.Column(2)
End If

End Sub

使用此代码,您不再需要在tblQueries表中添加或删除查询(记录)时更新VBA代码。此代码将动态处理表中任意数量的行。

答案 1 :(得分:0)

尝试:

Private Sub cboPlantQrys_AfterUpdate()

    Select Case Me.cboPlantQrys.Value
    Case "5"
         DoCmd.Close
         DoCmd.OpenQuery "qryPlantsLatin" 
    Case "3"   
         DoCmd.Close
         DoCmd.OpenQuery "qryNewPlants2"    
    Case "4"
         DoCmd.Close
         DoCmd.OpenQuery "qryPlantInventoryTotal"
    Case Else
         MsgBox "Improper Selection"
    End Select
End Sub