Excel精英培训网

 找回密码
 注册
查看: 11724|回复: 30

[习题] 【字典与数组二期1班】第一讲作业数组去重(选做)【已开贴】

  [复制链接]
发表于 2011-12-17 16:50 | 显示全部楼层 |阅读模式
本帖最后由 liuguansky 于 2011-12-23 21:56 编辑

QQ截图未命名.png

【课时一作业2】数组去重.rar (70.26 KB, 下载次数: 248)

评分

参与人数 3 +73 收起 理由
sunjing-zxl + 21 老师辛苦了
白开水的微笑 + 40 赞一个!
windimi007 + 12 很给力!

查看全部评分

发表于 2011-12-17 17:22 | 显示全部楼层
本帖最后由 那么的帅 于 2011-12-17 19:10 编辑

  1. Sub 那么的帅1()
  2.     Dim Arr1, Arr2(1 To 1000), Arr11()
  3.     Dim Row1 As Long, I As Long, M As Long
  4.     With Sheets("Sheet1")
  5.         Row1 = .Range("A" & .Rows.Count).End(xlUp).Row
  6.         Arr1 = .Range("A1:A" & Row1)
  7.         For I = 1 To UBound(Arr1)
  8.             If Arr2(Arr1(I, 1)) <> 1 Then
  9.                 M = M + 1
  10.                 ReDim Preserve Arr11(1 To 1, 1 To M)
  11.                 Arr11(1, M) = Arr1(I, 1)
  12.                 Arr2(Arr1(I, 1)) = 1
  13.             End If
  14.         Next I
  15.         .Range("C1:C" & .Rows.Count).ClearContents
  16.         .Range("C1").Resize(M, 1) = Application.Transpose(Arr11)
  17.     End With
  18. End Sub
  19. Sub 那么的帅2()
  20.     Dim Arr1, Arr2(1 To 1000), Arr11(1 To 1000, 1 To 1)
  21.     Dim Row1 As Long, I As Long, M As Long
  22.     With Sheets("Sheet1")
  23.         Row1 = .Range("A" & .Rows.Count).End(xlUp).Row
  24.         Arr1 = .Range("A1:A" & Row1)
  25.         For I = 1 To UBound(Arr1)
  26.             If Arr2(Arr1(I, 1)) <> 1 Then
  27.                 M = M + 1
  28.                 Arr11(M, 1) = Arr1(I, 1)
  29.                 Arr2(Arr1(I, 1)) = 1
  30.             End If
  31.         Next I
  32.         .Range("D1:D" & .Rows.Count).ClearContents
  33.         .Range("D1").Resize(M, 1) = Arr11
  34.     End With
  35. End Sub
复制代码


点评

ls
可以给个解释吗,让不会的人学习下  发表于 2011-12-22 12:01

评分

参与人数 3 +19 金币 +2 收起 理由
ls + 9 赞一个!
wcymiss + 10 很给力!
研究研究 + 2 很给力!

查看全部评分

回复

使用道具 举报

发表于 2011-12-17 18:21 | 显示全部楼层
  1. Sub Benol()
  2. Dim src, cnt&
  3. src = Range([A1], Cells([A65536].End(3).Row, 1))

  4. For i = 1 To UBound(src)
  5.    If Application.Match(src(i, 1), src, False) = i Then
  6.     cnt = cnt + 1
  7.     src(cnt, 1) = src(i, 1)
  8.    End If
  9. Next

  10. Columns(3).ClearContents
  11. [C1].Resize(cnt) = src
  12. End Sub
复制代码

点评

哈哈,就猜到会用“match”  发表于 2011-12-19 11:10

评分

参与人数 1金币 -10 收起 理由
wcymiss -10 扩大负债

查看全部评分

回复

使用道具 举报

发表于 2011-12-17 19:25 | 显示全部楼层
  1. Sub Benol()
  2. Dim src, cnt&, intArr(1 To 1000)
  3. src = Range([A1], Cells([A65536].End(3).Row, 1))
  4. For i = 1 To UBound(src)
  5.    If IsEmpty(intArr(src(i, 1))) Then
  6.     cnt = cnt + 1
  7.     src(cnt, 1) = src(i, 1)
  8.     intArr(src(i, 1)) = 1
  9.    End If
  10. Next
  11. Columns(3).ClearContents
  12. [C1].Resize(cnt) = src
  13. End Sub
复制代码

评分

参与人数 2 +13 收起 理由
wjc2090742 + 3 很给力!
wcymiss + 10 利用原数组,省时省地,非常棒。

查看全部评分

回复

使用道具 举报

发表于 2011-12-17 22:05 | 显示全部楼层
本帖最后由 wcymiss 于 2011-12-19 12:20 编辑

吴姐辛苦了!{:1612:}
方法1比较通用,不过速度不容乐观;方法2取了点巧,应该可以吧!{:3212:}
方法1:
  1. Sub windimi007_1()
  2.     Dim arr, arr1()
  3.     Dim i&, j&
  4.     On Error Resume Next
  5.     arr = Range("A1").CurrentRegion
  6.     For i = 1 To UBound(arr)
  7.         If UBound(Filter(Split("|" & Join(arr1, "|,|") & "|", ","), "|" & arr(i, 1) & "|", True)) Then
  8.             j = j + 1
  9.             ReDim Preserve arr1(1 To j)
  10.             arr1(j) = arr(i, 1)
  11.         End If
  12.     Next i
  13.     Erase arr
  14.     Range("C1").Resize(UBound(arr1)) = WorksheetFunction.Transpose(arr1)
  15.     Erase arr1
  16. End Sub
复制代码
方法2:

  1. Sub windimi007_2()
  2.     Dim arr, arr1(), arr2()
  3.     Dim i&, j&
  4.     On Error Resume Next
  5.     arr = Range("A1").CurrentRegion
  6.     For i = 1 To UBound(arr)
  7.         If UBound(Filter(arr1, arr(i, 1) + 1000, True)) Then
  8.             j = j + 1
  9.             ReDim Preserve arr1(1 To j)
  10.             ReDim Preserve arr2(1 To j)
  11.             arr1(j) = arr(i, 1) + 1000
  12.             arr2(j) = arr(i, 1)
  13.         End If
  14.     Next i
  15.     Erase arr
  16.     Erase arr1
  17.     Range("C1").Resize(UBound(arr2)) = WorksheetFunction.Transpose(arr2)
  18.     Erase arr2
  19. End Sub
复制代码

       第一种方法比较慢,但通用性较好。第二种稍快,利用了题目的已知条件:数据是1-1000以内的整数。但根据这个条件还有更好的方法。
       不建议在作业题里用“on error resume next。因为作业本身就是要发现问题、解决问题。容错语句把错误都掩埋了。
       本楼不评分,在下一楼一起评。
                                                                                                                                        --------wcymiss
回复

使用道具 举报

发表于 2011-12-17 23:05 | 显示全部楼层
本帖最后由 wcymiss 于 2011-12-19 12:24 编辑

似乎下面的代码会更快点吧!临睡前想到的,还没来得及测试速度。{:3212:}
  1. Sub windimi007_3()
  2.     Dim arr, arr1(1 To 1000), arr2(1 To 1000)
  3.     Dim i&, j&
  4.     On Error Resume Next
  5.     arr = Range("A1").CurrentRegion
  6.     For i = 1 To UBound(arr)
  7.         If UBound(Filter(arr1, arr(i, 1) + 1000, True)) Then
  8.             j = j + 1
  9.             arr1(j) = arr(i, 1) + 1000
  10.             arr2(j) = arr(i, 1)
  11.         End If
  12.     Next i
  13.     Erase arr
  14.     Erase arr1
  15.     Range("C1").Resize(UBound(arr2)) = WorksheetFunction.Transpose(arr2)
  16.     Erase arr2
  17. End Sub
复制代码
加1000后Filter是一种不错的思路。不过还是没有instr快。------wcymiss


评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-18 12:45 | 显示全部楼层
本帖最后由 wcymiss 于 2011-12-19 20:54 编辑
  1. Sub liuts()
  2.     Dim t
  3.     t = Timer
  4.     Dim arr, crr(), i%, k%
  5.     arr = Range("a1").CurrentRegion
  6.     ReDim Preserve crr(1 To 1): crr(1) = arr(1, 1): k = 1
  7.     For i = 2 To UBound(arr)
  8.         If InStr("," & Join(crr, ",") & ",", "," & arr(i, 1) & ",") = 0 Then
  9.             k = k + 1
  10.             ReDim Preserve crr(1 To k)
  11.             crr(k) = arr(i, 1)
  12.         End If
  13.     Next
  14.     Range("d1").Resize(UBound(crr)) = Application.Transpose(crr)
  15.     MsgBox Timer - t
  16. End Sub
复制代码

instr去重的方法比较通用,速度也比filter快,但针对本题有更好的方法。     -------wcymiss
本楼不评分了,集中在18楼评分。

回复

使用道具 举报

发表于 2011-12-18 14:49 | 显示全部楼层
  1. Option Base 1
  2. Private Sub qushui()
  3. Dim a, b(1000) As Integer, c(1000, 1) As Integer
  4. Dim m&, k%
  5. m = [a65536].End(xlUp).Row
  6. a = Range("a1:a" & m)
  7. For i = 1 To m
  8. If b(a(i, 1)) = 0 Then
  9. b(a(i, 1)) = a(i, 1)
  10. k = k + 1
  11. c(k, 1) = b(a(i, 1))
  12. End If
  13. Next
  14. [d1].Resize(k, 1) = c
  15. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-18 19:08 | 显示全部楼层

  1. Sub rxj_0414()
  2.     Dim N As Long, i As Integer, cnt As Integer
  3.     Dim arr, arr1000(1 To 1000), arr2()
  4.     N = Sheet1.[A65536].End(xlUp).Row
  5.     arr = Application.Transpose(Sheet1.Range("A1:A" & N))
  6.     cnt = 1
  7.     For i = 1 To N
  8.         If arr1000(arr(i)) <> 1 Then
  9.             arr1000(arr(i)) = 1
  10.             ReDim Preserve arr2(1 To cnt)
  11.             arr2(cnt) = arr(i)
  12.             cnt = cnt + 1
  13.         End If
  14.     Next i
  15.     Sheet1.Range("C1:C" & UBound(arr2)) = Application.Transpose(arr2)
  16. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-18 19:59 | 显示全部楼层

  1. Sub csmctjg()
  2. Dim arr, arr1() As Integer, i&, j&, k&
  3. arr = Range("A1:A" & [A65536].End(xlUp).Row)
  4. k = k + 1
  5. ReDim arr1(1 To k)
  6. arr1(1) = arr(1, 1)
  7. For i = 2 To UBound(arr)
  8.     For j = 1 To UBound(arr1)
  9.         If arr(i, 1) = arr1(j) Then GoTo 100
  10.     Next j
  11.     k = k + 1
  12.     ReDim Preserve arr1(1 To k)
  13.     arr1(k) = arr(i, 1)
  14. 100:
  15. Next i
  16. [C1].Resize(k) = Application.Transpose(arr1)
  17. End Sub
复制代码

点评

二次循环,不可以哦  发表于 2011-12-18 22:33
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 07:24 , Processed in 1.259899 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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