【发布时间】:2016-07-02 08:44:44
【问题描述】:
我正在尝试根据几个条件循环遍历二维数组。我想我的语法一定是错误的,因为我的条件没有触发新的循环(通过日期数组)。这个新循环将测试用户输入日期 ("lastdate") = UACFArray(l, 0) 是否,如果没有,则查找该日期是否在 UACFArray(l, 0) & UACFArray 中存储的值之间(0, m),如果是,则使用该数组中的下一个位置(UACFArray(l+1, 0)/UACFArray(0, m+1)。
在您浏览所有内容之前提供一些有用的信息:
a() 是原始循环(即循环 i)中的原始数组,这是它的一部分。这个循环卡在循环 i 的最后,所以它最后检查这个。循环 i 以 a() 中的每个步骤的 case select 语句开始。如果满足条件,我将这个循环卡在(循环 i)的末尾以覆盖以前的值。
如果这总体上是草率而且很糟糕,请随时提出最佳实践方法,因为我很想学习更好地思考这些事情的方法。
例如:用户输入是 1/3/15(并且由于代码说要使用 lastdate+7 进行检查),因此条件不会触发循环来检查是否 1) 1/3/15不匹配 UACFArray(l, 0) 也不检查它是否在 UACFArray(l, 0) 和 UACFArray(0, m) 之间。输出是 case select 中原始参数的输出。
示例代码:
UACFArray(0, 0) = #1/6/2015#: UACFArray(0, 1) = #2/3/2015#
UACFArray(1, 0) = #1/20/2015#: UACFArray(1, 1) = #2/17/2015#
UACFArray(2, 0) = #2/10/2015#: UACFArray(2, 1) = #3/10/2015#
UACFArray(3, 0) = #2/24/2015#: UACFArray(3, 1) = #3/24/2015#
UACFArray(4, 0) = #3/17/2015#: UACFArray(4, 1) = #4/14/2015#
UACFArray(5, 0) = #3/31/2015#: UACFArray(5, 1) = #4/28/2015#
UACFArray(6, 0) = #4/21/2015#: UACFArray(6, 1) = #5/19/2015#
UACFArray(7, 0) = #5/5/2015#: UACFArray(7, 1) = #6/2/2015#
If CheckBox = True And (ComboBox = "Text1" Or ComboBox = "Text2") And i = a(0) Then
For l = LBound(UACFArray, 1) To UBound(UACFArray, 1)
For m = LBound(UACFArray, 2) To UBound(UACFArray, 2)
If (LastDate + 7) <> UACFArray(l, 0) And (LastDate + 7) > UACFArray(l, 0) And (LastDate + 7) < UACFArray(0, m) Then
BlcokStart = UACFArray(l + 1, 0)
BlockEnd = UACFArray(0, m + 1)
End If
Next m
Next l
ElseIF ComboBox = "Text1" Or ComboBox = "Text2" Then
For l = LBound(UACFArray, 1) To UBound(UACFArray, 1)
If UACFArray(l, 0) = BlcokStart Then
For m = LBound(UACFArray, 2) To UBound(UACFArray, 2)
BlockEnd = UACFArray(l, m)
a(i) = BlcokStart & " & " & BlockEnd
BlcokStart = UACFArray(l + 1, m)
Next m
End If
Next l
End If
【问题讨论】:
-
请注意,我在编辑中所做的更改使您的程序分支的逻辑更加清晰 - 将每个子分支保持比上面的分支更远的缩进允许您查看路径以查看所有内容嵌套在一起。这是 VBA 标准做法,或多或少反映了其他语言的做法。
-
另外 - 你的问题措辞不好 - 你在问题中使用内部术语来指代变量和函数名称,这最初并不清楚。输入和输出的一些示例将有助于显示程序的逻辑。
标签: excel vba loops multidimensional-array