基于表单上的组合框自动执行查询选择

时间:2013-08-21 20:41:23

标签: vba ms-access access-vba

好的,朋友们,我将在一周半的时间里离开我的工作,而我正在努力让我的老板做得更容易。他没有访问知识,所以我正在尝试创建一个可以自动生成我生成的报告的表单。我没有为所有不同的报告创建不同的表单,而是尝试从参数表中自动化它。这就是我想要的: 我有一个表,我创建了一个由5个字段组成的表。我想使用这些字段来填充标准表单模板中的参数字段。我表中的五个字段如下:

  1. 正在运行的查询类型(结果吐出)
  2. 生成此报告的查询,以逗号分隔,没有空格。 "QRYNAMEA,QRYNAMEB"
  3. 这些查询生成的表格,将由transferspreadsheet
  4. 使用
  5. 目标Excel文件,该文件已设置了一个数据透视表以供应数据。
  6. 此excel文件的输入表。目前,所有这些表都称为“输入”。 (这不重要)
  7. 我的问题在于我在制作组合框后不知道该去哪里。我知道足够的visual basic来自动化我的查询,但还不足以用3,4和5中的信息填充表单(到目前为止,我已经为不同的查询手动更改了这些信息)。我不知道如何从“选择框”中的选项中查找表中的记录,然后从我的自动化中选择单个字段。

    我非常有信心解析#2并自动执行查询,并将值放入我正在查看的字段中,但我不知道如何从表中实际提取这些值,在我做这些事之前。我似乎也无法用谷歌来形容这个,以帮助我。

    以前有人做过这样的事吗?我假设我只是缺乏一个VBA库的知识,但我没有运气找到哪个。

    编辑: 我此时的倾向是为这个表创建一个查询,它将返回一个字段,具体取决于我给出的输入。我可以想象在SQL中这样做,但我仍然不知道如何填充表单,一旦得到它就从表中提取字段对象。

    我必须前往这一天,但我会在星期五回来继续努力,一旦我找到它,我会发布我的解决方案。这似乎是一个独特的难题,给它答案会很好。

    最终编辑:抛光代码(错误处理方式不多):

    1. 第一个从表中提取字段并填充表单的方法是通过在组合框中选择一个新条目来激活的,如下所示:

      Private Sub QuerySelect_Change()
      Dim db As Database
      Dim rec As Recordset
      
      Set db = CurrentDb
      Set rec = db.OpenRecordset("SELECT [Queries to Run], [Source Table], [Destination Spreadsheet], [Destination Sheet Name] FROM TBL_QRY_SETTINGS WHERE TBL_QRY_SETTINGS.[Query Type] Like '" & [Forms]![QuerySelector]![QuerySelect] & "';")
      [Forms]![QuerySelector]![QueriesToRun].Value = rec("Queries to Run")
      [Forms]![QuerySelector]![SourceTable].Value = rec("Source Table")
      [Forms]![QuerySelector]![FileDest].Value = rec("Destination Spreadsheet")
      [Forms]![QuerySelector]![SheetName].Value = rec("Destination Sheet Name")
      Set rec = Nothing
      Set db = Nothing
      
      End Sub
      
    2. 第二个代码拉取该数据以运行查询。我喜欢这样的结果。单击组合框附近的按钮时会运行。

      Private Sub DynamicQuery_Click()
      Dim qryArray As Variant
      Dim i As Integer
      
      qryArray = Split([Forms]![QuerySelector]![QueriesToRun], ",")
      DoCmd.SetWarnings False
      For i = LBound(qryArray) To UBound(qryArray)
          Debug.Print qryArray(i)
          DoCmd.OpenQuery (qryArray(i))
      Next
      DoCmd.SetWarnings True
      DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, [Forms]![QuerySelector]![SourceTable], _
          [Forms]![QuerySelector]![FileDest], _
              True, [Forms]![QuerySelector]![SheetName]
      End Sub
      
    3. 请注意,第(1)部分的最终代码与所选答案几乎相同,只是我抓取了多个字段。这是有效的,因为我知道我有唯一的“查询类型”,而我的记录集只包含一条记录。

      无论如何,我希望有些人偶然发现这一点并发现它很有用。 Send me a message if you do。据我所知,通过简短的谷歌搜索,这种自动化工作还没有在访问中完成。它应该使access-illiterate更容易运行他们自己的查询,并且设计师可以简单地添加,如果他们想要在几次点击后提供所有查询。

      有人可以想象,通过遍历我所参考的表格,按顺序自动化各种报告。

1 个答案:

答案 0 :(得分:1)

我可能会误解你正在做的事情,但我认为这就像使用表单向导创建新表单一样简单。它将允许您选择包含数据的表,并允许您选择要添加的字段。

您可以稍后将任何文本框更改为组合框,这样您就可以限制可填写的选项。

我理解正确吗?

编辑:这将使用表格中的字段内容填充变量(MyRandomField)

Dim db as Database
Dim rec as Recordset

set db = CurrentDB
set rec = db.OpenRecordSet("Select SomeField from SomeTable Where Something = 'SomethingElse'")

MyRandomField = rec("SomeFieldName")

set rec = Nothing
set db = Nothing