在Access VBA中的SQL中创建下拉菜单?

在Access VBA中的SQL中创建下拉菜单?,sql,vba,ms-access,Sql,Vba,Ms Access,目前在Access VBA中,我有一个表VolatilityOutput-in-Access的筛选器,如下所示: 暗淡的曲线像长的一样 曲线ID=15 作为字符串的Dim strSQL strSQL=从VolatilityOutput中选择*,其中CurveID=&CurveID&和MaxOfMarkAsofDate=&MaxOfMarkAsofDate&按MaxOfMarkAsofDate排序,到期日 CurveID是表volatityOutput中的一个字段。现在CurveID=15是硬编码

目前在Access VBA中,我有一个表VolatilityOutput-in-Access的筛选器,如下所示:

暗淡的曲线像长的一样 曲线ID=15 作为字符串的Dim strSQL strSQL=从VolatilityOutput中选择*,其中CurveID=&CurveID&和MaxOfMarkAsofDate=&MaxOfMarkAsofDate&按MaxOfMarkAsofDate排序,到期日 CurveID是表volatityOutput中的一个字段。现在CurveID=15是硬编码的。每个曲线ID对应于表中另一个字段CurveShortName中的标题

因此,CurveID=15对应于CurveShortName=CAD Sovereign,CurveID=124对应于CurveShortName=CAD Swap New,曲线ID=134对应于CurveShortName=CAD3M USD3M BASIS

我不想硬编码CurveID=15,而是想更改它,以便用户可以从下拉菜单中选择CurveShortName,该下拉菜单将关联的CurveID用作过滤器。这在访问中是可能的吗

编辑更新:完整代码发布在下面:

公共子计算机 双精度卷 将遥感器作为记录集 Dim rs2作为记录集 我爱的时间长,我爱的时间长 作为字符串的Dim strSQL 暗淡的曲线像长的一样 暗淡的MarkRunID如长 Dim MAXOFMAKASOFDATE作为日期 将userdate设置为字符串 DoCmd.RunSQL从HolderTable中删除* '从holder表中清除旧数组。 曲线ID=15 作为整数的Dim I Dim x作为日期 userdate=InputBox请输入日期mm/dd/yyyy x=用户日期 暗淡的布基和长的一样 BucketTermAmt=InputBox请输入期限金额 对于I=0到150 maxOfMAKASOFDATE=x-I strSQL=从VolatilityOutput中选择*,其中CurveID=&CurveID&和MaxOfMarkAsofDate=&MaxOfMarkAsofDate&按MaxOfMarkAsofDate排序,到期日 设置rs=CurrentDb.OpenRecordsetstrSQL,类型:=dbOpenDynaset,选项:=dbSeeChanges 设置rs2=CurrentDb.OpenRecordsetHolderTable 如果rs.RecordCount为0,则 先走一步 莫夫拉斯特 作为字符串的Dim BUCKETTERM单元 Dim BucketDate作为日期 Dim MarkAsOfDate作为日期 双倍 将b变暗为字符串 b=Buckettermat BucketTermUnit=m BucketDate=DateAddBucketTermUnit,b,MaxOfMarkAsofDate InterpRate=曲线InterpolateRecordSetrs,BucketDate rs2.AddNew rs2BucketDate=BucketDate rs2InterpRate=InterpRate rs2.更新 如果结束 接下来我 体积=EWMA0.94 调试打印卷 端接头
你需要做几件事

1在表单中添加一个新的组合框。称之为cboCurve。设置列数=2,列宽为0;2不带引号且绑定列=1

2添加一个名为tblCurve的新表。在此表中,您将有2个字段;CurveID和CurveShortName

3在Form_Load上,添加如下内容:

strSQL = "SELECT * FROM tblCurve"
me.cboCurve.RecordSource = strSQL
或者,您可以在控件本身中将tblCurve设置为RecordSource

4将您的值添加到表中

5将CalculateVol sub中的strSQL更改为:

strSQL = "SELECT * FROM VolatilityOutput WHERE CurveID=" & Me.cboCurve.Value & " AND MaxOfMarkAsofDate=#" & MaxOfMarkAsofDate & "# ORDER BY MaxOfMarkasOfDate, MaturityDate"

现在,当您加载页面时,您的下拉菜单应该填充tblCurve表中的所有记录。您将看到的只是名称而不是ID,因为ID字段是第一个字段,但您已将第一个字段的宽度设置为0,使其不可见。但是,由于您已将组合绑定到第1列,因此它将设置为值。然后,您可以使用Me.cboCurve.value引用组合中的值。

为什么将其标记为Excel?您如何使用strSQL?此VBA是否以某种方式在表单上工作?我将发布完整的代码以澄清您无法仅通过查询来完成所需的操作。但是如果将下拉列表放在表单上,查询可以使用下拉列表的选定值。满意吗?嘿,谢谢你的回答。我按照您提到的设置它,并直接将tblCurve设置为记录源。但是,当我在更改strSQL后运行子例程时,它告诉我这是对me关键字的无效使用。如果我把它改成表格!值,我得到一个应用程序定义的错误。我做错了什么?试着干掉我。。我总是不得不添加它,但我认为新版本的Access不需要它。我应该等同于当前表单,所以我不确定它为什么认为这是无效的用法。我得到了一个变量not defined error for cboCurve。我在一个普通模块中做这件事,这就是问题所在吗?我是否需要显式定义cboCurve或以其他方式引用它?这解释了为什么它不喜欢我..:o您必须在表单后面的模块中执行此操作。表单的表单加载事件。哦,好的。那么,我是否也必须将CalculateEvol子例程移动到表单后面的模块?我还向模块中添加了一个私有子表单加载,如步骤3所述。