ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 1754|回复: 28

[求助] 敬请看见星光老师

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-5-1 12:30 | 显示全部楼层 |阅读模式
尊敬的星光老师您好。学生在本论坛敬候您有几个月了(此前曾发帖专门向您求助未果),今天终于发现您在线上回答问题。借此机会向您请教一个问题:您去年帮学生写了一个“多表去重复”的自定义函数,特别实用(几乎经常会使用到它)。我想请您对该自定义函数添加一个注释,以便今后套用。同时,恳请老师指点一下套用时的注意事项。望老师务必回复。谢谢!

自定义多表去重复.rar

10.11 KB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2017-5-1 15:17 | 显示全部楼层
本帖最后由 99qiang 于 2017-5-1 15:53 编辑

不请自来,我也是凭自己的理解写的解释,有不对的地方请多包涵。感觉这样解释对你可能没什么用,你需要对字典和数组知识有所了解。
Function 多表去重复(adrss, k&) '函数名称叫多表去重复,用的时候需要两个参数,一个是地址,一个是数值
Dim d As Object, sht As Worksheet '定义一个字典对象d,定义sht为工作表对象
Set d = CreateObject("scripting.dictionary") '绑定字典
For Each sht In Worksheets '在工作簿中遍历工作表,也就是一张表一张表地查过去,当查第一张表的时候,sht就代表第一张表,一直到最后一张,你的工作表里有6张表
    With sht '在第一张表里,第二张表里……
        If .Name <> ActiveSheet.Name Then '如果这张表不是活动表的话,那么进行下面的代码,否则跳出IF
            arr = Intersect(.UsedRange, .Range(adrss)) '表中已使用的区域和你函数中第一参数指定的区域,两者重叠的区域赋值给arr数组,在你这里是每张表的A2:A10
            For i = 1 To UBound(arr) '用两个for循环,按行列的顺序将数组中的元素装入字典,因为字典中的key只允许唯一存在,也就是说第二次装入一个值的话,第一次的就被替换。UBound(arr)是数组的行数,数组有几行,它就表示几
                For j = 1 To UBound(arr, 2) 'UBound(arr, 2)是数组的列数,数组有几列,它就表示几列
                   If arr(i, j) <> "" Then d(arr(i, j)) = "" '如果为空则跳过
                Next
            Next
        End If
    End With
Next '到此循环结束时,所有的不重复值都已装入字典d中了
r = d.keys '这句是把字典d中的关键字key赋值给数组r
If k > UBound(r) + 1 Then '如果函数的参数k超过了字典中key的数量,
    s = "" '那么函数值为空
    Else
    s = r(k - 1) '否则显示其中的不重复值,具体显示哪一个,根据你函数的参数k来确定
End If
多表去重复 = s
Set d = Nothing '清空字典
End Function

评分

参与人数 1鲜花 +2 收起 理由
laoshenji + 2 感谢帮助

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-5-1 16:44 | 显示全部楼层
99qiang 发表于 2017-5-1 15:17
不请自来,我也是凭自己的理解写的解释,有不对的地方请多包涵。感觉这样解释对你可能没什么用,你需要对字 ...

首先,谢谢
其次,学习了

TA的精华主题

TA的得分主题

发表于 2017-5-1 16:57 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-1 17:11 | 显示全部楼层
niko88819 发表于 2017-5-1 16:57
已经很久没有看到"看见星光"老师了,他是我小师妹的偶像呢

星光老师是你的偶像,可是我的“救星”。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-1 17:42 | 显示全部楼层
本帖最后由 laoshenji 于 2017-5-1 19:05 编辑
99qiang 发表于 2017-5-1 15:17
不请自来,我也是凭自己的理解写的解释,有不对的地方请多包涵。感觉这样解释对你可能没什么用,你需要对字 ...

99qiang老师:您好!
    学生向你请教一个问题:
    1、arr = Intersect(.UsedRange, .Range(adrss)) '表中已使用的区域和你函数中第一参数指定的区域,两者重叠的区域赋值给arr数组,在你这里是每张表的A2:A10
     :每张表的“A2:A10”,是否包括了行表头?如果《统计表》中的“品名”不在A2而是A3(也就是说《统计表》与各分表的表头单元格地址不一致)是否需要修改自定义函数,如需修改又该如何修改?
    2、 For i = 1 To UBound(arr) '用两个for循环,按行列的顺序将数组中的元素装入字典,因为字典中的key只允许唯一存在,也就是说第二次装入一个值的话,第一次的就被替换。UBound(arr)是数组的行数,数组有几行,它就表示几
    :举例说明1楼附件中“数组的行数”的具体指向?
    3、 For j = 1 To UBound(arr, 2) 'UBound(arr, 2)是数组的列数,数组有几列,它就表示几列
    :举例说明1楼附件中“数组的列数”的具体指向?
    以上望老师赐教。再谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-1 17:51 | 显示全部楼层
本帖最后由 laoshenji 于 2017-5-1 19:03 编辑
99qiang 发表于 2017-5-1 15:17
不请自来,我也是凭自己的理解写的解释,有不对的地方请多包涵。感觉这样解释对你可能没什么用,你需要对字 ...

再问老师:就本例而言,《统计表》与各分表的行标题(如两者的“品名”所在行)是否都要在A2,或者A3...(即两者的行表头以及表头上面的行数必须一致和相等)?而且两者的汉字(即“品名”二字)都要绝对相符,能否一个叫“品名”、另一个叫“名称”呢?

TA的精华主题

TA的得分主题

发表于 2017-5-1 19:21 | 显示全部楼层
千万不要叫我老师,跟你一样,都是来学习的。你在统计表的A3单元格输入公式=多表去重复("A:B",ROW(A2)),然后往下拉,看看是什么效果。是不是分表中的数量也出现了?你理解一下,主要看你用函数时的第一个参数,就是A:A的话,会把分表中A:A的区域重复值删掉,如果是A:B的话,分表中A、B列的内容都会出现,因为在定义过程中这句arr = Intersect(.UsedRange, .Range(adrss)) '是指分表中已使用的区域和你函数中第一参数指定的区域,这两个区域的重叠部分,好好理解一下重叠部分

TA的精华主题

TA的得分主题

发表于 2017-5-1 19:33 | 显示全部楼层
本帖最后由 99qiang 于 2017-5-1 19:36 编辑
laoshenji 发表于 2017-5-1 17:42
99qiang老师:您好!
    学生向你请教一个问题:
    1、arr = Intersect(.UsedRange, .Range(adrss)) ...

问题1,包含表头,你试着在A3输入=多表去重复("A:A",ROW(A1)),因为第二参数是A1,也就是1,所以显示出来的是名称。
问题2,你得去学一下VBA的数组,你这个例子中,因为arr这个数组全是A2:A10,也就是9行,1列的数组,那么UBound(arr)=9,UBound(arr,2)=1,你不学数组,这样说很难理解,我只懂一点点一维、二维数组,我是把数组对应表格来理解的,比如把A1:C5的值给arr,可以用这样的语句:arr=range("a1:c5”),那么现在arr数组就是一个5行3列的数组,此时UBound(arr)=5,UBound(arr,2)=3,表达能力有限,希望你找点数组的教程看下。

TA的精华主题

TA的得分主题

发表于 2017-5-1 19:41 | 显示全部楼层
laoshenji 发表于 2017-5-1 17:51
再问老师:就本例而言,《统计表》与各分表的行标题(如两者的“品名”所在行)是否都要在A2,或者A3...( ...

你这个问题,主要是看你在使用这个函数时后面的两个参数,第一个参数是指明你所需要的不重复值在分表中的位置,第二个参数是你想要哪一个不重复值。你可以试着在A3中输入不同参数下拉看看效果。比如:=多表去重复("A:B",ROW(A2)),=多表去重复("A:A",ROW(A1))
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2020-2-21 11:25 , Processed in 0.414331 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表