【问题标题】:Get parameter input from user in Excel query在 Excel 查询中获取用户输入的参数
【发布时间】:2017-02-16 07:04:40
【问题描述】:

我的数据库在 .mdb 文件中,我想使用选择查询来查询数据,结果显示在 excel 电子表格中(使用获取外部数据菜单),但我需要查询记录并根据用户在特定单元格(4 个字段)中输入的输入(在 where 条件下)。有时我在 where 条件中使用一两个字段,或者有时我在 where 条件中使用 3 个字段来选择记录,但其余字段将留空。

当用户在所有四个字段中输入值而不在任何字段中留空时,我可以编写查询,但我需要查询任何一种搜索情况。

SELECT * FROM P:\Indexing\Data\Services_Indexed_data.mdb.GAS S_CARD WHERE (S_CARD.HOUSE_NO=?) AND (S_CARD.STREET_NAME=?) AND (S_CARD.SUFFIX=?) AND (S_CARD.FILE_NAME=?) AND (S_CARD.CITY= ?)

“?”当我选择输入单元格作为用户的参数时将被填充。我还需要在 where 条件下使用 LIKE 运算符进行查询。请让我知道如何为此编写查询。

【问题讨论】:

  • 这是一个有效的 SQL 字符串吗?你在使用数据库连接吗?您可以尝试查看this 并了解如何从 Excel 连接到 Access、在何处构建原始参数查询以及将这些参数的值从 Excel 传递到 Access。
  • 是的,它是一个有效的 SQL 查询。当我使用 AND/OR 运算符的两个/三个 where 条件时,它工作正常,但我需要查询任何一种情况,比如如果我将任何字段留空,那么查询应该根据有效参数(条件)返回值,而不是考虑了 where 条件的空白字段。不,我直接从文件夹中连接了 mdb 文件。

标签: sql ms-access parameters excel-2007


【解决方案1】:

参考:我使用 Excel 中的 MS Query 外部连接链接到我的 .accdb 文件(我知道这与您的不一样,但应该不会有太大区别)。然后我打开外部数据属性菜单并单击连接名称右侧的按钮以打开连接属性窗口。我导航到“定义”选项卡并选择底部的“参数”按钮,并使用“从以下单元格获取值”选项来引用输入单元格。

但是,我也不知道如何让 Excel 根据您的参数引用单元格是否为空来创建动态 WHERE 子句。

解决方案: 我建议在 Access 中构建参数查询并扩展 WHERE 子句以考虑参数中 Null 值的每个排列。这将是一个巨大的字符串,难以阅读和格式化,但应该可以在 Access 的 GUI 中进行管理。例如,仅使用 HOUSE_NO 和 STREET_NAME 的两个参数(数据类型可能不正确):

PARAMETERS [HOUSE_NO] Text (255), [STREET_NAME] Text (255);
SELECT * FROM S_CARD
WHERE (([HOUSE_NO] Is Not Null) AND (S.CARD.HOUSE_NO Like [HOUSE_NO])
  AND ([STREET_NAME] Is Not Null) AND (S.Card.STREET_NAME Like [STREET_NAME]))
OR (([HOUSE_NO] Is Null) AND ([STREET_NAME] Is Not Null) 
  AND (S.Card.STREET_NAME Like [STREET_NAME]))
OR (([HOUSE_NO] Is Not Null) AND (S.Card.HOUSE_NO Like [HOUSE_NO])
  AND ([STREET_NAME Is Null))
OR (([HOUSE_NO] Is Null) AND ([STREET_NAME] Is Null));

您需要为每个留空的参数排列创建一个OR,以及查询应如何返回这些结果。然后,您需要编写一个 VBA 过程来连接到 Access、打开参数查询、传递参数、执行查询并导出到您的 Excel 文件。这是更多的工作。如需帮助,您可以查看流程的一部分 here,但它处理的是操作查询而不是选择,并且不会复制到 excel。

因为 Excel 似乎没有为参数命名,所以似乎没有办法测试输入单元格是否为空白并相应地调整 WHERE 子句。当我尝试在定义选项卡上的命令文本中使用 Excel 中参数菜单中的名称 [PARAMETER 1][PARAMETER 2] 时,它最终创建了新参数(#3、#4)。

这是一个很好的问题,我建议等待其他用户参与,我们可能会走运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多