【问题标题】:Find the max between two cells but not including the cells找到两个单元格之间的最大值,但不包括单元格
【发布时间】:2020-06-11 11:16:46
【问题描述】:

我是 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 列表进行路由,以便我总是在正确的位置

【问题讨论】:

  • 你可以看看Range.Find方法。有一个演示代码。

标签: excel vba for-loop max


【解决方案1】:

我建议:

  • 将范围读入 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

【讨论】:

  • 我一直在尝试遵循这段代码,但是当我将它实现到我的子程序中时,它只会填充第一个最大值。我使用该函数的代码如下 Dim rg As Range, Set rg = Range("B1:B33"), Range("E1").Value = maxDateList(rg), 这是我第一次使用函数所以我我知道我的语法可能全部关闭!
  • @Zain 您需要阅读我发布的关于 VBA 中的范围和数组的链接。他写道,将数组从 VBA 传输到工作表时,目标范围需要与数组的大小和维度相同。所以像v = maxDateList(rg): Range("E1").Resize(RowSize:=ubound(v,1)).Value = v 这样的东西应该可以工作。该链接上还有许多其他有用的信息。
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 2021-12-05
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2020-11-25
相关资源
最近更新 更多