首页 > 解决方案 > 找到两个单元格之间的最大值,但不包括单元格

问题描述

我是 VBA 的初学者,并且一直在广泛使用循环来自动化数据集上的一些工作。我有一组日期,这些日期之间是空单元格。我已经用 TRUE 值填充了空单元格,现在想找到两个连续的 TRUE 值之间的最大值,但显然不包括这些单元格,然后我想用这个来遍历我的整个数据集。

我的问题是我似乎无法找到一种方法来创建一个找到正确上限和下限的宏,然后找到这之间的最大值,然后将结果返回到另一列中,另一列在另一列下

在此处输入图像描述

例如,我想获取第二个和第三个 TRUE 之间的数据,找到最大值,然后将这个最大值粘贴到 D2 中。然后我想去第三个和第四个 True 并做同样的事情。所以最后我应该有一列最大日期

excel 在记录宏功能上绘制的 max 函数引用了关于您要粘贴最大值的位置的上限和下限,但是由于单元格数量在边界之间发生变化,我无法列出最大值 -有些会达不到其他的,会超越。

我的想法是开发一个找到第一个 TRUE 的宏,寻找下一个 TRUE,然后计算出这两者之间的最大值,但不包括这两者。然后我将 Range("D1").value = max("first true:second true") 存入 y 值。继续下一个循环,它会找到第三个 TRUE 并输出第二个和第三个之间的最大值,同样不包括这两个单元格,并且 Range("D2").value = max("second true:third true" )。

我只是不知道如何使 max 函数像这样工作。我也不知道如何通过 TRUE 列表进行路由,以便我总是在正确的位置

标签: excelvbafor-loopmax

解决方案


我建议:

  • 将范围读入 VBA 数组
    • 如果这个链接仍然很好,那么已故的 Chip Pearson 关于VBA中的数组和范围的精彩讨论会很有帮助。
  • 遍历范围并在每个实例之后收集最大日期TRUE到一个Dictionary对象(一个方便的存储集合)。
  • 通过字典输出结果。
  • 该函数可以构建为输出垂直或水平数组
    • 请参阅有关此的注释。
  • 根据您的 Excel 版本,它可能只是将值作为数组输出,或者您可能必须将其作为数组函数输入到范围中,或者使用 INDEX 函数来访问每个元素。
  • 您也可以将其转换为一个宏,该宏将在预定范围内输出结果,但当然,代价是容易使其动态化。
Option Explicit
Function maxDateList(rg As Range)
    Dim Arr As Variant
    Dim D As Object
    Dim I As Long
    Dim KEY As Long
    Dim V As Variant

'read range into vba array for speedy processing:
'This is always a 2D array
Arr = rg

'loop through the range, saving the max date into
'our dictionary object, and changing dictionary
'entries on each instance of TRUE

Set D = CreateObject("Scripting.Dictionary")
For I = 1 To UBound(Arr)
    If Arr(I, 1) = True Then KEY = I
    If IsDate(Arr(I, 1)) Then
        If Not D.Exists(KEY) Then
            D.Add KEY:=KEY, Item:=Arr(I, 1)
        Else
            If Arr(I, 1) > D(KEY) Then D(KEY) = Arr(I, 1)
        End If
    End If
Next I

'Output the results as an array
'use 2d array for vertical output
'    1d array for horizontal output
I = 0
ReDim Arr(1 To D.Count, 1 To 1)
For Each V In D
    I = I + 1
    Arr(I, 1) = D(V)
Next V

'output the results
maxDateList = Arr

End Function

在此处输入图像描述


推荐阅读