在 Access VBA 中的 strSQL 中循环访问日期
Posted
技术标签:
【中文标题】在 Access VBA 中的 strSQL 中循环访问日期【英文标题】:Looping Through Dates in strSQL in Access VBA 【发布时间】:2016-01-04 15:49:04 【问题描述】:我在 Access 中有这段代码:
Sub SampleReadCurve()
Dim rs As Recordset
Dim iRow As Long, iField As Long
Dim strSQL As String
Dim CurveID As Long
Dim MarkRunID As Long
Dim MaxOfMarkAsofDate As Date
CurveID = 15
MaxOfMarkAsofDate = #7/22/2015#
strSQL = "SELECT * FROM VolatilityOutput WHERE CurveID=" & CurveID & " AND MaxOfMarkAsofDate=#" & MaxOfMarkAsofDate & "# ORDER BY MaxOfMarkasOfDate, MaturityDate"
Debug.Print strSQL
Set rs = CurrentDb.OpenRecordset(strSQL, Type:=dbOpenDynaset, Options:=dbSeeChanges)
If rs.RecordCount <> 0 Then
rs.MoveFirst
Debug.Print vbCrLf
Debug.Print "First", rs.Fields("ZeroCurveID"), rs.Fields("MaturityDate"), rs.Fields("ZeroRate"), rs.Fields("DiscountFactor")
rs.MoveLast
Debug.Print "Last", rs.Fields("ZeroCurveID"), rs.Fields("MaturityDate"), rs.Fields("ZeroRate"), rs.Fields("DiscountFactor")
Debug.Print "There are " & rs.RecordCount & " records and " & rs.Fields.Count & " fields."
Dim BucketTermAmt As Long
Dim BucketTermUnit As String
Dim BucketDate As Date
Dim MarkAsOfDate As Date
Dim InterpRate As Double
Dim I As Integer
BucketTermAmt = 3
BucketTermUnit = "m"
BucketDate = DateAdd(BucketTermUnit, BucketTermAmt, MaxOfMarkAsofDate)
InterpRate = CurveInterpolateRecordset(rs, BucketDate)
Debug.Print BucketDate, InterpRate
End If
End Sub
表 VolatilityOutput 有一个带有关联值的日期列表。此代码使用表中找到的最接近的值对给定的 MaxofMarkAsofDate 插入一个值。
现在,我已从表中选择 MaxofMarkAsofDate 作为 strSQL 语句的一部分。代码返回 #7/22/2015# 的正确值。
但是,我需要获取 #7/22/2015# 之前 76 个日期的值。我可以通过为每个日期手动输入 #7/21/2015#、#7/20/2015# 等来完成此操作。如果可能的话,我想以更快的方式做到这一点。我想使用循环,但是我不知道如何在 Access 中将循环与 strSQL 语句结合起来。
【问题讨论】:
为什么不能使用 AND MaxOfMarkAsofDate= 我不确定 - 我尝试用它替换我的代码,但它给了我一个语法错误。这是什么意思? 不是只取它等于的值,而是取所有等于或小于它的值。不确定这是否能让你到达你需要的地方。 【参考方案1】:CurveID = 15
Dim i As Integer
For i = 0 to 76
MaxOfMarkAsofDate = #7/22/2015# - i
'Your inner code here '
Next i
End Sub
【讨论】:
我在这里得到一个 Next without For 错误。我可以从日期中减去一个整数吗? 是的,VBA 执行隐式转换。我将添加现有代码的前后行作为上下文。 啊,我明白了,谢谢。效果很好。 如果您不介意,我可以问您一个后续问题吗?通过运行这个子程序,我得到了一系列数字作为输出,即 76 InterpRates。之后如何将此输出存储为数组?我打算编写一个以 76 InterpRates 作为输入的函数。 @varunchandra:最好将其作为一个单独的问题提出。随意链接到来自这些 cmets 的新问题。以上是关于在 Access VBA 中的 strSQL 中循环访问日期的主要内容,如果未能解决你的问题,请参考以下文章
在access中用vba如何把SQL语句查询到的一个值赋给变量?
在 Access-VBA 中使用 SQL 查询仅创建非重复记录