zoukankan      html  css  js  c++  java
  • excel 数组公式

    问题1:excel中找出一列数的最大值及其行号,

    问题2:第一个非0非空的值及其行号,

    问题3:最后一个非0非空的值及其行号。

    第一个问题比较简单,max函数求最大值,match函数求第一次出现最大值的行号。

    还有一种解法是用lookup函数,

    LOOKUP(1,0/(B3:B63=MAX(B3:B63)),ROW(3:63)),两者区别是如果存在多个max值,用match函数会匹配第一个最大值,用lookup函数会匹配最后一个最大值。

    问题2比较复杂,无法直接利用match函数,因为excel里没有直接找到第一个非0的函数,需要自己写。如果用vba的循环问题很好解决,

    现在要求只能用excel中自带的函数。

    首先要拿出数组公式这个概念,=sum(A1:A10*2),按ctrl+shift+enter,自动加{},会将A1:A10这个数组中每个元素乘以2,在求和。(注意lookup,不需要加{})

    假设我们要找A1:A10这个数组中第一个出现的非0元素,可以先做个变换

    (ROUNDUP(A1:A10/SUM(A1:A10),1)*10   这个公式可以将数组中非0数都变成1,为啥要整这么复杂,这样式子里不含IF函数,因为不会嵌套IF:)。。

    然后问题就简单了,查找=LOOKUP(1,0/(ROUNDUP(A1:A10/SUM(A1:A10),1)*10>0),$B$1:$B$10),其中$B$1:$B$10是查找对应的标签名,如果要求行号,改成ROW(1:10)即可。

    但是问题来了,这样求得是问题3。不是问题2,那么把A1:A10逆序一下即可。

    先求逆序数组: LOOKUP(COUNT(A1:A10)-ROW(1:9),ROW(1:9),A1:A10) ,然后把A1:A10 替换成这个公式即可。与此同时,$B$1:$B$10也需要做逆序处理,

    $B$1:$B$10 → LOOKUP(COUNT(A1:A10)-ROW(1:9),ROW(1:9),$B$1:$B$10) ,这里A1:A10的length和$B$1:$B$10相同

    =LOOKUP(1,0/(ROUNDUP( LOOKUP(COUNT(A1:A10)-ROW(1:9),ROW(1:9),A1:A10)/SUM(A1:A10),1)*10>0),LOOKUP(COUNT(A1:A10)-ROW(1:9),ROW(1:9),$B$1:$B$10))

    Oh,这个公式,so long。。

     补充:如果数值区里空值比较多,可能会出错,解决办法就是自动补0,“开始”-“查找和选择”-“定位条件”-“空值”-输入0-ctrl+enter

  • 相关阅读:
    POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串
    SPOJ
    POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
    POJ3261 Milk Patterns —— 后缀数组 出现k次且可重叠的最长子串
    POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串
    SPOJ
    AC自动机小结
    HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
    POJ1625 Censored! —— AC自动机 + DP + 大数
    Herding
  • 原文地址:https://www.cnblogs.com/marszhw/p/12250600.html
Copyright © 2011-2022 走看看