Excel精英培训网

 找回密码
 注册
查看: 2828|回复: 8

[通知] 【VBA字典数组201301班】C 组 第四讲作业上交贴

[复制链接]
发表于 2013-11-23 08:57 | 显示全部楼层 |阅读模式
本帖最后由 无聊的疯子 于 2013-11-28 11:59 编辑

本贴为【VBA字典数组201301班】C组 第四讲作业 上交专用,其它学员勿入

作业要求:
1.要求使用字典完成
2.所有的代码均写在按钮指定的过程中(过程名称以作业题名称方式命名)
3.要求代码缩进
4.要求有注释(关键代码处)
5.要求强制声明

3-5要求一共占6分,每点2分,6道题最多扣6分

作业上交:
1.直接上交代码即可
2.上交时间:2013-11-27  20:00(原则上未评作业或未开贴前上交即视为在有效内)
3.上交代码时请使用添加代码文字的方式上交
4.代码不要分过程添加,直接一次添加,方便复制

添加代码文字的方法:
[code]     
这里放代码
[=/code]

使用时,请不要输入 / 前面的 =


excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-11-23 10:15 | 显示全部楼层
本帖最后由 雪舞子 于 2013-11-23 12:30 编辑

c06:雪舞子
  1. Sub 作业一()
  2.     Dim dic As Object, arr, brr(), crr()                                 '定义变量,arr源数组/brr结果数组/crr源数据1~8列数组
  3.     Dim i%, j%, m%, n%, cr$, ma$, sth
  4.    
  5.     Set dic = CreateObject("scripting.dictionary")
  6.     arr = Sheets("源数据一").[a1].CurrentRegion                          '源数据送进arr
  7.     ReDim crr(1 To UBound(arr))                                          '重新定义过渡数组
  8.    
  9.         For i = 1 To UBound(arr)
  10.             For j = 1 To 8
  11.                 crr(i) = crr(i) & "-" & arr(i, j)                        '源数据1~8列建立一列多行数组,也是字典唯一值标准
  12.             Next
  13.         
  14.             If dic.exists(crr(i)) Then                                   '如果字典存在此key值
  15.             
  16.                 m = dic(crr(i))                                          '取出item值,即行数
  17.                 brr(10, m) = brr(10, m) + arr(i, 10)                     '"不良数量"累加
  18.                 brr(9, m) = brr(9, m) & " " & arr(i, 9)                  '"不良位置"累计
  19.                 brr(12, m) = arr(i, 12)                                  '标注"产量"
  20.             
  21.             Else                                                          '无此key值
  22.             
  23.                 n = n + 1                                                 '条目累加
  24.                 dic(crr(i)) = n                                           '存入条目
  25.                 ReDim Preserve brr(1 To UBound(arr, 2), 1 To n)           '定义结果数组
  26.                
  27.                 For j = 1 To UBound(arr, 2) - 1
  28.                     brr(j, n) = arr(i, j)                                 '除最后一列将源值摆放到结果数组
  29.                 Next
  30.                     
  31.             
  32.             End If
  33.         
  34.         Next
  35.         brr(12, 1) = arr(1, 12)                                            '补充最后标题单元格
  36.         
  37.     ma = "第一题答案-" & Format(Time(), "hhmm")                            '建立工作表名
  38.     For Each sth In Sheets
  39.         If sth.Name Like "第一题答案*" Then GoTo 100                       '工作表中存在"答案"工作表直接将其改名
  40.     Next
  41.     Set sth = Sheets.Add
  42.         sth.Move after:=Sheets("效果一")                                   '不存在"答案"工作表则创建新工作表
  43. 100:
  44.         sth.Name = ma
  45.     Sheets(ma).[a1].CurrentRegion.ClearContents
  46.     Sheets(ma).[a1].Resize(n, UBound(arr, 2)) = Application.Transpose(brr) '输出结果并更改工作名为运行时间
  47.     Sheets(ma).Activate

  48. End Sub


  49. Sub 作业二()
  50. Dim dic As Object, arr1, arr2(), brr1, brr2(), crr(), i&, j%, n&
  51. Set dic = CreateObject("scripting.dictionary")

  52. arr1 = Sheets("作业二").Range("a2", Cells(Rows.Count, "f").End(xlUp))    'A数组
  53. brr1 = Sheets("作业二").Range("h2", Cells(Rows.Count, "m").End(xlUp))    'B数组
  54. ReDim arr2(1 To UBound(arr1))                                            'A数组行连接过渡数组
  55. ReDim brr2(1 To UBound(brr1))                                            'B数组行连接过渡数组
  56.     For i = 1 To UBound(arr1)
  57.         For j = 1 To 6
  58.             arr2(i) = arr2(i) & "-" & arr1(i, j)                         'A数组行连接成一个字符串形成新的数组
  59.         Next
  60.         dic(arr2(i)) = ""                                                '加入字典并过滤唯一性
  61.     Next
  62.     For i = 1 To UBound(brr1)
  63.         For j = 1 To 6
  64.             brr2(i) = brr2(i) & "-" & brr1(i, j)                          'B数组行连接成一个字符串形成新的数组
  65.         Next
  66.         
  67.         If dic.exists(brr2(i)) Then                                       '此行去字典比较有否相同行
  68.             n = n + 1
  69.             ReDim Preserve crr(1 To 6, 1 To n)                            '有结果数组增加一行
  70.             For j = 1 To 6
  71.                 crr(j, n) = brr1(i, j)                                    '并将B数组相应行列装进结果数组
  72.             Next
  73.         End If
  74.         
  75.     Next


  76. Sheets("作业二").[o2].CurrentRegion.ClearContents
  77. Sheets("作业二").[o2].Resize(n, 6) = Application.Transpose(crr)            '输出结果

  78. End Sub

  79. Sub 作业三()
  80. Dim dic As Object, arr1, arr2(), brr(), i&, j%, n&, m&
  81. Set dic = CreateObject("scripting.dictionary")

  82. arr1 = Sheets("作业三").Range("a2", Cells(Rows.Count, "c").End(xlUp))  '源数据装数组arr1
  83. ReDim arr2(1 To UBound(arr1))                                          '定义源数据过渡数组
  84.     For i = 1 To UBound(arr1)
  85.         If arr1(i, 1) = "湖北" Then                                     '只对"湖北"操作
  86.         m = m + 1                                                       '"湖北"行累加
  87.             For j = 1 To 3
  88.                arr2(m) = arr2(m) & "-" & arr1(i, j)                     '行连接进数组arr2
  89.             Next
  90.         
  91.         If Not dic.exists(arr2(m)) Then                                 '字典中没有该行则
  92.             n = n + 1                                                   '累加
  93.             ReDim Preserve brr(1 To 3, 1 To n)                          '结果数组增加重定义
  94.             For j = 1 To 3
  95.                 brr(j, n) = arr1(i, j)                                  '源数据的相应数据进结果数组
  96.             Next
  97.         End If
  98.         dic(arr2(m)) = ""                                                '装字典
  99.         End If
  100.     Next
  101.    
  102. Sheets("作业三").[e2.g12].ClearContents
  103. Sheets("作业三").[e2].Resize(n, 3) = Application.Transpose(brr)          '输出结果

  104. Application.DeleteCustomList Application.CustomListCount                                        '自定义排序
  105. Application.AddCustomList ListArray:=Array("武汉", "襄阳", "荆州")                              '排序关键字
  106. Range("e1:g10").Sort key1:=[f1], Header:=xlYes, ordercustom:=Application.CustomListCount + 1
  107.     'Range("e1:g10")区域,以关键字在F列去首行排序

  108. End Sub

复制代码

点评

自定义序列在别的电脑上会报错,只要对市进行排序就行了  发表于 2013-11-28 10:37

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确,

查看全部评分

回复

使用道具 举报

发表于 2013-11-23 10:49 | 显示全部楼层
本帖最后由 xdragon 于 2013-11-23 12:22 编辑
  1. Sub 作业三()
  2.   Dim arr(), i As Integer, brr(), cnt As Integer
  3.   arr = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
  4.   With CreateObject("scripting.dictionary")
  5.   For i = 1 To UBound(arr) '将A列中是湖北的行数据合并放入字典key
  6.     If arr(i, 1) = "湖北" Then
  7.       If Not .exists(arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3)) Then
  8.         cnt = cnt + 1
  9.         .Item(arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3)) = cnt '将每个key标记从1开始的索引号
  10.         ReDim Preserve brr(1 To 3, 1 To cnt) '根据索引号扩大brr数组,存放新的key索引号对应的arr中的值
  11.         brr(1, cnt) = arr(i, 1)
  12.         brr(2, cnt) = arr(i, 2)
  13.         brr(3, cnt) = arr(i, 3)
  14.       End If
  15.     End If
  16.   Next
  17.   End With
  18.   Range("E2:G" & Cells(Rows.Count, "E").End(xlUp).Row).ClearContents
  19.   Range("E2").Resize(UBound(brr, 2), UBound(brr)) = Application.Transpose(brr)
  20. End Sub


  21. Sub 作业二()
  22.   Dim arr(), brr(), crr(), i&, j As Byte, cnt&, s$, t
  23.   t = Timer
  24.   arr = Range("A2:F" & Cells(Rows.Count, "A").End(xlUp).Row).Value
  25.   With CreateObject("scripting.dictionary")
  26.     For i = 1 To UBound(arr) '将行数据合并后存入字典key
  27.       s = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 5) & "|" & arr(i, 6)
  28.       If Not .exists(s) Then .Item(s) = ""
  29.     Next
  30.     brr = Range("H2:M" & Cells(Rows.Count, "H").End(xlUp).Row).Value
  31.     ReDim crr(1 To IIf(UBound(arr) > UBound(brr), UBound(arr), UBound(brr)), 1 To 6) '定义存放结果的数据大小为arr和brr上限的最大值
  32.     Erase arr
  33.     For i = 1 To UBound(brr)
  34.       s = brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 3) & "|" & brr(i, 4) & "|" & brr(i, 5) & "|" & brr(i, 6)
  35.       If .exists(s) Then '将brr中整行的数据合并后在字典中查找,如果存在,则将对应的brr整行数据存入crr数组
  36.         cnt = cnt + 1
  37.         For j = 1 To 6
  38.           crr(cnt, j) = brr(i, j)
  39.         Next
  40.       End If
  41.     Next
  42.   End With
  43.   Range("O2:T" & Cells(Rows.Count, "O").End(xlUp).Row).ClearContents
  44.   Range("O2").Resize(cnt, 6) = crr '导出结果到单元格
  45.   MsgBox "完成计算,共使用 " & Timer - t & " 秒"
  46. End Sub


  47. Sub 作业一()
  48.   Application.ScreenUpdating = False
  49.   Dim arr(), brr(), d As Object, i&, j As Byte, str$, cnt&
  50.   
  51.   i = Sheets("源数据一").Cells(Rows.Count, 1).End(xlUp).Row
  52.   arr = Sheets("源数据一").Range("A2:L" & i).Value
  53.   Set d = CreateObject("scripting.dictionary")
  54.   
  55.   For i = 1 To UBound(arr)
  56.     str = ""
  57.     For j = 1 To 8
  58.       str = str & "|" & arr(i, j) '将每行1-8列数据合并
  59.     Next
  60.    
  61.     If Not d.exists(str) Then '字典中如果不存在这个合并值则添加此key,并添加索引值
  62.       cnt = cnt + 1
  63.       d(str) = cnt
  64.       ReDim Preserve brr(1 To 12, 1 To cnt)
  65.       brr(9, cnt) = arr(i, 9)
  66.       If arr(i, 8) = "假焊" Then brr(12, cnt) = arr(i, 12) '若出现假焊的,取此行产量的值
  67.     Else
  68.       brr(9, d(str)) = brr(9, d(str)) & " " & arr(i, 9) '将第九列数字连接
  69.     End If
  70.     For j = 1 To 8
  71.       brr(j, d(str)) = arr(i, j)
  72.     Next
  73.     brr(10, d(str)) = brr(10, d(str)) + arr(i, 10)
  74.     brr(11, d(str)) = arr(i, 11)
  75.     'brr(12, d(str)) = brr(12, d(str)) + arr(i, 12)  '汇总项
  76.   Next
  77.   
  78.   On Error GoTo MsgAlert '如果遇到同一时间导出报表的,提示错误
  79.   Worksheets.Add '
  80.   ActiveSheet.Name = "第一题答案-" & Format(Time, "hhmm") '添加新的工作表并修改工作表名
  81.   Range("A2").Resize(cnt, 12) = Application.Transpose(brr) '导出数据区域到单元格
  82.   arr = Sheets("源数据一").Range("A1:L1").Value
  83.   Range("A1:L1") = arr
  84.   
  85.   With Range("A1").CurrentRegion '设置导出区域的字体,列宽,边框及标题行背景颜色
  86.     .Columns.AutoFit
  87.     .Font.Size = 9
  88.     .Borders.LineStyle = 1
  89.     .Resize(1, 12).Interior.Color = vbCyan
  90.   End With
  91.   Application.ScreenUpdating = True
  92.   Exit Sub
  93.   
  94. MsgAlert: '提示错误
  95.   Application.DisplayAlerts = False
  96.   ActiveSheet.Delete
  97.   MsgBox "您的计算过于频繁,请于1分钟后再次尝试", vbInformation + vbOKOnly, "提示"
  98.   Application.DisplayAlerts = True
  99.   Application.ScreenUpdating = True
  100. End Sub
复制代码
三级下拉菜单。。。
  1. Option Explicit

  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     If Target.Column = 5 Then Target(1).Offset(0, 1).Resize(1, 2) = "" '如果E列的值更改,则清空对应的F和G列的值
  4.     If Target.Column = 6 Then Target(1).Offset(0, 1) = "" '如果F列的值更改,则清空对应G列的值
  5. End Sub
  6. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  7.     Dim Dic, cell As Range, rngs As Range
  8.     On Error Resume Next
  9.     Set Dic = CreateObject("Scripting.Dictionary")
  10.     Set rngs = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
  11.     Select Case Target(1).Column
  12.     Case 5 '在E列添加数据有效性,把A列存入字典key,然后在数据有效性序列中根据keys生成序列
  13.         For Each cell In rngs
  14.             Dic(cell.Text) = ""
  15.         Next cell
  16.         With Target(1).Validation '设置数据有效性
  17.             .Delete '删除目标单元格原数据有效性
  18.             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Join(Dic.keys, ",") '添加序列,将keys合并,以“,”分隔
  19.             .InCellDropdown = True '有下拉菜单
  20.         End With
  21.     Case 6 '在F列添加数据有效性,把目标单元格所在行的E列单元格与A列中的值比较,若一致,则将其A列中对应的B列的值存入字典key
  22.         For Each cell In rngs
  23.             If cell = Target(1).Offset(0, -1) Then
  24.                 Dic(cell.Offset(0, 1).Text) = ""
  25.             End If
  26.         Next cell
  27.         With Target(1).Validation
  28.             .Delete
  29.             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Join(Dic.keys, ",")
  30.             .InCellDropdown = True
  31.         End With
  32.     Case 7
  33.         For Each cell In rngs '在G列添加数据有效性,将所有目标单元格所在行的E列=A列,并且F列=B列的值,对应的C列的值存入字典key
  34.             If cell = Target(1).Offset(0, -2) And cell.Offset(0, 1) = Target(1).Offset(0, -1) Then
  35.                 Dic(cell.Offset(0, 2).Text) = ""
  36.             End If
  37.         Next cell
  38.         With Target(1).Validation
  39.             .Delete
  40.             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Join(Dic.keys, ",")
  41.             .InCellDropdown = True
  42.         End With
  43.     End Select
  44.     Dic.RemoveAll
  45. End Sub
复制代码

点评

第三题市未排序所扣分数由附加题补上,附加题中可以用公用过程来减少重复写代码  发表于 2013-11-28 10:43

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-23 10:59 | 显示全部楼层
本帖最后由 hrpotter 于 2013-11-23 11:21 编辑

C03:hrpotter
  1. Option Explicit
  2. Sub 作业1()
  3.     Dim arr, brr(1 To 10000, 1 To 12), d
  4.     Dim i As Long, j As Long, k As Long, n As Long, s As String
  5.     Set d = CreateObject("scripting.dictionary")
  6.     arr = Sheet1.Range("a1").CurrentRegion
  7.     For i = 2 To UBound(arr)
  8.         s = arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4) & arr(i, 5) & arr(i, 6) & arr(i, 7) & arr(i, 8)
  9.         '将数组中前八项连接起来作为关键字
  10.         If d.exists(s) Then    '如果该关键字已存在
  11.             j = d(s)      '取出该关键字在结果数组中的位置
  12.             brr(j, 10) = brr(j, 10) + arr(i, 10)    '不良数量累加
  13.             brr(j, 9) = brr(j, 9) & " " & arr(i, 9)    '不良位置用空格连接
  14.             brr(j, 12) = arr(i, 12)
  15.         Else              '如果不存在
  16.             k = k + 1     '计数累加
  17.             d(s) = k      '添加该关键字进字典,item为结果数组中的行位置
  18.             For n = 1 To 11
  19.                 brr(k, n) = arr(i, n)    '循环添加数据
  20.             Next
  21.         End If
  22.     Next
  23.     Range("a1:f100").ClearContents
  24.     Range("a1").Resize(1, 12) = Sheet1.Range("a1:l1").Value    '添加标题
  25.     Range("a2").Resize(k, 12) = brr    '写入结果
  26.     Sheet5.Name = "第一题答案-" & Format(Time, "hhmm")
  27. End Sub
  28. Sub 作业2()
  29.     Dim arr, brr, crr(1 To 10000, 1 To 6), d
  30.     Dim i As Long, j As Long, k As Long, s As String
  31.     Set d = CreateObject("scripting.dictionary")
  32.     arr = Range("a1").CurrentRegion    '将A组数据放入数组
  33.     brr = Range("h1").CurrentRegion    '将B组数据放入数组
  34.     For i = 2 To UBound(arr)
  35.         s = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 5) & "|" & arr(i, 6)
  36.         '将六个数字用"|"连接放入s字符串作为关键字
  37.         d(s) = ""    '添加关键字进字典
  38.     Next
  39.     For i = 2 To UBound(brr)
  40.         s = brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 3) & "|" & brr(i, 4) & "|" & brr(i, 5) & "|" & brr(i, 6)
  41.         If d.exists(s) Then    '如果存在,表示该行数据为AB两组中完全相同的数据
  42.             k = k + 1    '结果数组行位置计数累加
  43.             For j = 1 To 6
  44.                 crr(k, j) = brr(i, j)    '循环添加数据
  45.             Next
  46.         End If
  47.     Next
  48.     Range("o2:t1000").ClearContents
  49.     Range("o2").Resize(k, 6) = crr    '写入结果
  50. End Sub
  51. Sub 作业3()
  52.     Dim arr, brr, crr, drr(1 To 100, 1 To 3), d
  53.     Dim i As Long, j As Long, k As Long, s As String
  54.     Set d = CreateObject("scripting.dictionary")
  55.     arr = Range("a1").CurrentRegion
  56.     For i = 2 To UBound(arr)
  57.         s = arr(i, 1) & "|" & arr(i, 2)    '连接省市,作为关键字
  58.         If arr(i, 3) <> "" Then    '如果县区不为空,则加入字典
  59.             If Not d.exists(s) Then    '如果字典中不存在
  60.                 d(s) = arr(i, 3)    '添加入字典,item直接等于县区
  61.             Else
  62.                 If InStr(d(s), arr(i, 3)) = 0 Then    '如果字典中存在,并且item没有重复
  63.                     d(s) = d(s) & "|" & arr(i, 3)  'item用"|"连接
  64.                 End If
  65.             End If
  66.         End If
  67.     Next
  68.     brr = d.keys  '将keys导入数组,方便操作
  69.     crr = d.items    '将items导入数组
  70.     For i = 0 To UBound(brr)    '循环keys
  71.         arr = Split(crr(i), "|")    '将刚才合并的县区拆分
  72.         For j = 0 To UBound(arr)    '循环相同省市下不同的县区,形成结果数组
  73.             k = k + 1
  74.             drr(k, 1) = Split(brr(i), "|")(0)    '将省市拆分开,放入结果数组
  75.             drr(k, 2) = Split(brr(i), "|")(1)
  76.             drr(k, 3) = arr(j)
  77.         Next
  78.     Next
  79.     Range("e2:g100").ClearContents
  80.     Range("e2").Resize(k, 3) = drr    '写入结果
  81. End Sub
复制代码

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-23 15:31 | 显示全部楼层

  1. Sub test1()       '作业1代码
  2. Dim t
  3. t = Timer
  4. Dim arr, arr1(1 To 10000, 1 To 12), arr2 'arr用于存放源数据,ARR1用于存放输出数据
  5. Dim d1 As New Dictionary     '引用字典,新建字典,item用于存放输出数组行号



  6. Dim i%, j%, k%, n%, m%
  7. Dim sr1$, sr2$

  8. i = Sheets("源数据一").Range("a65536").End(xlUp).Row


  9. arr = Sheets("源数据一").Range("a1:l" & i) '源数据赋值给数组
  10. arr2 = Sheets("源数据一").Range("a1:l1") '源数据赋值给数组

  11. For j = 2 To i  '对数组进行循环,关键字为1-8列数据,
  12.    
  13.     sr1 = arr(j, 1) & arr(j, 2) & arr(j, 3) & arr(j, 4) & arr(j, 5) & arr(j, 6) & arr(j, 7) & arr(j, 8)
  14.      If d1.Exists(sr1) Then     '如果字典有此关键字,则对不良数量累加,不良位置增加记录
  15.         k = d1(sr1)
  16.         arr1(k, 9) = arr1(k, 9) & " " & arr(j, 9)
  17.         arr1(k, 10) = arr1(k, 10) + arr(j, 10)
  18.       
  19.         k = 0
  20.    
  21.     Else                    '如果字典无此关键字,刚将关键字赋值给字典D1的KEY,将原数据赋值给数组ARR1
  22.         n = n + 1
  23.         d1(sr1) = n
  24.         For m = 1 To 12
  25.          arr1(n, m) = arr(j, m)
  26.           If Right(sr1, 2) = "连锡" Then arr1(n, 12) = ""   '根据分析,每个生产班组都有假焊和连锡,对于连锡的就不重复统计产量,呵呵,这里偷懒了
  27.         Next m
  28.    
  29.     End If
  30.    
  31. Next j
  32.    

  33.     Sheets("作业一").Range("a2").Resize(d1.Count, 12) = arr1    '输出数据
  34.      Sheets("作业一").Range("a1").Resize(1, 12) = arr2      '输出表头


  35. MsgBox Timer - t    '显示时间

  36. End Sub

  37. Sub test2()   '作业2代码
  38. Dim arr1, arr2, arr3(1 To 10000, 1 To 6)
  39. Dim d1 As New Dictionary
  40. Dim d2 As New Dictionary
  41. Dim sr1$, sr2$, n%, i As Long, k%, j As Long

  42. i = Range("a65536").End(xlUp).Row
  43. arr1 = Range("a2:f" & i)
  44. arr2 = Range("h2:m" & i)
  45.         For j = 1 To i - 1          '将数据A以1-6列合并赋值给字典D1关键字
  46.            For k = 1 To 6
  47.            sr1 = sr1 & arr1(j, k)
  48.             Next k
  49.            d1(sr1) = ""
  50.             sr1 = ""
  51.             Next j

  52.         For j = 1 To i - 1              '循环将数据B的1-6列作关键字在字典D1中查找,如果字典D1有此关键字则将该数据赋值给数组ARR3
  53.             sr2 = arr2(j, 1) & arr2(j, 2) & arr2(j, 3) & arr2(j, 4) & arr2(j, 5) & arr2(j, 6)
  54.             If d1.Exists(sr2) Then
  55.                 n = n + 1
  56.                 arr3(n, 1) = arr2(j, 1)
  57.                 arr3(n, 2) = arr2(j, 2)
  58.                 arr3(n, 3) = arr2(j, 3)
  59.                 arr3(n, 4) = arr2(j, 4)
  60.                 arr3(n, 5) = arr2(j, 5)
  61.                 arr3(n, 6) = arr2(j, 6)
  62.             End If
  63.         Next
  64.          
  65.    
  66.     Range("o2").Resize(UBound(arr3), 6) = arr3  '输出数据

  67. End Sub

  68. Sub test3()     '作业3代码
  69. Dim arr1, arr2(1 To 1000, 1 To 3)
  70. Dim d1 As New Dictionary
  71. Dim d2 As New Dictionary
  72. Dim i%, k, k1, n%

  73. arr1 = Range("a2:c" & Range("a65535").End(xlUp).Row)    '数据源写入数组
  74.     For i = 1 To UBound(arr1)
  75.      If arr1(i, 3) <> "" Then               '循环,如果第三列不为空则将第三列数据作为关键字,第二列对应值作为ITEM写入字典D1,
  76.      d1(arr1(i, 3)) = arr1(i, 2)
  77.      d2(arr1(i, 2)) = arr1(i, 1)            '在前提条件下,将第二列数据作为关键字,第一列作为ITEM写入字典D2
  78.      End If
  79.      Next
  80.    
  81.   
  82.      
  83.         For k = 1 To d2.Count           '对字典D2循环
  84.             For Each k1 In d1           '针对字典D2对每个字典D1循环
  85.          
  86.                  If d1(k1) = d2.Keys(k - 1) Then        '如果字典D1的ITEM等于循环条件下的字典D2的关键字,将第三列唯一值的对应的第二列数据及第一列数据放入数组中
  87.                     n = n + 1
  88.                     arr2(n, 3) = k1
  89.                     arr2(n, 2) = d1(k1)
  90.                     arr2(n, 1) = d2(d1(k1))
  91.                 End If
  92.              Next

  93.         Next

  94.     Range("e2").Resize(d1.Count, 3) = arr2  '输出
  95. End Sub
复制代码

点评

123题代码缩进都有点问题,扣1分  发表于 2013-11-28 11:28
作业2结果不正确扣掉2分,主要是在连接时未使用符号对数据进行分隔导致  发表于 2013-11-28 11:09
作业1未将结果放到新建工作表扣2分  发表于 2013-11-28 11:05

评分

参与人数 1金币 +15 收起 理由
无聊的疯子 + 15 作业1扣2分,作业2扣2分,缩进问题扣1分

查看全部评分

回复

使用道具 举报

发表于 2013-11-23 23:05 | 显示全部楼层
本帖最后由 sayloveyou2010 于 2013-11-24 21:49 编辑

C01:sayloveyou2010 小妮子

  1. Sub 作业一()
  2.     Dim dic As New Dictionary, arr(), x%, y%
  3.     With Sheets("源数据一")
  4.         Myrow = .Cells(Rows.Count, 1).End(xlUp).Row
  5.         arr = .Range("A2:L" & Myrow).Value
  6.         ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  7.         For x = 1 To UBound(arr)
  8.             m = arr(x, 1) & vbTab & arr(x, 2) & vbTab & arr(x, 3) & vbTab & arr(x, 4) & vbTab & arr(x, 5) & vbTab & arr(x, 6) & vbTab & arr(x, 7) & vbTab & arr(x, 8) '连接条件
  9.             If Not dic.Exists(m) Then '判断是否存在
  10.                 n = n + 1
  11.                 dic.Add m, n '添加字典
  12.                 For y = 1 To UBound(brr, 2) - 4 '循环条件列
  13.                     brr(n, y) = arr(x, y) '装入结果数组
  14.                 Next y
  15.                 For y = 9 To 12 '循环结果列
  16.                     brr(n, y) = arr(x, y)
  17.                 Next y
  18.                 If brr(n, 9) = "IC" Then brr(n, 12) = "" 'IC产量为空
  19.             Else
  20.                 brr(dic(m), 9) = brr(dic(m), 9) & " " & arr(x, 9) '连接不良位置
  21.                 brr(dic(m), 10) = brr(dic(m), 10) + arr(x, 10) '不良数量
  22.                 brr(dic(m), 11) = arr(x, 11) '产量
  23.             End If
  24.         Next x
  25.     End With
  26.     Set sh = Sheets.Add(before:=Sheets("作业一"))
  27.     With sh
  28.         .Range("A1:L1") = Array("生产日期", "编号", "周期", "月份", "产品型号", "生产线", "班组", "不良类型", "不良位置", "不良数量", "备注", "产量")
  29.         .Range("A1:A" & dic.Count + 1).NumberFormatLocal = "yyyy-m-d"
  30.         .Range("A2").Resize(UBound(brr), 12) = brr '读出
  31.         .Cells.EntireColumn.AutoFit
  32.         .Name = "第一题答案_" & Format(Now(), "hhmm")
  33.     End With
  34. End Sub
  35. '==================================================================================================
  36. Sub 作业二()
  37.     Dim arr(), brr(), dic As New Dictionary, x&, y%, mm, nn
  38.     arr = Range("A2:M" & Cells(Rows.Count, 1).End(xlUp).Row)
  39.     ReDim brr(1 To UBound(arr), 1 To 6)
  40.     For x = 1 To UBound(arr)
  41.         mm = arr(x, 1) & vbTab & arr(x, 2) & vbTab & arr(x, 3) & vbTab & arr(x, 4) & vbTab & arr(x, 5) & vbTab & arr(x, 6) '连接
  42.         If Not dic.Exists(mm) Then '判断是否存在,如果不存在
  43.             dic.Add mm, "" '添加字典
  44.         End If
  45.     Next x
  46.     For x = 1 To UBound(arr)
  47.         nn = arr(x, 8) & vbTab & arr(x, 9) & vbTab & arr(x, 10) & vbTab & arr(x, 11) & vbTab & arr(x, 12) & vbTab & arr(x, 13) '连接
  48.         If dic.Exists(nn) Then '在B里查找A如果查找到
  49.             k = k + 1 '计数器
  50.             For y = 1 To UBound(brr, 2) '循环列
  51.                 brr(k, y) = Split(nn, vbTab)(y - 1) '分列结果装入结果数组
  52.             Next y
  53.         End If
  54.     Next x
  55.     Range("O2").Resize(2, 6) = brr '读出
  56.     End Sub
  57. '===============================================================================================
  58. Sub 作业三()
  59.     Dim dic As New Dictionary, arr(), x%, mm
  60.     arr = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row)
  61.     ReDim brr(1 To UBound(arr), 1 To 3)
  62.     For x = 1 To UBound(arr)
  63.         mm = arr(x, 1) & vbTab & arr(x, 2) & vbTab & arr(x, 3) '连接
  64.         If Not dic.Exists(mm) Then '如果不存在
  65.             dic.Add mm, "" '添加字典
  66.         End If
  67.     Next x
  68.     For x = 0 To dic.Count - 1 '循环字典
  69.         If Split(dic.Keys(x), vbTab)(0) = "湖北" Then '如果找到湖北
  70.             k = k + 1 '计数器
  71.             brr(k, 1) = "湖北" '省
  72.             brr(k, 2) = Split(dic.Keys(x), vbTab)(1) '市
  73.             brr(k, 3) = Split(dic.Keys(x), vbTab)(2) '县
  74.         End If
  75.     Next x
  76.     [E2].Resize(k, 3) = brr '读出
  77.     ActiveWorkbook.Worksheets("作业三").AutoFilter.Sort.SortFields.Clear
  78.     ActiveWorkbook.Worksheets("作业三").AutoFilter.Sort.SortFields.Add Key:=Range( _
  79.         "F1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
  80.         xlSortNormal '排序
  81.     With ActiveWorkbook.Worksheets("作业三").AutoFilter.Sort
  82.         .Header = xlYes
  83.         .MatchCase = False
  84.         .Orientation = xlTopToBottom
  85.         .SortMethod = xlPinYin
  86.         .Apply
  87.     End With
  88. End Sub
复制代码

评分

参与人数 1金币 +15 收起 理由
无聊的疯子 + 15 123题有变量未声明,第三题排序代码错误

查看全部评分

回复

使用道具 举报

发表于 2013-11-24 19:19 | 显示全部楼层
  1. Option Explicit

  2. Sub 作业一()
  3.     Dim arr
  4.     Dim d As New Dictionary, sh As Worksheet
  5.     Dim i%, j%, n%
  6.     Dim str$
  7.     arr = Sheets("源数据一").Range("a1").CurrentRegion.Value '将数据源数据放入数组
  8.     n = 1
  9.     For i = 2 To UBound(arr) '对数组进行行循环
  10.         '将A-H列的数据连接起来作为字典的KEY
  11.         str = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 5) & "|" & arr(i, 6) & "|" & arr(i, 7) & "|" & arr(i, 8)
  12.          '判断字典中KEY是否存在
  13.         If d.Exists(str) Then '如果存在
  14.             arr(d(str), 9) = arr(d(str), 9) & " " & arr(i, 9) '不良位置添加
  15.             arr(d(str), 10) = arr(d(str), 10) + arr(i, 10) '不良数量累计
  16.         Else '如果不存在
  17.             n = n + 1
  18.             d(str) = n '增加KEY
  19.             For j = 1 To 11 '对数组进行列循环
  20.                arr(n, j) = arr(i, j) '利用原来数组,将对应的数据放入,也可以声明一个新的数组,放到新的数组中
  21.             Next j
  22.             arr(n, 12) = IIf(arr(i, 8) = "连锡", "", arr(i, 12)) '最后一列数据按条件显示
  23.       End If
  24.     Next i
  25.     Set sh = Sheets.Add(after:=Sheets(Sheets.Count)) '创建一个新工作表,放在最后
  26.     sh.Name = "第一题答案-" & Format(Now(), "hhmm") '新工作表命名
  27.     sh.Range("a1").Resize(n, 12) = arr '写入结果
  28.     Set d = Nothing '释放对象
  29. End Sub


  30. Sub 作业二()
  31.     Dim arr1, arr2
  32.     Dim d As New Dictionary
  33.     Dim i&, j%, n%
  34.     Dim str$
  35.     With Sheets("作业二")
  36.         arr1 = .Range("a2:f" & Cells(Rows.Count, "f").End(3).Row).Value 'A组数据读入数组
  37.         arr2 = .Range("h2:m" & Cells(Rows.Count, "f").End(3).Row).Value 'B组数据读入数组
  38.         For i = 1 To UBound(arr1) 'A组数组行循环
  39.             '将一行数据连接在一起,作为KEY放入字典
  40.             str = arr1(i, 1) & "|" & arr1(i, 2) & "|" & arr1(i, 3) & "|" & arr1(i, 4) & "|" & arr1(i, 5) & "|" & arr1(i, 6)
  41.             d(str) = ""
  42.         Next i
  43.         For i = 1 To UBound(arr2) 'B组数组行循环
  44.             '将一行数据连接在一起,作为KEY判断字典中是否存在
  45.             str = arr2(i, 1) & "|" & arr2(i, 2) & "|" & arr2(i, 3) & "|" & arr2(i, 4) & "|" & arr2(i, 5) & "|" & arr2(i, 6)
  46.             If d.Exists(str) Then '如果存在
  47.                 n = n + 1 '对存在的数据个数进行累计
  48.                 For j = 1 To 6 '对数组进行列循环
  49.                     arr2(n, j) = arr2(i, j) '利用原来数组,将对应的数据放入,也可以声明一个新的数组,放到新的数组中
  50.                 Next j
  51.             End If
  52.         Next i
  53.         .Range("o2:t" & Cells(Rows.Count, "f").End(3).Row).ClearContents '清空单元格
  54.         .Range("o2").Resize(n, 6) = arr2 '写入结果
  55.     End With
  56.     Set d = Nothing '释放对象
  57. End Sub


  58. Sub 作业三()
  59.     Dim arr, tempArr
  60.     Dim d As New Dictionary
  61.     Dim i&, j%, m As Byte, n As Byte
  62.     Dim str$
  63.     With Sheets("作业三")
  64.         arr = .Range("a1").CurrentRegion.Value '数据读入数组
  65.         For i = 2 To UBound(arr) '对数组进行循环
  66.             If arr(i, 1) = "湖北" Then '判断第一列=湖北时,执行下面语句
  67.                 '判断字典中以第二列市为KEY是否存在
  68.                 If d.Exists(arr(i, 2)) Then '如果存在
  69.                     If InStr(d(arr(i, 2)), arr(i, 3)) = 0 Then '判断如果该KEY所对应的ITEM中不包含第三列县的内容
  70.                         d(arr(i, 2)) = d(arr(i, 2)) & "|" & arr(i, 3) '将该县添加到ITEM中
  71.                     End If
  72.                 Else '如果不存在
  73.                     d(arr(i, 2)) = arr(i, 3) '在字典中增加一个KEY,市为KEY,县为ITEM
  74.                 End If
  75.             End If
  76.         Next i
  77.         Stop
  78.         n = 2
  79.         For i = 0 To d.Count - 1 '对字典进行循环
  80.             tempArr = Split(d.Items(i), "|") '将ITEM分列,赋给数组tempArr
  81.             m = UBound(tempArr)
  82.             For j = 0 To m '对数组tempArr循环
  83.                 '利用原来数组,将对应的数据放入,也可以声明一个新的数组,放到新的数组
  84.                 arr(n + j, 1) = "湖北" '第一列:省(湖北)
  85.                 arr(n + j, 2) = d.Keys(i) '第二列:市(字典的KEY)'清空单元格
  86.                 arr(n + j, 3) = tempArr(j) '第三列:县(tempArr的值)
  87.           Next j
  88.           n = n + m + 1 '确定
  89.        Next i
  90.         .Range("e:g").ClearContents '清空单元格
  91.         .Range("e1").Resize(n - 1, 3) = arr '写入结果
  92.     End With
  93.     Set d = Nothing '释放对象
  94. End Sub
复制代码
先交了吧,好纠结的

评分

参与人数 1金币 +20 收起 理由
无聊的疯子 + 20 结果正确

查看全部评分

回复

使用道具 举报

发表于 2013-11-25 23:16 | 显示全部楼层
  1. Option Explicit
  2. Sub 作业一()
  3. Dim arrData, arrRes()
  4. Dim i, j, m, n, d, strTemp
  5. Set d = CreateObject("scripting.dictionary")
  6. arrData = Sheet1.Range("a1").CurrentRegion
  7. ReDim arrRes(1 To UBound(arrData), 1 To UBound(arrData, 2))
  8. For i = 1 To UBound(arrData)
  9.     strTemp = Join(Array(arrData(i, 1), arrData(i, 2), arrData(i, 3), arrData(i, 4), _
  10.     arrData(i, 5), arrData(i, 6), arrData(i, 7), arrData(i, 8)), "|")
  11.     If Not d.exists(strTemp) Then
  12.         m = m + 1
  13.         For j = 1 To UBound(arrData, 2)
  14.             arrRes(m, j) = arrData(i, j)
  15.         Next
  16.         n = n + 1
  17.         d(strTemp) = n
  18.     Else
  19.         arrRes(d(strTemp), 9) = arrRes(d(strTemp), 9) & " " & arrData(i, 9)
  20.         arrRes(d(strTemp), 10) = arrRes(d(strTemp), 10) + arrData(i, 10)
  21.     End If
  22. Next
  23. Sheet3.UsedRange.ClearContents
  24. Sheet3.Range("a1").Resize(UBound(arrRes), UBound(arrRes, 2)) = arrRes
  25. End Sub

  26. Sub 作业二()
  27. Dim arrA, arrB, i, j, d, arrRes(), strTemp, t
  28. Sheet6.Select
  29. arrA = Range("a2").CurrentRegion
  30. arrB = Range("h2").CurrentRegion
  31. Set d = CreateObject("scripting.dictionary")
  32. For i = 1 To UBound(arrA)
  33.     strTemp = Join(Array(arrA(i, 1), arrA(i, 2), arrA(i, 3), arrA(i, 4), arrA(i, 5), arrA(i, 6)), ",")
  34.     d(strTemp) = 1
  35. Next
  36. For i = 1 To UBound(arrB)
  37.     strTemp = Join(Array(arrB(i, 1), arrB(i, 2), arrB(i, 3), arrB(i, 4), arrB(i, 5), arrB(i, 6)), ",")
  38.     If d.exists(strTemp) Then
  39.         t = t + 1
  40.         ReDim Preserve arrRes(1 To 6, 1 To t)
  41.         For j = 1 To 6
  42.             arrRes(j, t) = arrB(i, j)
  43.         Next
  44.     End If
  45. Next
  46. Range("O2").CurrentRegion.Offset(1).ClearContents
  47. Range("O2").Resize(t, 6) = Application.Transpose(arrRes)
  48. End Sub

  49. Sub 作业三()
  50. Dim arrData, arrRes(1 To 100, 1 To 3), i, j, m, n, d, strT, intT, t, t2, t3
  51. Sheet7.Select
  52. arrData = Range("a1").CurrentRegion
  53. Set d = CreateObject("scripting.dictionary")
  54. For i = 2 To UBound(arrData)
  55.     If arrData(i, 3) <> "" Then
  56.         If Not d.exists(arrData(i, 1)) Then Set d(arrData(i, 1)) = CreateObject("scripting.dictionary")
  57.         If Not d(arrData(i, 1)).exists(arrData(i, 2)) Then Set d(arrData(i, 1))(arrData(i, 2)) = CreateObject("scripting.dictionary")
  58.         d(arrData(i, 1))(arrData(i, 2))(arrData(i, 3)) = ""
  59.     End If
  60. Next
  61. t = d.keys
  62. For i = 0 To UBound(t)
  63.     t2 = d(t(i)).keys
  64.     For j = 0 To UBound(t2)
  65.         t3 = d(t(i))(t2(j)).keys
  66.         For m = 0 To UBound(t3)
  67.             n = n + 1
  68.             arrRes(n, 1) = t(i)
  69.             arrRes(n, 2) = t2(j)
  70.             arrRes(n, 3) = t3(m)
  71.         Next
  72.     Next
  73. Next
  74. Range("E2").Resize(100, 3) = arrRes
  75. End Sub
复制代码

评分

参与人数 1金币 +15 收起 理由
无聊的疯子 + 15 第一题结果未新建表,代码无注释

查看全部评分

回复

使用道具 举报

发表于 2013-11-27 15:20 | 显示全部楼层
本帖最后由 箫风 于 2013-11-27 15:26 编辑

C05:箫风
  1.      
  2. Sub 作业一()
  3.     Dim arr, arr1, arr2, arr3, arr4
  4.     Dim i As Integer, j As Integer, s As String, t
  5.     Dim d As New Dictionary, d1 As New Dictionary, d2 As New Dictionary
  6.     Application.DisplayAlerts = False
  7.     Range("O2:T" & Cells(Rows.Count, "O").End(xlUp).Row).ClearContents
  8.    
  9.     For i = 1 To Sheets.Count
  10.         On Error Resume Next
  11.         If Sheets(i).Name Like "第一题答案*" Then Sheets(i).Delete
  12.     Next i
  13.     t = Timer
  14.     arr = Range("A1:L" & Cells(Rows.Count, 1).End(xlUp).Row)
  15.     '将不重复的项放入字典
  16.     For i = 2 To UBound(arr)
  17.         s = arr(i, 1) & "|" & arr(i, 2) & "|" & arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 5) & "|" & arr(i, 6) & "|" & arr(i, 7) & "|" & arr(i, 8) & "|" & arr(i, 11) & "|" & arr(i, 12)
  18.         d(s) = "" ' + arr(i, 10)
  19.     Next i
  20.     arr1 = Range("A2:L" & Cells(Rows.Count, 1).End(3).Row).Value
  21.     '累计不良位置不良记录
  22.     For i = 1 To UBound(arr1)
  23.         s = arr1(i, 1) & "|" & arr1(i, 2) & "|" & arr1(i, 3) & "|" & arr1(i, 4) & "|" & arr1(i, 5) & "|" & arr1(i, 6) & "|" & arr1(i, 7) & "|" & arr1(i, 8) & "|" & arr1(i, 11) & "|" & arr1(i, 12)
  24.         d1(s) = d1(s) + " " + arr1(i, 9)
  25.         d2(s) = d2(s) + arr1(i, 10)
  26.     Next i
  27.     arr2 = d.Keys
  28.     '准备写入目标工作表中的数据
  29.     ReDim arr4(0 To d.Count, 0 To UBound(arr1, 2) - 3)
  30.     For i = 0 To d.Count - 1
  31.         arr3 = Split(arr2(i), "|")
  32.         For j = 0 To UBound(arr1, 2) - 3
  33.             arr4(i, j) = arr3(j)
  34.             If arr3(7) = "连锡" Then arr4(i, 9) = ""
  35.         Next j
  36.     Next i
  37.     Sheets.Add
  38.     '将数据依次写入目标工作表
  39.     Range("A1").Resize(, UBound(arr, 2)) = Application.WorksheetFunction.Index(arr, 1)
  40.     Range("A2").Resize(UBound(arr4, 1), UBound(arr4, 2) + 1) = arr4
  41.     Range("I2").Resize(UBound(arr4, 1), 2).Insert Shift:=xlToRight
  42.     Range("I2").Resize(UBound(arr4, 1), 1) = Application.WorksheetFunction.Transpose(d1.Items)
  43.     Range("J2").Resize(UBound(arr4, 1), 1) = Application.WorksheetFunction.Transpose(d2.Items)
  44.     Columns("A:L").EntireColumn.AutoFit
  45.     ActiveSheet.Name = "第一题答案-" & Timer - t
  46.     Sheets("作业一").Select
  47.     Application.DisplayAlerts = True
  48.    
  49. End Sub


  50. Sub 作业二()
  51.     Dim arr1, arr2, arr3, arr4
  52.     Dim s As String
  53.     Dim d1 As New Dictionary
  54.     Dim d2 As New Dictionary
  55.     Dim i As Long, j As Long
  56.    
  57.     Range("O2:S" & Rows.Count).ClearContents
  58.     arr1 = Range("A2:F" & Cells(Rows.Count, "A").End(xlUp).Row).Value
  59.     arr2 = Range("H2:M" & Cells(Rows.Count, "H").End(xlUp).Row).Value
  60.     For i = LBound(arr1) To UBound(arr1)
  61.         s = arr1(i, 1) & "|" & arr1(i, 2) & "|" & arr1(i, 3) & "|" & arr1(i, 4) & "|" & arr1(i, 5) & "|" & arr1(i, 6)
  62.         
  63.         d1(s) = ""
  64.     Next
  65.    
  66.     For i = LBound(arr2) To UBound(arr2)
  67.         'A组和B组共有值
  68.         s = arr2(i, 1) & "|" & arr2(i, 2) & "|" & arr2(i, 3) & "|" & arr2(i, 4) & "|" & arr2(i, 5) & "|" & arr2(i, 6)
  69.         
  70.         If d1.Exists(s) Then d2(s) = ""
  71.     Next
  72.     If d2.Count = 0 Then Exit Sub
  73.     arr3 = d2.Keys
  74.     '准备写入目标区域中的数据
  75.     ReDim arr5(0 To d2.Count, 0 To UBound(arr1, 2) - 1)
  76.    
  77.     For i = 0 To d2.Count - 1
  78.         arr4 = Split(arr3(i), "|")
  79.         For j = 0 To UBound(arr1, 2) - 1
  80.             arr5(i, j) = arr4(j)
  81.         Next j
  82.     Next i
  83.     '将数据写入目标区域
  84.     Range("O2").Resize(UBound(arr5, 1), UBound(arr5, 2)).Value = arr5
  85.     MsgBox "提取完成!"
  86. End Sub

  87. Sub 作业三()
  88.     Dim arr1, arr2, arr3, arr4
  89.     Dim s As String
  90.     Dim d As New Dictionary
  91.     Dim i As Long, j As Long, k As Long, l As Long
  92.    
  93.     Range("E2:G" & Rows.Count).ClearContents
  94.     arr1 = Range("A2:C" & Cells(Rows.Count, "A").End(xlUp).Row).Value
  95.     For i = LBound(arr1) To UBound(arr1)
  96.         s = arr1(i, 1) & "|" & arr1(i, 2) & "|" & arr1(i, 3)
  97.         d(s) = ""
  98.     Next
  99.     If d.Count = 0 Then Exit Sub
  100.     arr2 = d.Keys
  101.    
  102.    
  103.     '准备写入目标区域中的数据
  104.     ReDim arr4(0 To d.Count, 0 To UBound(arr1, 2) - 1)
  105.     k = 0
  106.     l = 0
  107.     '剔除县区为空数据行
  108.     Do
  109.         If Len(arr2(l)) > 6 Then
  110.             arr3 = Split(arr2(l), "|")
  111.             For j = 0 To UBound(arr1, 2) - 1
  112.                 arr4(l - k, j) = arr3(j)
  113.             Next j
  114.         Else
  115.             k = k + 1
  116.         End If
  117.         l = l + 1
  118.     Loop Until l = d.Count
  119.     '将数据写入目标区域
  120.     Range("E2").Resize(UBound(arr4, 1) + 1, UBound(arr4, 2) + 1).Value = arr4
  121.    
  122. End Sub
复制代码

评分

参与人数 1金币 +18 收起 理由
无聊的疯子 + 18 第三题结果未对市进行排序,扣2分

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 14:59 , Processed in 0.180519 second(s), 20 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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