果趣吧 关注:5贴子:129
  • 27回复贴,共1

合并单元格的统计

只看楼主收藏回复

合并单元格,统计的头号大敌


IP属地:湖南1楼2023-05-20 15:50回复
    在贴吧找到一个有意思的问题
    这题的难点不在求和,在于怎么去取合并单元格的行数
    我的思路如下
    =IF(B1<>"",D1*E1/(SMALL(IF(D$1:D$10=0,MAX(A:A)+1,ROW($1:$10)),COUNT(D$1:D1)+1)-SMALL(IF(D$1:D$10=0,MAX(A:A)+1,ROW($1:$10)),COUNT(D$1:D1))),OFFSET(F1,-1,))
    利用if将合并单元格首行和非首行区分开分开列式,非首行直接取上一行的值即可,这里因为没有表头,就用了个offset函数,则函数我是真的用得少
    首行取值的话我先利用创建一个数组,将首行行数都取出来,然后利用两个首行的所在行差值来确定合并单元格的行数


    IP属地:湖南2楼2023-05-20 16:05
    回复
      再搬运一下excel贴吧大神ssg365的公式
      =LOOKUP(9,D$1:D1)*E1/(IF(MIN(IF(B2:B10<>"",ROW(2:10))),MIN(IF(B2:B10<>"",ROW(2:10))),COUNTA(C:C)+1)-LOOKUP(1,0/(B$1:B1<>""),ROW($1:1)))
      这个公式直接利用lookup取合并单元格的值用于计算
      MIN(IF(B2:B10<>"",ROW(2:10))利用逻辑值大于数值取到首行行数


      IP属地:湖南3楼2023-05-20 16:38
      回复
        Function MGARVALUE(rng As Range)
        If rng.Count = 1 Then
        MGARVALUE = rng.MergeArea.Cells(1, 1).Value
        Else
        Dim arr()
        arr() = rng.Value
        al1 = LBound(arr, 1)
        au1 = UBound(arr, 1)
        al2 = LBound(arr, 2)
        au2 = UBound(arr, 2)
        For i = al1 To au1
        For j = al2 To au2
        arr(i, j) = rng.Cells(i, j).MergeArea.Cells(1, 1).Value
        Next j
        Next i
        MGARVALUE = arr()
        End If
        End Function
        有时候想破头的公式还不如搞几行代码好用……
        效果如图:注(图中显示0的单元格实际是空,函数后接上&""即可不显示0)


        IP属地:安徽4楼2023-05-30 19:42
        收起回复
          想了想,简单版的还是它有自己的用处,也一起放上来
          Function MGAR(rng As Range)
          Set r = rng.MergeArea
          MGAR = r
          End Function
          简单版,无法用于数组运算,参数只能是单个单元格
          可返回整个合并单元格区域的值(作为数组而非引用)
          可用组合公式获取合并单元格区域的各项参数
          比如:
          =ROWS(MGAR(A14))
          可获得整个合并区域的行数,同理:
          =COLUMNS(MGAR(A14))
          可获得整个合并区域的列数,
          =INDEX(MGAR(A14),1,1)
          可获得区域左上角单元格的值(即合并单元格区域显示的值),
          O365亦可简单使用@符号只获得左上角的值
          =@MGAR(A14)


          IP属地:安徽5楼2023-05-30 20:03
          收起回复
            其实做sub宏不如做function宏好用,sub宏有个致命的缺点就是会清空撤销列表,无论什么时候,只要运行了sub宏,你当下的ctrl+z就暂时失效了……
            所以相对简单点的功能还是写成function自定义公式来用更灵活方便
            而那种工作流程固定,或者并不需要用公式来处理的东西更适合做成sub宏一键处理


            IP属地:安徽6楼2023-05-31 10:50
            收起回复
              今天找到了个能用的GPT,于是又试着跑了下这个代码
              Function GetMergedCellValue(rng As Range) As Variant
              '获取单元格对应的合并单元格区域的值
              Dim mergeCells As Range
              On Error Resume Next
              Set mergeCells = rng.MergeArea
              On Error GoTo 0
              If mergeCells Is Nothing Then
              GetMergedCellValue = rng.Value
              Else
              GetMergedCellValue = mergeCells.Cells(1, 1).Value
              End If
              End Function
              看起来似乎写的挺好,不过好像没我前面写的好用,至少数组用不了啊


              IP属地:安徽7楼2023-06-01 17:24
              收起回复
                还是不完美啊,合并单元格的时候会自动计算,但是取消合并的时候这个公式不会自动计算,需要重新激活单元格,或者手动重算,虽然影响不大


                IP属地:安徽8楼2023-06-06 11:06
                收起回复