Excel 用VBA实现基于逻辑的数组元素动态循环

Excel 用VBA实现基于逻辑的数组元素动态循环,excel,vba,excel-2010,excel-2007,Excel,Vba,Excel 2010,Excel 2007,我正在编写一段代码,使用VBA中的数组概念选择当前值和下一个值。 但是,当运行下面的代码时,我面临运行时错误13 Sub PlaceTheQuarter() Dim arr, Q1, Q2, Q3, Q4 arr = Array(1, "Q1", 2, "Q2", 3, "Q3", 4, "Q4") Q1 = Array("Jan", "Feb", "Mar&quo

我正在编写一段代码,使用VBA中的数组概念选择当前值和下一个值。 但是,当运行下面的代码时,我面临运行时错误13

Sub PlaceTheQuarter()
Dim arr, Q1, Q2, Q3, Q4

arr = Array(1, "Q1", 2, "Q2", 3, "Q3", 4, "Q4")
Q1 = Array("Jan", "Feb", "Mar")
Q2 = Array("Apr", "May", "Jun")
Q3 = Array("Jul", "Aug", "Sep")
Q4 = Array("Oct", "Nov", "Dec")

'MsgBox (Application.Match(Application.RoundUp(Month(Date) / 3, 0)))
MsgBox (arr(Application.Match(Application.RoundUp(Month(Date) / 3, 0), arr, 0)))

'ENABLE THIS PART TO TEST Q4 ITERATION
Dim idate As Date
idate = "31-DEC-2020"
a = arr(Application.Match(Application.RoundUp(Month(idate) / 3, 0), arr, 0))

'a = arr(Application.Match(Application.RoundUp(Month(Date) / 3, 0), arr, 0))
i = Mid(a, 2, 1)

Dim next_q As Integer

If i = 4 Then
 next_q = 1
Else
 next_q = i + 1
End If

MsgBox ("Next Quarter is: Q" & next_q)

MsgBox (MonthName(Month(idate), True))
counter = 0

Dim n_quarter
n_quarter = "Q" & next_q

    For Each ab In Q4
        If MonthName(Month(idate), True) = ab Then
            MsgBox ab
            Dim pos As Integer
            pos = Application.Match(ab, Q4, False)
            MsgBox pos
        Else
        End If
    Next


End Sub
基本上在Foreach循环中,如果我在第4季度手动使用季度名称,它会很好地循环。但是我想根据
Q&next\u Q
之类的值动态传递它。我已经分配了一个字符串值,并在这里传递了该变量,在我的情况下,它也不起作用

任何关于这方面的建议都非常感谢


我的目的是在一年内随着日期的推移循环相应的季度数组。

请测试下一个代码。应按照(我理解)您在最后一条评论中的要求:

Sub PlaceTheQuarter()
 Dim arr, arrQ, Q1, Q2, Q3, Q4, ab, a As String, i As Long, k As Long
 Dim next_q As Long, next_month As Long, arrFin, j As Long, actQ As Long
 
 arr = Array(1, "Q1", 2, "Q2", 3, "Q3", 4, "Q4")
 Q1 = Array("Jan", "Feb", "Mar")
 Q2 = Array("Apr", "May", "Jun")
 Q3 = Array("Jul", "Aug", "Sep")
 Q4 = Array("Oct", "Nov", "Dec")
 arrQ = Array(Q1, Q2, Q3, Q4)

 Dim idate As Date: idate = Date '"02.10.2021"

 a = arr(Application.match(Application.RoundUp(Month(idate) / 3, 0), arr, 0))

 Select Case a
    Case "Q1": next_month = Month(idate): actQ = 0
    Case "Q2": next_month = Month(idate) - 3: actQ = 1
    Case "Q3": next_month = Month(idate) - 6: actQ = 2
    Case "Q4": next_month = Month(idate) - 9: actQ = 3
 End Select
 
 ReDim arrFin((3 - next_month) + 2)
 i = Mid(a, 2, 1)

 If i = 4 Then
    next_q = 1
 Else
    next_q = i + 1
 End If
 'fill the final array containing the remained month plus the next quarter months:
 For j = next_month To 2
    arrFin(k) = arrQ(actQ)(j): k = k + 1
 Next j
 For j = 0 To 2
    arrFin(k) = arrQ(next_q - 1)(j): k = k + 1
 Next j
 '______________________________________________________
 'Iterate between the necessary array elements:
 For Each ab In arrFin
    Debug.Print ab
 Next
End Sub

你能描述一下代码应该做什么吗?基本上,如果你考虑最后一个for循环,我试图从数组中找到月份的出现或索引。但是代码是硬编码的,因为测试很好。我想让元素的循环特别是PICKE.EX:JAQ1,Jun q2等。我更想的是,如果您正在编写一个函数,那么将返回一个日期的季度或一个日期数组的季度数组,或者什么?或者,如果您正在编写sub,它会做什么?感谢您的回复。sub基本上是在尝试查找当前和下一个季度的编号…创建
ForEach
循环的目的是在相应的季度数组中查找当前月份的索引编号,稍后我将添加一些额外的代码以满足我的需求自动化的其他要求…随着日期在一年内的进展,我目前想在相应的季度动态调用ForEach循环..请通知hi@FaneDuru,我可以了解这种锯齿阵列使用背后的逻辑..谢谢..但是,我仍然面临着寻找索引值的问题,我希望在我的案例中建立进一步的逻辑。任何adivse?@USER207517:“我仍然面临着寻找索引值的问题”都不需要告诉我太多,以便能够提供建议。。。请解释什么不能按您的需要工作,您只是说“但是我想根据
Q&next\u Q
之类的值动态传递它。”这就是我试图解决的…我明白了。所以如果我今天运行宏,每个循环的第一季度应该运行,告诉我1月的指数为1。如果我在12月的某一天运行它,它应该循环第四季度的foreach循环,指数值应该为3。我的主要目标是选择当前季度的当前月份和剩余月份,以及下一季度的月份,也就是容易一旦动态挑选季度数发生,我正在寻找帮助在这方面。抱歉,如果我之前感到困惑。@User207517:请测试更新的代码并发送一些反馈。@User207517:很高兴我能提供帮助!