首页 > 解决方案 > 从 excel 用户表单的下拉组合框中创建一个基于所选月份的 sql 查询

问题描述

我在 excel 中有一个用于出勤报告的用户表单。在表单上,​​用户选择他们想要查看的员工,然后他们可以选中一个显示年初至今的框,或者从组合框下拉列表中选择单个月份。这就是查询我们有数据的sql server。年初至今很容易,因为我知道如何将变量用于当前日期和一年中的第一天。我遇到的问题是如何将用户的月份选择转换为可用的查询。例如:如果用户选择一月作为下拉菜单,查询将是

select * from [dbo.mytablename]
where [agent name] = '<value from a textbox that I know how to pass in>'
and [cal date] > '1/1/2018' and [cal date] < '1/31/2018'

现在我唯一的想法是在工作簿中的持有电子表格上拥有每个月的第一天和最后一天的单元格,然后使用单元格值。但如果可能的话,我想避免这种情况。如果您有任何想法,那就太好了!

标签: sqlsql-serverexcelvba

解决方案


假设您的月份是 1 到 12 之间的数值,您可以使用类似

Dim fromDate As Date, toDate As Date

fromDate = DateSerial(2018, month, 1)
toDate = DateSerial(2018, month + 1, 1)
Debug.Print fromDate, toDate

这甚至适用于 12 月,DateSerial接受13一个月。请注意,您必须要求< 下个月的第一天才能捕获该月最后一天的数据。

旁注:我假设您使用 aADODB.Command来查询数据库。我强烈建议您使用ADODB.parameter将日期(和代理名称)传递给数据库 - 您不必处理格式或转换日期,以便数据库正确理解它们。例如,请参阅https://stackoverflow.com/posts/10353908/edit以了解其工作原理。

更新 我假设你用一个范围内的值填充你的组合框,并且该值链接到一个单元格。例如,使用match将月份作为数字获取的函数(我永远不会相信 Excel 或数据库会正确翻译月份的名称,区域设置之类的东西太多可能会导致它中断)。假设:
月份名称范围:A1..A12
链接单元格:B1
将公式=MATCH(B1,A1:A12)放入单元格 B2。瞧,你有月份的数字。


推荐阅读