【20180327】- 如何使用VBA创建带有默认参数的自定义函数?

-回复 -浏览
楼主 2019-01-10 15:30:35
举报 只看此人 收藏本贴 楼主


        本来打算今天继续介绍使用VB.NET封装自定义函数在其他电脑发布的问题,因为这个问题在前面分享的文章【20180316】- 你会使用VB.NET封装VBA自定义函数吗(一)?中没有给出解决办法,经过这两天的抽空研究,终于发现如何实现发布到其他电脑使用了。但由于VBA训练营马上就要来了,故今天插播一期和VBA相关的图文教程。关于VB.NET封装的dll发布问题留到下一期图文教程再来介绍了。

        这两天SUT学习交流群(群号:615356012)中有位厦门的小伙伴咨询了一个问题,问题截图如下:



        该小伙伴发的上面的截图,不仔细看是完全看不懂,这个感觉像下赌注的表格,先不管这个表格的用途,通过上图可以看到圆圈圈出来的4处,该小伙伴希望通过查找0所在列对应的第一行的值,然后汇总显示为如下形式:



        其实如何变为这种汇总样式,第一反应肯定是通过VBA来实现,因为该小伙伴肯定是简化了问题,因为第三行这些数值都是0,中间并没有间隔其他数值,但考虑问题肯定要考虑周到,如果数据变为如下形式:



        那么问题难度就会有所升级,不过过了一会,厦门的小伙伴在群里又发了另一个需求,当然这两个需求是或的关系,实现其中任何一个就可以了。



        另一需求截图如下:



        其实针对第二个需求,就想要简单很多,如果第三行全部是0的话,只要考虑转置即可,但如果0所在行还有其他非0的列,问题恐怕不单单是转置那么简单了。参加过老王数组训练营的小伙伴面对升级的问题应该都会解决了,因为该问题使用基础函数配合数组就很容易解决了。具体演示如下:



        其实数组公式也不是很难理解,主要的核心就是里面的SMALL和IF配合的函数,对于OFFSET是用来索引数值的,对于IFERROR是用来规避错误值的,所以公式拆分后就非常容易理解了。如果对公式还有不了解的地方,请自行使用F9调试公式哦。


        到这里,基本已经解决了厦门小伙伴的问题,但对于追求完美的Steven来说,问题还未完全解决,因为该小伙伴的第一个问题还未解决,为了能够快速解决该小伙伴的第一个问题,我快速编写了如下VBA代码:


Function sutConcat(rng As Range, rngs As Range, Optional ByVal rowIndex As Integer = 0, Optional ByVal split As String = ",")

    sutConcat = ""

    For Each rngtemp In rngs

        If rng.Value = rngtemp.Value Then

            sutConcat = sutConcat & rngtemp.Offset(rowIndex, 0).Value & split

        End If

    Next

    'If Right(sutConcat, 1) = split Then

    '    sutConcat = Left(sutConcat, Len(sutConcat) - 1)

    'End If

    sutConcat = rng.Value & "(" & sutConcat & ")"

End Function


        其实该VBA代码是一个自定义函数,第一个参数表示需要查找的值,第二个参数表示需要查找值的区域,第三个参数表示行索引(默认值为0,也就是本行),第四个参数表示使用什么来分割字符(默认值为英文逗号)。那究竟该自定义函数如何使用呢?详细演示请见如下动态图:



        怎么样?是不是发现VBA和数组公式一样好用呢?可能有小伙伴就要问了,我完全不会VBA怎么办?也没有编程基础怎么办?不要怕,建议大家参加即将开设的VBA训练营,敬请期待~

        好了,今天的介绍就到这里了,大家如果在学习过程中遇到任何问题,欢迎咨询或加入QQ群交流学习哦,期待你的进步^_^


SUT事务所 - 节约您的时间! 

Steven

90后小鲜肉

技术咖 效率控

金融机构 资深技术

探索新鲜事物 体验社会万象

站在不同群体看世界

QQ群:615356012

『关注我们 阅读原文 精彩无限

按住二维码 点击扫码关注

我要推荐
转发到