【问题标题】:Comparing values in single column to multidimensional array - how to loop将单列中的值与多维数组进行比较 - 如何循环
【发布时间】:2017-02-18 10:27:11
【问题描述】:

我想将 Multid 数组中的值与单个列中的值进行比较。

止损:

45

54

76

OHLC:

37 43 30 40

32 43 41 43

32 54 76 87

我想将 Stoploss 中的每个值与 OHLC 进行比较,并找到大于 OHLC 中 Stoploss 的第一个值,在这种情况下,OHLC 中大于 45 的第一个数字将是 54。这发生在 Stoploss 中的每个后续数字,将 OHLC 数组调整为我要比较的止损值的行号。这意味着,当我将 54 与 OHLC 进行比较时,我的 OHLC 范围现在将变为 B2:B3,而不是停留在 B1:B3。

止损范围内会有空格。到目前为止,我有这个:

For i = 63 To 166

Set OHLC = Range("B" & i & ":" & "E" & i)

   For Each cll In OHLC



   If Range("x" & i).Value > 0 Then
   stoploss = Range("x" & i)
   End If

   If cll.Value > stoploss Then

   Range("s" & cll.Row) = cll.Value

   End If

   Next cll

Next i

我的代码中没有错误消息,但“S”列中没有返回值。我也知道这种双循环方法不起作用,因为它为每一行返回范围 B:E 中的第一个值,这不是我想要的。有帮助吗?任何输入将不胜感激。谢谢你

*PS 我知道这方面的主题之前已经介绍过,但仅限于 VB 领域。似乎找不到正确的解决方案。我是 VBA 新手。

【问题讨论】:

  • 没有阅读完整的问题,但很明显这个Set OHLC = Range("B" & i & ":" & "E" & i) 应该在for each 循环之前。
  • 不应该cll 也实际阅读cell 吗?
  • @BryanDavies 嗨,布莱恩,我已经将 cll 格式化为变量。所以这里没有错误。
  • @newguy 在循环内设置 OHLC 范围也可以。
  • 好的,如果你之前定义过,没关系。但我真的同意 newguy 关于在 for each cll in ohlc 的 for 循环中重置一系列 OHLC 是一个非常糟糕的主意。如果不出意外,您将面临无法逃脱的无限循环的风险。我不介意 i = 63 到 16 的 for 循环内的“设置 OHLC”,尽管这也需要一个步骤为 -1 或其他东西。因为它会 i=63,64,65 等,永远不会达到 16。

标签: vba excel loops multidimensional-array


【解决方案1】:

现在您在每一行中搜索大于该行中止损的值,因为您的范围OHLC 仅包含一行。因此,首先您在 37 43 30 40 中搜索大于 45 的值,依此类推。这没有任何命中(至少在您的示例中)。

如果您想在所有行中搜索 Stoploss 的每个值,您需要将范围设置为所有这些行,然后遍历它们

'Set OHLC = Range("B1:E10000") 'If you want to search the whole range

For i = 63 To 166
    'Set OHLC = Range("B" & i & "E10000") 'if you want to search from row i onwards
    If Range("X" & i).Value > 0 Then
        stoploss = Range("x" & i)
        Set OHLC = Range("B" & i & "E10000") 'based on your comment "first row of OHLC to match the row of the value in Stoploss" (only update OHLC if stoploss is updated)
    End If

    For Each cll In OHLC    'will loop row by row
        If cll.Value > stoploss Then
            Range("s" & cll.Row) = cll.Value
            Exit For    'don't loop through all 40000 cells!
        End If
    Next cll
Next i

【讨论】:

  • 非常感谢!这运作良好。但是,有什么方法可以使 OHLC 成为可变范围,而不是将其设置为 B1:E10000 以便我可以更改范围?
  • 我不确定你在问什么。您已经知道如何使用变量作为行来创建范围?
  • 如果您设置了 B1:E10000,那么该变量如何?这些行对于范围 X 是可变的,但我认为对于 OHLC 不是。您的代码仅在我设置 B63:E10000 时才有效
  • 每当我比较值时,我需要使我的第一行 OHLC 与止损中的值行匹配。
  • 啊,我同意您的评论“多维数组,有 4 列和 10000 行”......“我希望它遍历该 MultiD 数组中的每个单元格”。我编辑了我的帖子
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多