【问题标题】:Check if any value in array is greater than zero (efficiently) in Excel using vba使用 vba 在 Excel 中检查数组中的任何值是否大于零(有效)
【发布时间】:2018-01-31 11:49:06
【问题描述】:

我正在尝试检查大小为“i”的动态数组中是否有任何值大于零,其中“i”是用户输入。如果为 false,则数组中第一个元素的值将显示在下一列中。如果为真,则数组的值通过本质上向下移动一个元素来更新。我相信我已经在 java here 中找到了这个问题的答案,但在 vba 中找不到任何运气。我相信这可以像 here 那样使用 for 循环来完成,但如果它存在的话,我希望它更有效。由于我不知道任何可能有效的语法,因此代码挂在“If any x > 0 Then”

Dim i, z, u As Integer
Dim fir As Integer
Dim las As Integer
Dim n As Long
Dim x As Variant

'SET VALUE OF ROWS FOR ARRAY
i = Worksheets("INPUTS").Range("C6").Value

Set s = Worksheets("DATA")

'FIND LAST VALUE IN DATA
n = s.Cells(s.Rows.Count, "A").End(xlUp).Row

'BEGIN LOOP THROUGH DATA SET
For z = 1 To n

    'SET/RESET RANGE TO CHECK FOR CONSECUTIVE VALUES LESS THAN ZERO
    fir = z
    las = i + z - 1
    x = (s.Range("C" & fir, "C" & las).Value)
    u = s.Range("C" & UBound(x)).Value

    If any x > 0 Then
    Else: s.Cells(4, z) = x(1, 1).Value
    End If

Next z

我是论坛的新手和新手,所以请随时在任何违反与代码或问题相关的最佳实践的问题上给我一个新的,谢谢。

【问题讨论】:

  • 你应该在 YouTube 上观看这个系列:Excel VBA Tutorial。第 5 集和第 25 集是相关的。
  • 您介意分享您所拥有的屏幕截图以及您的预期输出以可视化您的目标吗?
  • Dim i, z, u As Integer 仅将 u 声明为整数。其他的将被声明为变体。此外,几乎不需要整数类型。请改用long。请参阅 SO 和“网络”中的讨论以获取解释。
  • 不要将范围误认为是数组。后者更快,但需要更多编码。
  • 感谢您的意见。 @sktneer 屏幕截图不能很好地解释目标,但要点只是识别一列数据中的多个连续负值,并将连续负值的数量作为用户的输入。一旦满足该条件,数据集中的第一个值将显示在下一列中。

标签: arrays vba excel


【解决方案1】:

使用工作表功能

If Application.WorksheetFunction.Max(Range("a1:a100")) > 0 Then
    MsgBox "value higher than zero"
end if

【讨论】:

  • 谢谢,这很好,并且消除了对数组逐个元素检查的需要。
  • 您可以只做Application.WorksheetFunction.Max(columns("a")) 而不必担心找到最后填充的行。如果列中有文字,它仍然有效
【解决方案2】:

为了加快处理速度,您可以考虑将 Excel Range(例如 A1:A100)转换为数组 Arr,然后遍历数组:

Dim Arr() As Variant
Arr = Range("A1:A100")

此外,您可以考虑在开始迭代之前设置属性Application.ScreenUpdating = False(以防您在迭代期间根据您的示例更改单元格的值),然后将其重置为True

希望这会有所帮助。

【讨论】:

  • 您还必须执行Arr = Application.Transpose(Arr) 才能将二维数组转换为一维数组
  • @jsotola 我从来没有做过任何速度测试,但考虑一下:只遍历二维数组的第一个维度会更快吗?或者做转置然后遍历一维数组?
  • 不知道是快还是慢。只是少了一件引起问题的事情,例如 是 arr(1,x) 还是 arr(x,1)
  • @RonRosenfeld 答案将取决于数组的大小:显然,Transpose() 函数开销增加了整体时间复杂度,但在处理大型数组的情况下可能是合理的。作为一般规则,仅遍历第一个维度可能就足够了。最好的问候,
  • @jsotola 好的,Worksheetfunction.Transpose 有两个问题。对于 32,000 行的数组,将值求和所需的时间是使用原始二维数组的 3 倍。但是,它在处理大型数组时有些不稳定。我最初尝试了一个 100,000 行的数组,但转置 --> ubound 为 34464。一些测试表明,转置最多只会返回 num_rows MOD 65536
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2020-02-10
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多