【问题标题】:Highest/lowest 3 consecutive columns in data set数据集中最高/最低的 3 个连续列
【发布时间】:2019-08-15 22:15:10
【问题描述】:

我正在尝试在 Excel 电子表格中查找连续列的最大总和。

例如 - 假设我想从以下数据中找出任意三个连续列的最大总和:1、2、3、12、8、4、1、1、12。最高为 24(即 12+8+4)。

我一般不是在寻找最高的三列(即 12、8、12),而是寻找最高的连续三列。

我还希望公式要么突出显示最大值中包含的列,要么输出列名,以便我可以轻松识别哪些单元格具有最高连续值。

为了获得更多背景信息,我们试图在一系列数据中显示最赚钱的 12 个月和 36 个月。数据是每月的(即 2019 年 8 月 - 10%,2019 年 6 月 - 5% 等)唯一的限制是月份。

【问题讨论】:

  • 这很模糊,您需要某种规则来确定这些值如何连续。是通过像+-* 这样的数学运算符吗?也包括你自己的努力。
  • 您好 JvdV,感谢您的回答。抱歉,我以前从未使用过stackoverflow,所以不确定这里的情况如何!数据是每月的,因此连续规则将是连续的月份。为了获得更多背景信息,我们试图在一系列数据中显示最赚钱的 12 个月和 36 个月。唯一的限制是月份。谢谢你的时间:)
  • 感谢@HSTech 的反馈,但不幸的是,这并不太清楚(至少对我而言)。请查看How to Askminimal reproducible example 的问题。也采取该网站的tour 可能会有所帮助。

标签: excel vba excel-formula excel-2010


【解决方案1】:

如果您不想使用辅助行,可以使用以下公式。我假设您的数据在 B1:B9 中,并且您想要在 D1 中检查的连续值的数量如下图所示:

第 1 步创建连续值的范围:

=MMULT(
  --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
  B1:B9),

第二步求最大值的第一个元素的索引(如果有多个最大值,则返回第一个):

=MATCH(
  MAX(
    MMULT(
      --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
      B1:B9)),
  MMULT(
    --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
    B1:B9),
  0)

第三步获取最大值:

=OFFSET(
  B1:B9,
  MATCH(
    MAX(
      MMULT(
        --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
        B1:B9)),
    MMULT(
      --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
      B1:B9),
    0)-1,
  0,
  D1,
  1)

第 4 步计算总和:

=SUM(
  OFFSET(
    B1:B9,
    MATCH(
      MAX(
        MMULT(
          --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
          B1:B9)),
      MMULT(
        --(ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))<=TRANSPOSE(ROW(B1:B9)))*--(TRANSPOSE(ROW(B1:B9))<ROW(OFFSET(B1:B9,0,0,ROWS(B1:B9)-D1+1,1))+3),
        B1:B9),
      0)-1,
    0,
    D1,
    1)
  )

注意:将这些公式作为数组公式输入很重要(您必须按 Ctrl+Shift+Enter 而不是仅按 Enter,您会在大括号中看到公式)。

【讨论】:

    【解决方案2】:

    这是另一种方式...

    对于最高金额,在K2中输入以下公式,并用CONTROL+SHIFT+ENTER确认...

    =MAX(SUBTOTAL(9,OFFSET(A2:I2,,ROW(INDIRECT("1:"&COLUMNS(A2:I2)-3+1))-1,,3)))
    

    对于对应的连续3个月,选择单元格L2:N2,输入以下公式,并用CONTROL+SHIFT+ENTER确认...

    =OFFSET(INDEX(A1:I1,MATCH(K2,SUBTOTAL(9,OFFSET(A2:I2,,ROW(INDIRECT("1:"&COLUMNS(A2:I2)-3+1))-1,,3)),0)),,,,3)
    

    【讨论】:

      【解决方案3】:

      我通过用户定义函数提出了一个解决方案,该函数返回 n 个连续列中第一列的列号,给出最高和。

      然后您可以重复使用此信息来计算总和并设置 MFC 以突出显示相应的列

      UDF : (插入新模块)

          Function maxsumcons(r, n&) As Long
      ' return the index of the first column in range r of the  n consecutive columns giving the max sum
      
          Dim maxi&, maxs, s, i&, j&
          For i = 1 To r.Count - n + 1
              s = 0
              For j = i To i + n - 1
                  s = s + r(1, j).Value
              Next j
              If s > maxs Then maxs = s: maxi = i
          Next i
          maxsumcons = maxi
      
      End Function
      

      现在假设您的数据在 A2:I2 中 您可以使用以下公式(让我们在 K2 中说)=maxsumcons(A2:I2,3) 来获取最大总和的第一列,并重用此信息以使用如下公式计算此总和:=sum(offset (A1,1,K2-1,1,3))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2015-08-14
        • 1970-01-01
        • 2013-09-28
        • 2023-01-10
        • 2014-04-14
        • 2014-04-30
        相关资源
        最近更新 更多