【问题标题】:Automating query selection based on combo box on a form基于表单上的组合框自动选择查询
【发布时间】:2013-08-28 06:31:59
【问题描述】:

好的,朋友们,我将在一个半星期后离职,我正在努力让我的老板更轻松地完成我所做的事情。他没有访问知识,所以我正在尝试创建一个表单来自动化我一直在生成的报告。我没有为所有不同的报告创建不同的表单,而是尝试从参数表中自动化它。这就是我想要的: 我有一个我创建的表,它由 5 个字段组成。我想使用这些字段来填充标准表单模板中的参数字段。我表中的五个字段如下:

  1. 正在运行的查询类型(结果输出)
  2. 生成此报告的查询,以逗号分隔且不包含空格。 "QRYNAMEA,QRYNAMEB"
  3. 这些查询生成的表,将由transferspreadsheet 使用
  4. 目标 Excel 文件,已设置数据透视表来馈送数据。
  5. 此 Excel 文件的输入表。目前,所有这些工作表都称为“输入”。 (这不重要)

我的问题是在我制作组合框后不知道去哪里。我知道足够的视觉基础来自动化我的查询,但不足以用 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
    

请注意,第 (1) 部分的最终代码与所选答案几乎相同,只是我抓取的字段不止一个。这是因为我知道我有唯一的“查询类型”,并且我的记录集将只包含一条记录。

无论如何,我希望有些人偶然发现它并发现它很有用。 Send me a message if you do。据我从简短的谷歌搜索中得知,这种自动化工作尚未在访问中完成。如果设计人员希望在单击几下后就可以使用所有查询,那么它应该可以让不熟悉访问权限的人更轻松地运行他们自己的查询,并且让设计人员可以轻松添加。

可以想象,有人可以使用它来按顺序自动生成各种报告,方法是遍历我引用的表格。

【问题讨论】:

  • 没有自动的方法来拉这个。如果我按照您所描述的内容进行操作,则需要某种文档表,其中包含从组合框中选择查询后要显示的所有详细信息。
  • @HansUp 我无法在帖子中嵌入照片,也想不出很好的格式,所以截图如下:i.imgur.com/EuTi5bY.png 最上面一行是唯一的充实,但它们都遵循相同的格式。

标签: ms-access vba


【解决方案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

【讨论】:

  • 不完全是,除非其他组合框会根据我的第一个组合框“自动填充”。有没有办法获取查询结果并将其输入表单?因为现在我正在考虑在我的表中查询与我的组合框条目匹配的字段,然后将这些值读入表单其他地方的文本框中,类似于默认值。我的大问题是,如何将表或查询中的值分配给 vba 中的变量? 看起来应该是直截了当的,所有事情都考虑在内。
  • @GMoany - 看看我上面的编辑。这将使用表或查询中字段的内容填充变量。也就是说,假设 WHERE 子句从表/查询中只返回 1 条记录。否则,您可以使用“Do While rec.EOF = False”循环来遍历返回的每条记录。
  • 那是完美的。我一直在尝试将表格作为 excel 对象打开,但这是我真正需要的。谢谢你,先生。
  • 我已经上传了我的项目的最终代码,这远不止这个问题。我打算纠正你在第 5 行中使用 [brackets] 的问题,但看起来你已经解决了。
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多