Excel精英培训网

 找回密码
 注册
查看: 5406|回复: 18

[习题] 【字典201201班】B组(B01—B22)第3讲作业上交贴

  [复制链接]
发表于 2012-6-13 14:44 | 显示全部楼层 |阅读模式
本帖最后由 liuguansky 于 2012-6-21 08:43 编辑

注意:
       
1:作业尽量通过自己思考独立完成,不会的可在同学之间私聊讨论,禁止在QQ群公开讨论。
       2:本帖已经设置仅作者可见,作业可以以压缩附件形式或者直接贴代码提交。(压缩文件名格式:第1讲-B01-论坛ID)
       3:非本组学员作业不得交于此处,不得为抢沙发而占位,不得跟灌水帖,违者扣分。
       4:上交作业截止时间:2012年6月19日18:00。
       5:补交作业截止时间:2012年6月20日18:00。(只记考勤,不做批改)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-6-15 11:41 | 显示全部楼层
本帖最后由 sclxc 于 2012-6-15 11:47 编辑
  1. Sub zd2()
  2.     Dim d As New Dictionary
  3.     Dim i As Long
  4.     Dim arr
  5.     Range("E2:F65536").ClearContents
  6.     arr = Range("A2:B" & Range("A65536").End(xlUp).Row)
  7.     For i = 1 To UBound(arr)
  8.         If arr(i, 1) = "" Then
  9.             arr(i, 1) = arr(i - 1, 1)
  10.         End If
  11.     Next i
  12.     For i = 1 To UBound(arr)
  13.         If arr(i, 2) >= 100 And (arr(i, 2)) <= 400 Then
  14.             d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)
  15.         End If
  16.     Next i
  17.     Range("E2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Keys)
  18.     Range("F2").Resize(d.Count, 1) = Application.WorksheetFunction.Transpose(d.Items)
  19. End Sub
复制代码


复制代码
  1. Sub zd1()
  2.     Dim d As New Dictionary
  3.     Dim i As Long
  4.     Dim arr, arr1
  5.     arr = Range("A2:B" & Range("B65536").End(xlUp).Row)
  6.     arr1 = Range("E2:E" & Range("E65536").End(xlUp).Row)
  7.     Range("F2:F65536").ClearContents
  8.     For i = 1 To UBound(arr1)
  9.         If d.Exists(arr1(i, 1)) = False Then
  10.             d(arr1(i, 1)) = d.Count + 2
  11.         End If
  12.     Next i
  13.     For i = 1 To UBound(arr)
  14.         If d.Exists(arr(i, 1)) = False Then
  15.             d(arr(i, 1)) = d.Count + 2
  16.             Cells(d.Count + 1, "D") = d.Count
  17.             Cells(d.Count + 1, "E") = arr(i, 1)
  18.             Cells(d.Count + 1, "D").Font.Bold = True
  19.             Cells(d.Count + 1, "E").Font.Bold = True
  20.         End If
  21.     Next i
  22.     For i = 1 To UBound(arr)
  23.         Cells(d(arr(i, 1)), "F") = Cells(d(arr(i, 1)), "F") + arr(i, 2)
  24.     Next i
  25. End Sub
复制代码

第3讲-B14-sclxc.rar

15 KB, 下载次数: 19

点评

第一题 :获取序号与新增地区,并加黑,再循环进行的汇总数量,单元格操作;第二题:先循环取消合并单元格,再进行循环汇总,单元格操作  发表于 2012-6-20 12:25

评分

参与人数 1 +10 收起 理由
liuguansky + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-6-15 15:09 | 显示全部楼层
上交第三课作业。

第三讲-B03-蓝天一片云xls.rar

16.63 KB, 下载次数: 31

点评

整体不错,没缩进代码。第一题,先获取入数组,再进行存在判断,记录新增位置,进行整体BOLD,不错;第二题,一个循环,不错。  发表于 2012-6-20 12:28

评分

参与人数 1 +13 收起 理由
liuguansky + 13 10+2+1

查看全部评分

回复

使用道具 举报

发表于 2012-6-15 19:00 | 显示全部楼层
学委,第二题,我们纠结于到底是先全部汇总后现判断呢,还是逐行进行判断。

本题的答案是,逐行进行判断,然后汇总。

若有问题,请指正,但下次,这种容易混的题是否可以贴张结果出来,谢谢了。

第3讲-B04-chenzhi_juan.rar

17.22 KB, 下载次数: 8

点评

第一题单元格操作,效率低、考虑到了本身BOLD部分进行处理,不错;第二题 两个循环。  发表于 2012-6-20 12:32

评分

参与人数 1 +10 收起 理由
liuguansky + 10 9+1

查看全部评分

回复

使用道具 举报

发表于 2012-6-15 20:38 | 显示全部楼层

B22我不知道呀交作业!

本帖最后由 我不知道呀 于 2012-6-15 20:41 编辑

第一题代码:
Sub aa2()
    Dim d As New Dictionary
    Dim d1 As New Dictionary
    Dim i As Long, j As Long, z As Long, z1 As Long
    Dim arr()
    Dim arr1
    For j = 2 To Sheet1.Range("d65536").End(xlUp).Row
        d1(Cells(j, 5).Value) = ""
        
    Next j
       For i = 2 To Sheet1.Range("a65536").End(xlUp).Row
     d(Cells(i, 1).Value) = ""
     Next i
    For i = 2 To Sheet1.Range("a65536").End(xlUp).Row
        If d1.Exists(Cells(i, 1).Value) = False Then
            d1(Cells(i, 1).Value) = d1.Count + 1
            Cells(d1(Cells(i, 1).Value) + 1, 4) = d1(Cells(i, 1).Value)
            Cells(d1(Cells(i, 1).Value) + 1, 4).Font.Bold = True
            Cells(d1(Cells(i, 1).Value) + 1, 5) = d1.Keys(d1(Cells(i, 1).Value) - 1)
             Cells(d1(Cells(i, 1).Value) + 1, 5).Font.Bold = True
        End If
    Next i
    ReDim arr(1 To d.Count, 1 To 3)
   d.RemoveAll
    For i = 2 To Sheet1.Range("a65536").End(xlUp).Row
        If d.Exists(Cells(i, 1).Value) = False Then
            d(Cells(i, 1).Value) = d.Count + 1
            arr(d(Cells(i, 1).Value), 1) = d(Cells(i, 1).Value)
            arr(d(Cells(i, 1).Value), 2) = d.Keys(d(Cells(i, 1).Value) - 1)
            arr(d(Cells(i, 1).Value), 3) = Cells(i, 2)
        Else
            arr(d(Cells(i, 1).Value), 3) = arr(d(Cells(i, 1).Value), 3) + Cells(i, 2)
        End If
    Next i
    arr1 = Range("d2:F" & d.Count + 1)
    For z = 1 To d.Count
        For z1 = 1 To Sheet1.Range("d65536").End(xlUp).Row - 1
            If arr(z, 2) = arr1(z1, 2) Then
                arr1(z1, 3) = arr(z, 3)
            End If
        Next z1
    Next z
    Range("D2").Resize(d.Count, 3) = arr1
End Sub
------------------------------------------------------------------------------------------------------------------------------------------------------------
第二题代码:
Sub bb()
    Dim d As New Dictionary
    Dim x As Long
    Dim r As Integer
    Dim mergestr As String
    Dim MergeCot As Integer
    Dim arr()
    Dim i As Integer
    Dim j As Integer
   
    With Sheet2
        r = .Cells(.Rows.Count, 1).End(xlUp).Row
        ReDim arr(1 To r - 1, 1 To 1)
        For i = 2 To r
            mergestr = .Cells(i, 1).Value
            MergeCot = .Cells(i, 1).MergeArea.Count
            For j = 1 To MergeCot
                arr(i - 1, 1) = mergestr
                i = i + 1
            Next j
            i = i - 1
        Next i
    End With
    Sheet2.Range("E2:F1000").ClearContents
    For x = 2 To 111
        If d.Exists(arr(x - 1, 1)) = False Then
            d(arr(x - 1, 1)) = d.Count + 2
            Cells(d(arr(x - 1, 1)), 5) = arr(x - 1, 1)
            If Sheet2.Cells(x, 2) >= 100 And Sheet2.Cells(x, 2) <= 400 Then Sheet2.Cells(d(arr(x - 1, 1)), 6) = Sheet2.Cells(x, 2)
        Else
            If Sheet2.Cells(x, 2) >= 100 And Sheet2.Cells(x, 2) <= 400 Then
                Sheet2.Cells(d(arr(x - 1, 1)), 6) = Sheet2.Cells(d(arr(x - 1, 1)), 6) + Sheet2.Cells(x, 2)
            End If
        End If
    Next x
End Sub


点评

代码请放在代码框中,第一题,用两个字典分别装地区再进行比较,思路略显复杂;第二题,对合并单元格操作的思路不够好,效率太低了。  发表于 2012-6-20 12:35

评分

参与人数 1 +8 收起 理由
liuguansky + 8

查看全部评分

回复

使用道具 举报

发表于 2012-6-15 22:02 | 显示全部楼层
B:21小志上交作业。
谢谢批改,辛苦了。。

第三讲-B21-小志.rar

14.55 KB, 下载次数: 7

点评

第一题,BOLD直接目测填充,先循环获取存在地区,再进行数据源循环判断,。多次重复,思路不够简练 第二题,两个循环。  发表于 2012-6-20 12:40

评分

参与人数 1 +9 收起 理由
liuguansky + 9 中文变量感觉蛮奇怪的。

查看全部评分

回复

使用道具 举报

发表于 2012-6-16 02:33 | 显示全部楼层
本帖最后由 fjmxwrs 于 2012-6-20 13:36 编辑

第3讲-B06-fjmxwrs.rar (19.3 KB, 下载次数: 7)

点评

第一题,新增地区的定位出错,单元格操作,先获取已有地区字典,再进行比对,数据源一个循环; 第二题,合并单元格的处理依然是单元格思维,一个循环  发表于 2012-6-20 12:46

评分

参与人数 1 +8 收起 理由
liuguansky + 8 3+5

查看全部评分

回复

使用道具 举报

发表于 2012-6-16 09:29 | 显示全部楼层
本帖最后由 从从容容 于 2012-6-16 09:37 编辑
  1. Sub 第一题()
  2. Dim d1 As New Dictionary
  3. Dim d2 As New Dictionary
  4. Dim d3 As New Dictionary
  5. Dim x, i As Integer
  6. Dim arr, arr1
  7. With Sheets("题1")
  8. arr = .Range("A2:B" & .Range("A65536").End(3).Row)
  9. arr1 = .Range("E2:E" & Range("e65536").End(3).Row)
  10. For x = 1 To UBound(arr1)
  11. For i = 1 To UBound(arr)
  12.       If arr1(x, 1) = arr(i, 1) Then
  13.           d1(arr1(x, 1)) = d1(arr1(x, 1)) + arr(i, 2)
  14.        End If
  15. Next i
  16. Next x
  17. .[f2].Resize(d1.Count) = Application.Transpose(d1.Items)
  18. For x = 1 To UBound(arr)
  19.      If d1.Exists(arr(x, 1)) = False Then
  20.             d2(arr(x, 1)) = d2(arr(x, 1)) + arr(x, 2)
  21.       End If
  22.      If d3.Exists(arr(x, 1)) = False Then
  23.            d3(arr(x, 1)) = d3.Count + d1.Count + 1
  24.     End If
  25. Next x
  26. .Range("D" & .[d65536].End(3).Row).Offset(1).Resize(d2.Count) = Application.Transpose(d3.Items)
  27. .Range("E" & .[E65536].End(3).Row).Offset(1).Resize(d2.Count) = Application.Transpose(d2.Keys)
  28. .Range("F" & .[F65536].End(3).Row).Offset(1).Resize(d2.Count) = Application.Transpose(d2.Items)
  29. .Range(Cells(d1.Count + 2, 4), Cells(d2.Count + d1.Count + 1, 6)).Font.Bold = True
  30. End With
  31. End Sub
复制代码
  1. Sub 第二题()
  2. Dim d As New Dictionary
  3. Dim x, i As Integer
  4. Dim arr
  5. arr = Range("A2:B" & Range("A65536").End(3).Row)
  6. For x = 1 To UBound(arr)
  7.       If arr(x, 1) = "" Then
  8.           arr(x, 1) = arr(x - 1, 1)
  9.        End If
  10. Next x
  11. For i = 1 To UBound(arr)
  12.     If arr(i, 2) >= Range("C2") And arr(i, 2) <= Range("D2") Then
  13.           d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)
  14.     End If
  15. Next i
  16. Range("e2").Resize(d.Count, 1) = Application.Transpose(d.Keys)
  17. Range("f2").Resize(d.Count, 1) = Application.Transpose(d.Items)
  18. End Sub
复制代码

第3讲-B11-从从容容D.zip (18.58 KB, 下载次数: 6)

点评

第一题,三个字典[字典不要钱吗?_^_],多次循环[循环不要钱吗?]哈哈。希望可以简化思想;第二题,两个循环,一个循环处理合并单元格,一个循环汇总。  发表于 2012-6-20 12:48

评分

参与人数 1 +9 收起 理由
liuguansky + 9

查看全部评分

回复

使用道具 举报

发表于 2012-6-16 19:55 | 显示全部楼层
第3讲-B01-无正.rar (14.43 KB, 下载次数: 14)

点评

第一题效果实现的很好,单元格操作;第二题,多次循环。[很喜欢D.KEYS(I),D.ITEMS(I)这样的写法啊!]  发表于 2012-6-20 12:51

评分

参与人数 1 +10 收起 理由
liuguansky + 10

查看全部评分

回复

使用道具 举报

发表于 2012-6-17 09:17 | 显示全部楼层
  1. Sub 题1()
  2.     Dim i As Long, j As Long, k As Long
  3.     Dim arr         '存放A、B列原始数据数组
  4.     Dim arr_Y       '存放E列固定省份数组
  5.     Dim d
  6.     Set d = CreateObject("scripting.dictionary")
  7.     arr = Range("A2:B" & [B65536].End(xlUp).Row)
  8.     arr_Y = Range("E2:E9")
  9.    
  10.     For i = 1 To UBound(arr_Y)  '为不改变序号1-8行数据,先将固定省份装入字典,项值为0
  11.         d(arr_Y(i, 1)) = 0
  12.     Next
  13.     For j = 1 To UBound(arr)
  14.         d(arr(j, 1)) = d(arr(j, 1)) + arr(j, 2)
  15.     Next
  16.    
  17.     Range("D10:E65536") = ""
  18.     Range("F2:F65536") = ""
  19.     Range("D10:E65536").Font.Bold = False
  20.     Range("E2").Resize(d.Count) = Application.Transpose(d.keys)
  21.     Range("F2").Resize(d.Count) = Application.Transpose(d.Items)
  22.    
  23.     If d.Count > 8 Then
  24.         For k = 9 To d.Count
  25.             Cells(k + 1, "D") = k               '新增序号
  26.         Next
  27.         Range("D10:E" & k).Font.Bold = True    '新增序号、地区加粗显示
  28.     End If
  29.     Set d = Nothing
  30. End Sub
复制代码
  1. Sub 题2()
  2.     Dim i As Long
  3.     Dim arr
  4.     Dim d
  5.     Set d = CreateObject("scripting.dictionary")
  6.     arr = Range("A2:B" & [B65536].End(xlUp).Row)
  7.    
  8.     For i = 1 To UBound(arr)
  9.         If arr(i, 1) = "" Then                      '补充因合并单元格造成的地区空值
  10.             arr(i, 1) = arr(i - 1, 1)
  11.         End If
  12.         If arr(i, 2) < 100 Or arr(i, 2) > 400 Then  '除去小于100或大于400的值
  13.             arr(i, 2) = 0
  14.         End If
  15.         d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)
  16.     Next
  17.    
  18.     Range("E2:F65536") = ""
  19.     Range("E2").Resize(d.Count) = Application.Transpose(d.keys)
  20.     Range("F2").Resize(d.Count) = Application.Transpose(d.Items)
  21. End Sub
复制代码

第3讲-B17-hainancar.zip

16.45 KB, 下载次数: 17

点评

第一题,目测BOLD位置,先赋值字典,再循环判断,最后直接循环处理了序列,比较聪明;第二题一个循环,不错。  发表于 2012-6-20 12:54

评分

参与人数 1 +9 收起 理由
liuguansky + 9 4+5

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 05:58 , Processed in 0.721449 second(s), 24 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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