在 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 查询仅创建非重复记录

如何将表单绑定到 Microsoft Access 中的 SQL 语句

如何在 VBA 中正确输入 sql where 子句?

MS Access VBA SQL查询调试选择案例

MS Access:使用 VBA 进行 SQL 插入的日期格式