【问题标题】:Looping through two dimensional arrays based on conditions根据条件循环遍历二维数组
【发布时间】: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


【解决方案1】:

您的语法似乎不正确,您需要 control.value 来检查组合框中的内容。 例子: ElseIF ComboBox = "Text1" 或 ComboBox = "Text2" 然后

应该是: ElseIF ComboBox.Value = "Text1" 或 ComboBox.Value = "Text2" 然后

另外我想指出的是,您检查条件“复选框已被用户选中”与行

checkbox.value = -1 表示选中和

checkbox.value = 0 表示未选中。

(我知道这真的违反直觉。)

代码“If checkbox = true then ...”不会导致错误,但我认为这不是您要查找的内容。

【讨论】:

  • 啊,当我把它放在这里时,我忘了包括 .value。但是,复选框的真/假评估是正确的(特别是如果您为复选框指定了自定义名称)。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2019-02-04
  • 2018-11-02
相关资源
最近更新 更多