使用命名范围的简单解决方案
首先,选择单元格 B7 并在名称框中输入名称(例如 CellReference)。然后右键单击单元格并单击 Get Data from Table/Range。
这将打开 Power Query 编辑器,其中包含一个查询,该查询返回一个包含命名范围中的单元格的表。打开高级编辑器,删除查询的全部内容并输入Text.From(Excel.CurrentWorkbook(){[Name="CellReference"]}[Content][Column1]{0}),然后点击完成,它应该是这样的:
注意:使用Text.From() 以便CellReference 返回的值可以与使用& 的SQL 查询连接。此外,此功能优于不适用于文本值的Number.ToText()。
最后,在您的 SQL 查询中插入查询名称:WHERE ORDERDATE >= @Month13#(lf)#(tab)and STOCKCODE is not null#(lf)#(tab)AND SALESORD_HDR.ACCNO = "&CellReference
请注意,如果单元格包含文本值,那么您需要像这样调整语法:... SALESORD_HDR.ACCNO = '"&CellReference_Text&"'"
如何处理警告:新的查询权限和Formula.Firewall
如何授予运行所有新的本地数据库查询的权限
根据您的查询选项设置,每次CellReference 包含新值时,您可能会收到有关运行修改后的 SQL 查询的权限的警告消息:
如果您确定该单元格永远不会包含a string of characters that could modify the database,您可以通过转到文件-> 选项和设置-> 查询选项来disable this warning message。在 GLOBAL 下,转到 Security 并取消选中 Require user approval for new native database queries。
请注意,这是一个全局设置,会立即应用于所有 Excel 文件,包括当前打开的文件。
如何禁用 Formula.Firewall 警告消息
根据您的隐私级别设置,您可能会收到一条Formula.Firewall 警告消息,阻止执行查询:
如果您处于可以忽略隐私级别的情况,您可以通过转到文件 -> 选项和设置 -> 查询选项来禁用此消息。在当前工作簿下,转到隐私并选择忽略隐私级别并可能提高性能。
单击确定并刷新查询。
另一方面,如果您的工作簿需要保留 私人 或 组织 的隐私级别,据我所知,目前无法集成 CellReference到 SQL 查询(即使使用 SQL parameter set with the Value.NativeQuery function 或 Power Query Parameter )而不引发此警告消息。唯一的解决方案是在查询的另一个步骤中包含 CellReference,但随后过滤将在 Power Query 中发生,而不是在服务器级别:当步骤包含查询/函数/参数时,query folding 被中断链接到外部数据源,包括工作簿本身中的命名范围。
如果您的工作簿隐私级别设置为公开,您应该能够通过使用Value.NativeQuery function(如果您使用 SQL Server 或PostgreSQL 数据库)。如果您仍然收到警告消息,您可以尝试将combining the two queries accessing each data source(数据库和工作表)放入单个查询中。
注意:这些步骤在连接到本地 SQL Server 2019 (15.x) 数据库的 Windows 10 64 位上使用 Excel Microsoft 365(版本 2107)进行了测试。
这个答案是通过参考 Chris Webb(上面链接)和 Ken Puls (like this one) 的许多博客文章准备的。