访问VBA项目..创建一个循环来通过记录集

时间:2015-04-17 16:22:57

标签: access-vba

我正在进行一个Access VBA项目,它涉及到循环。我有三个字段Fund#,生效日期和总金额。我正在尝试创建一个VBA代码,该代码将通过帐户ID进行循环,并根据过去5天(生效日期)中的基金活动总结总金额。基本上,我在表格中的输入看起来像这样。

Fund:   Effective Date, Total Amount 
586     01/02/2015       -454
586     01/03/2015      -454
586     01/04/2015     -454
586     01/05/2015     -454
586     01/06/2015    -854
586     01/07/2015     -954
586     01/08/2015     -254
586     01/09/2015    -154
586     01/10/2015    -654
586     01/13/2015    -354
486 01/02/2015    -954
486 01/03/2015    -954
486 01/05/2015    -954
486 01/07/2015    -954
486 01/09/2015    -954
486 01/010/2015    -954

VBA将确定基金编号。将使用生效日期查看过去五天的日期并总结资金总流出量。然后循环将返回到第二个日期,并为该基金添加接下来的五天总流出量,一旦完成循环前5天它将移动到下一个日期等。一旦它完成通过该基金#循环,它将移动到下一个基金#并做与上述基金相同的事情

目标是将最终输出插入到另一个表中,看起来像这样

Id Date , ID Amount1, ID Amount1, ID Amount1, ID Amount1, Largest Redemption week date 
Fund #      Id Date ,   01/02- 1/07 01/03- 1/08 01/04- 1/09 01/05- 1/10, 
Etc Largest Redemption
Date    Largest Redemtption Week Amount 
44      -20788  -5788   -10500  5885    12/20/2014  -45855
88      -10788  -2788   -8500   3885    06/30/2014  -50000
60      -13788  -2788   -2500   1885    06/30/2014  -25000

        So the final output will be inserted into another table and will look something like this                       

这就是我到目前为止所做的..我需要创建一个Access vba代码,所以我会给出上面的输出。谢谢你的帮助

Option Compare Database

功能OpenRecordset()

Dim dbsArchive As Database Dim rs As DAO.Recordset Dim rs2作为DAO.Recordset Dim i As Double Dim x As Double Dim StrSQL As String Dim strFund As String 将strCriteria作为字符串 Dim AddFundCriteria为Double Dim FirstMark As Variant 昏暗的IDFund为双倍 昏暗的IDDate为双

设置dbsArchive = CurrentDb    设置rs = dbsArchive.OpenRecordset(“2014”)

对于i = 0到rs.RecordCount - 1    strFund = rs.Fields(“Link_Fund”)

   StrSQL = "SELECT [USysD07366-2014].LINK_FUND, [USysD07366-2014].SUPER_SHEET_DATE," & _
             "Sum([USysD07366-2014]![REDEMPT]+[USysD07366-2014]![EXCHANGE OUT]) AS RedemptionTotal " & _
            "FROM [USysD07366-2014] " & _
            "GROUP BY [USysD07366-2014].LINK_FUND, [USysD07366-2014].SUPER_SHEET_DATE " & _
            "HAVING ((([USysD07366-2014].LINK_FUND) = " & strFund & ")) " & _
            "ORDER BY [USysD07366-2014].SUPER_SHEET_DATE; "

            Set rs2 = dbsArchive.OpenRecordset(StrSQL, dbOpenSnapshot)

对于x = 0到rs2.RecordCount - 1

'strCriteria =“Link Fund =”& rstCategories![Link Fund]

            Debug.Print rs2.Fields("Link_Fund")
            Debug.Print rs2.Fields("SUPER_SHEET_DATE")
            Debug.Print rs2.Fields("RedemptionTotal")

            rs2.MoveNext

               Next x

               rs.MoveNext

               Next i

            rs.Close
            rs2.Close
            Set rs = Nothing
            Set rs2 = Nothing
            dbsArchive.Close

的ErrorHandler:                MsgBox“错误#:”& Err.Number& vbCrLf& vbCrLf& Err.Description

        End Function    

1 个答案:

答案 0 :(得分:1)

我没有足够的声誉来添加评论,所以我必须在这里问:

您可能需要先清理一些事情。当你说“过去五天”时,你的意思是在最近5天内,还是在最后五个记录中?如果跳过日期,您希望如何处理它?<​​/ p>

486 01/02/2015 -954
486 01/03/2015 -954
486 01/05/2015 -954
486 01/07/2015 -954
486 01/09/2015 -954

如果我们正在分析2015年9月1日,它应该是所有这些记录的总和,还是只有日期&gt; 2015年1月4日?对于数据少于5天的日期(即01/02/2015)怎么办?它是否仍然总结了可用的数据,或者没有对该日期进行任何分析?

我现在正在工作,因为我使用了VBA已经有一段时间了,所以我无法写出实际的代码语法,但我的逻辑将是这样的:

var j = 2   # used for tracking row in solution sheet
var k = 0   # used for tracking column in solution sheet
var prevFund = Cells(2,1).Value
For each Row:
  var fundID = Cells(ActiveCell.Row, 1).Value
  k = k + 1  
  if (fundID <> prevFund)
    j = j + 1
    k = 0
  end if 
  var currentDate = Cells(ActiveCell.Row, 2).Value  
  var minDate = {currentDate - 5}  # not sure of the correct function for this  
  var sum = Cells(ActiveCell.Row, 3).Value
  for (int i =0; i < 5; i++)   
    var checkDate = Cells(ActiveCell.Row + i, 2).Value  
    if (checkDate > minDate)  
      sum = sum + Cells(ActiveCell.Row + i, 3).Value
    else
      break
    end if
  end for
  Sheets("Sheet2").Cells(j,1 + k).Value = sum
end for

这将只是总结几周,正如我所说,语法可能并非都是正确的。您仍然需要处理标题并获得最长周数。所有数据的周数是否一致,或者它们可能因基金而异?如果你想不通,我会稍后尝试更新,但如果你自己做,请发帖。