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