不吹不黑,学会这两段VBA代码,公式难以解决的合并单元格问题变得无比简单了!

文摘   2024-11-25 20:00   上海  




欢迎转发和点一下“看”,文末留言互动!

置顶公众号或设为星标及时接收更新不迷路





小伙伴们好,今天来和大家分享一道合并单元格的题目。合并单元格是绝大多数人的痛点,小白们都喜欢使用合并单元格,但其却给后面的计算、统计等工作带来巨大的麻烦。只有掌握好相关的操作技巧,才能更有效地处理合并单元格问题。

今天的题目是这样的:




将合并单元格对应区域中的最大值找出来后输入在合并单元格中。题目要求很简单,但解题过程却一点也不简单。

今天将给朋友们带来一个公式,两组代码及一个彩蛋!


01

函数公式法





选中单元格区域C2:C22,输入下列公式,CTRL+Enter确认即可。

=MAX(OFFSET(A2,,,MATCH(1=0,B3:B22=0,-1)))

我的版本是EXCEL2016,这条公式在我这里不能正常显示结果,很是疑惑!上图公式中OFFSET函数第一参数应该是单元格A2,图片来自于群友的分享。这里特别说明一下。

MATCH(1=0,B3:B22=0,-1)

对于MATCH函数,我们常用的的三参数是“0”和“1”,极少用到“-1”。当第三参数是“-1”时,MATCH函数要求查找区域中的数据降序排列,并返回大于等于查找值的最小值的位置。

以第一个合并单元格为例:

1=0,逻辑值是FALSE,实际上即是查找“FALSE”。

B3:B22=0,返回一组逻辑值,{TRUE;TRUE;TRUE;FALSE;TRUE;FALSE;...},第一个“FALSE”出现在第4个位置上。

OFFSET(A2,,,MATCH(1=0,B3:B22=0,-1))

OFFSET函数以单元格A2为基点,不做任何偏移,新的区域行高为4

MAX(OFFSET(A2,,,MATCH(1=0,B3:B22=0,-1)))

最后由MAX函数取得最大值。

其它合并单元格也是相同的逻辑。


02

利用VBA输入公式


首先选中单元格区域C2:C22,再执行下列代码。




完整代码如下:

Sub 合并单元格最大值()    Dim e As Range, r As Range, area, s, cl    cl = "A"    For Each e In Selection        Set r = e.MergeArea        If e.Address = r.Range("A1").Address Then            s = r.Address            area = Replace(s, Split(s, "$")(1), cl)            e.Formula = "=max(" & area & ")"        End If    NextEnd Sub

其中:

If e.Address = r.Range("A1").Address Thens = r.Address...End If

令变量r为合并区域。如果合并单元格的地址等于变量r中第一个单元格的地址,则将这个地址赋值给变量s

area = Replace(s, Split(s, "$")(1), cl)

Split函数将变量s按“$”拆分;Replace将字母“D”替换为字母“A”,生成一个新的单元格区域。

e.Formula = "=max(" & area & ")"

在对象变量e中输入公式,结算结果得到最大值。

代码运行的结果如下:





03

VBA直接录入最大值





完整代码如下:

Sub 合并单元格最大值1()    Dim e As Range, r As Range, area, s, cl    cl = "A"    For Each e In Selection        Set r = e.MergeArea        If e.Address = r.Range("A1").Address Then            s = r.Address            area = Replace(s, Split(s, "$")(1), cl)            e = WorksheetFunction.Max(Range(area))        End If    NextEnd Sub

和上一段代码相比不同之处仅仅是e = WorksheetFunction.Max(Range(area))这一句。


04

彩蛋,如何用公式提取最大值





在单元格F3中输入下列公式,三键确认并向下拖曳即可。

=INDEX(VLOOKUP(N(IF({1},ROW($1:$6))),IF({1,0},LARGE(COUNTBLANK(OFFSET($A$1,,,ROW($1:$27))),ROW($1:$27)),MOD(LARGE(IFERROR(COUNTBLANK(OFFSET($A$1,,,ROW($1:$27)))*1000+$A$2:$A$28,0),ROW($1:$27)),1000)),2,0),ROW(A1))

朋友们有兴趣来解析一下这条公式吗?欢迎留言区给我留言哦!



本期内容练习文件提取方式:

链接: https://pan.baidu.com/s/1_IaOdczjnGS51AXJ75frJw?pwd=3evq 提取码: 3evq 


好了朋友们,今天和大家分享的内容就是这些了!喜欢我的文章请分享、转发、点赞和收藏吧!如有任何问题可以随时私信我哦!


-END-


长按下方二维码关注EXCEL应用之家

面对EXCEL操作问题时不再迷茫无助


我就知道你“在看”


推荐阅读

Excel应用之家
介绍、交流EXCEL各项功能在工作中的实际应用; 为你答疑解惑;分享各类图表、表格和模板;提供有偿代工服务。
 最新文章