ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: renahu

[求助] 小白看“蓝桥玄霜”老师的实例学字典

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 15:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
unsamesky 发表于 2014-8-16 15:43
因为通过Tranpose转置得到的数组为二维数组,数组下标为1。
比如:arr(0 to 3)
for i = 0 to 3

原来一维数组转置后是二维数组呀,谢谢您的解答

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 16:00 | 显示全部楼层
本帖最后由 renahu 于 2014-8-16 16:11 编辑
unsamesky 发表于 2014-8-16 15:43
因为通过Tranpose转置得到的数组为二维数组,数组下标为1。
比如:arr(0 to 3)
for i = 0 to 3


明白了

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 16:02 | 显示全部楼层
本帖最后由 renahu 于 2014-8-16 16:13 编辑
jiminyanyan 发表于 2014-8-16 15:37
arr = WorksheetFunction.Transpose(Filter(dic.keys, "@"))
你可以调试一下,到这里后下标是1。。。。。 ...

明白了,原来例3,先转置了,而例4,等号左边是没转置的,等号右边是转置的,所以加1

TA的精华主题

TA的得分主题

发表于 2014-8-16 16:12 | 显示全部楼层
如果是一维数组,因为最小下标是0,则数组的总数是ubound(arr)+1
这里是二维数组,下标是从1开始的,所以不需要+1

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 16:15 | 显示全部楼层
本帖最后由 renahu 于 2014-8-16 16:17 编辑
蓝桥玄霜 发表于 2014-8-16 16:12
如果是一维数组,因为最小下标是0,则数组的总数是ubound(arr)+1
这里是二维数组,下标是从1开始的,所以不 ...


一位数组转置后就变成二维数组了,是这样吧,老师? 您的实例真好,特别是里面关于函数的详细解释,除了学字典还可以学到很多,比看枯燥的定义强多了,非常适合初学者

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 16:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-8-16 21:12 | 显示全部楼层
renahu 发表于 2014-8-16 16:29
今天看懂了4个例子,收获不小啊

继续努力。。。。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 23:13 | 显示全部楼层
本帖最后由 renahu 于 2014-8-18 10:02 编辑

山菊花版主的代码:
Sub 拆分()
    Dim pp1$, pp2$, nRow%, ds, Brr(), s(1 To 3) As Integer
    Set ds = CreateObject("scripting.dictionary")
    pp1 = Join(WorksheetFunction.Transpose(Range(Range("g2"), Range("g1").End(xlDown))), ",")
    pp2 = Join(WorksheetFunction.Transpose(Range(Range("h2"), Range("h1").End(xlDown))), ",")
    nRow = Range("a1").End(xlDown).Row
    Arr = Range("a1:a" & nRow)
    ReDim Brr(1 To nRow, 1 To 3)
    For i = 2 To nRow
        If Not ds.Exists(Arr(i, 1)) Then
            ds(Arr(i, 1)) = ""
            If pp1 Like "*" & Left(Arr(i, 1), 2) & "*" Then
                s(1) = s(1) + 1
                Brr(s(1), 1) = Arr(i, 1)
            ElseIf pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Then
                s(2) = s(2) + 1
                Brr(s(2), 2) = Arr(i, 1)
            Else
                s(3) = s(3) + 1
                Brr(s(3), 3) = Arr(i, 1)
            End If
        End If
    Next
    Range("c2:e" & nRow) = Brr
End Sub        
代码详解
1、pp1 = Join(WorksheetFunction.Transpose(Range(Range("g2"),Range("g1").End(xlDown))), ",")    我这么理解:这是表示G2:G1往下最后一个不为空的单元格,组成的区域,这个区域被转置成一个下限是1的一维数组,第一次看到Range这样的用法,是不是也可以写成  Range("g2",Range("g1)).End(xlDown) ?完全可以,不知道Range()里面能套着Range()吗?自己动手试了试,没问题
这句代码用了两个VBA函数Join 和Transpose ,Range("g1").End(xlDown)从G1单元格往下直到最下面的单元格,遇到空白格就停止。因为本例的G14、G15单元格有 另外的数据存在,如果还是用Range("g65536").End(xlUp),那么就会把不需要的数据带进去,造成结果出错。Transpose 转置函数,前面已经介绍过了。Join函数是通过连接某个数组中的多个子字符串而创建的一个字符串,本句代码执行后得到pp1="MOTO, 诺基亚, 三星, 索爱"。
pp2一句同上句一样,得到另一个字符串。
2、nRow = Range("a1").End(xlDown).Row   :把A列最后一行不为空白的行数赋给整型变量nRow。
3、Arr = Range("a1:a" & nRow) :把A列A1开始的有数据的单元格区域赋给变量Arr。这肯定是个二维数组
4、ReDim Brr(1 To nRow, 1 To 3) :用于为动态数组变量Brr重新分配存储空间。第一维的下界从1到上界nRow,第二维从1到3。那个Arr刚开始为什么不定义,后面直接就用,如果前面不定义,它就一定不是动态数组变量?能用ReDim重新分配吗?
5、For i = 2 To nRow :从2到 nRow逐一循环。
6、If Not ds.Exists(Arr(i, 1)) Then :如果字典ds中不存在关键字Arr(i, 1)
7、ds(Arr(i, 1)) = "" :把Arr(i, 1)作为关键字加入字典ds。现在明白了,只要关键字没有就自动加进去,同时关键字对应项清空
8、If pp1 Like "*" & Left(Arr(i, 1), 2) & "*" Then :这里山版主用了比较运算符Like来比较pp1和取自Arr(i, 1)左边两个字符,再在前后加任意字符组成的字符串,如果满足条件为真,那么执行下面的语句。
9、s(1) = s(1) + 1 :数组s的第一个元素+1以后赋给数组s的第一个元素。
10、Brr(s(1), 1) = Arr(i, 1) :把这个关键字赋给第2维为1的另一个数组Brr,也就是我们要求的贸易机类。pp1字符串里都是贸易机类的品牌。
11、ElseIf pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Then :同样,如果满足国产品牌类这个条件,那么执行下面的代码。
12、s(2) = s(2) + 1 :数组s的第二个元素+1以后赋给数组s的第二个元素。
13、Brr(s(2), 2) = Arr(i, 1) :把这个关键字赋给第2维为2的另一个数组Brr,也就是我们要求的国产品牌类。pp2字符串里都是国产品牌类的品牌。
14、s(3) = s(3) + 1 :前如果条件都不满足时,数组s的第三个元素+1以后赋给数组s的第三个元素。
15、Brr(s(3), 3) = Arr(i, 1) :把这个关键字赋给第3维为1的另一个数组Brr,也就是我们要求的其它品牌类。
16、Range("c2:e" & nRow) = Brr :把数组Brr赋给[c2]单元格开始的区域中。

TA的精华主题

TA的得分主题

发表于 2014-8-17 08:31 | 显示全部楼层
可以写成  Range("g2",Range("g1“)).End(xlDown)
自己多试试进步会很快。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-17 09:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 renahu 于 2014-8-17 09:58 编辑
蓝桥玄霜 发表于 2014-8-17 08:31
可以写成  Range("g2",Range("g1“)).End(xlDown)
自己多试试进步会很快。


谢谢老师,明白了,转置函数的对象可以是数组也可以是工作表上的单元格区域,转置完后,肯定是二维数组不会是一维数组,这个概念对吧?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 06:23 , Processed in 0.034135 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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