Excel vba循环数月和数年

我是一个Excel VBA新手,我被困在一个问题。 你能指点我正确的方向吗?

工作表中的date结构是YYYYMMDD。 为了这个练习的目的,开始date是20060321,结束date是20170512。我有5个子程序(如果你计算出口子程序,则是6个子程序)。 SubA,SubB,SubC,SubD和SubE。 程序从SubA开始,然后到SubE。 当它到达SubE时,我希望它增加月份计数器。 当它达到12个月,我想它重置为01(回到1月),然后增加年计数器。 然后我想打电话给SubB(这是正确的 – SubB)。 然后它需要循环,直到达到结束date。

由于数据varYYYY的性质,varMM和varDD是string。 所以我试着把它们转换成Long,然后递增Long,然后把它转换回string。

~~~~~~~

我终于得到这个工作。 非常感谢Variatus分享他如何从另一个子程序调用子程序的见解。 这是让它工作的关键。 这不是没有工作的循环结构。 这是我不恰当地使用调用导致不需要的循环的子程序。

我在这里粘贴了代码的简化和更新版本。

Option Explicit Public varDD As String, varMM As String, varYYYY As String, varYYYYMM As String Public varDayEnd As String, varMonthEnd As String, varYearEnd As String, varPrint As String Public varA As String, varB As String, varC As String, varD As String, varE As String Public varMMLong As Long, varYYYYLong As Long, i As Integer Public varYearMonthEnd As String Public Sub SubMain() varDD = "21" varMM = "03" varYYYY = "2006" varYearEnd = "2008" varMonthEnd = "05" varDayEnd = "12" varA = "A" varB = "B" varC = "C" varPrint = "" varYearMonthEnd = varYearEnd & varMonthEnd Debug.Print varYearMonthEnd Do varPrint = varYYYY & varMM & varDD varMMLong = CLng(varMM) varMMLong = varMMLong + 1 varMM = Format(varMMLong, "00") varYYYYMM = varYYYY & varMM SubA SubB SubC If varMM = 13 Then varDD = "01" ' reset varDD to 01 varMM = "01" ' reset varMM to Jan varYYYYLong = CLng(varYYYY) varYYYYLong = varYYYYLong + 1 ' increment by one year varYYYY = Format(varYYYYLong, "0000") End If Loop Until varYYYYMM = varYearMonthEnd End Sub Public Sub SubA() 'Insert code block here Debug.Print varA End Sub Public Sub SubB() 'Insert code block here Debug.Print varB End Sub Public Sub SubC() 'Insert code block here Debug.Print varC End Sub 

这是一个更简单的方法来将string值转换为date,然后将date递增1天,最后将其转换回string。

 Dim CurDt As Date, nextDt As Date varDD = "21": varMM = "03": varYYYY = "2006" CurDt = DateSerial(Val(varYYYY), Val(varMM), Val(varDD)) nextDt = DateAdd("d", 1, CurDt) Debug.Print Format(nextDt, "YYYYMMDD") 

也许

 Sub test() Dim myY As Integer, myM As Integer, myD As Integer Dim eY As Integer, eM As Integer, eD As Integer Dim newDate As Date, sDate As Date, eDate As Date Dim prn As String, i As Integer myY = 2016: myM = 3: myD = 21 eY = 2017: eM = 5: eD = 12 vstr = Array("A", "B", "C", "D", "E") sDate = DateSerial(myY, myM, myD) eDate = DateSerial(eY, eM, 1) Do For i = 0 To UBound(vstr) prn = prn & vstr(i) Debug.Print prn Next i sDate = DateAdd("m", 1, sDate) Loop While sDate < eDate End Sub