Excel精英培训网

 找回密码
 注册
楼主: wcymiss

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

  [复制链接]
发表于 2011-12-19 08:45 | 显示全部楼层
重做!

  1. Sub csmctjg()
  2. Dim arr, arr1(1 To 1000) As Integer, arr2(1 To 1000, 1 To 1) As Integer, i&, k&
  3. arr = Range("A1:A" & [A65536].End(xlUp).Row)
  4. For i = 1 To UBound(arr)
  5.     If arr1(arr(i, 1)) = 0 Then
  6.         arr1(arr(i, 1)) = 1
  7.         k = k + 1
  8.         arr2(k, 1) = arr(i, 1)
  9.     End If
  10. Next i
  11. [C1].Resize(k) = arr2
  12. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-19 10:28 | 显示全部楼层
本帖最后由 wcymiss 于 2011-12-19 11:43 编辑

【字典2班.012】sunjing-zxl  交作业

  1. Sub sunjing_zxl()
  2.     Dim arr1, arr2(), arr3(), n As Long, i As Long
  3.     Dim str As String, m As Long
  4.     n = [A65536].End(xlUp).Row
  5.     Range("C1:C65536").ClearContents
  6.     arr1 = Range("A1:A" & n)
  7.     ReDim arr2(1 To n, 1 To 1)
  8.     ReDim arr3(n)
  9.     For i = 1 To n
  10.         str = Join(arr3, ",")
  11.         If InStr(1, str, "," & arr1(i, 1) & ",", 0) = 0 Then
  12.             m = m + 1
  13.             arr2(m, 1) = arr1(i, 1)
  14.             arr3(m) = arr1(i, 1)
  15.         End If
  16.     Next i
  17.     Range("C1:C" & n) = arr2
  18. End Sub
复制代码

      redim arr3(n)  ,后期赋值从arr(1)开始,arr(0)时始终为空值,join(arr3,",")的结果也始终是以","开头的,这个方法个人认为比较好。
    Range("C1:C" & n) = arr2,这里用m比较好。因为去重后数组的有效个数是m个,Range("C1:C" & m) 可节省对空单元格操作的时间。
     instr方法可以达到去重效果而且通用于文本,但就本例而言,不算是最好的方法。

                                                                                                                                    ----------wcymiss



评分

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

查看全部评分

回复

使用道具 举报

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

  1. Sub 乐满地()
  2.     Dim arr, brr(1 To 10000, 1 To 1), crr(1 To 10000, 1 To 1)
  3.     Dim x As Long, k As Long
  4.     arr = Range("a1:a" & Range("a65536").End(3).Row)
  5.     For x = 1 To UBound(arr)
  6.         If brr(arr(x, 1), 1) = "" Then
  7.             brr(arr(x, 1), 1) = 1
  8.             k = k + 1
  9.             crr(k, 1) = arr(x, 1)
  10.         End If
  11.     Next
  12.     Range("b1").Resize(k) = crr
  13. End Sub
复制代码

上次练习里已经有比=""更快的方法啦!      -------wcymiss

评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-19 15:21 | 显示全部楼层
本帖最后由 swabe 于 2011-12-19 15:26 编辑
  1. Sub swabe()
  2.     Dim arr, j&, arr2(1 To 1000), arrtmp(1 To 1000, 1 To 1)

  3.     arr = Range("A1:A" & Range("A65536").End(xlUp).Row)
  4.     j = 1
  5.     For i = 1 To UBound(arr)
  6.         If IsEmpty(arr2(arr(i, 1))) Then
  7.             arr2(arr(i, 1)) = 1
  8.             arrtmp(j, 1) = arr(i, 1)
  9.             j = j + 1
  10.         End If
  11.     Next
  12.     Range("c1:c1000") = arrtmp
  13. End Sub
复制代码
请老师指正!

评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-19 15:25 | 显示全部楼层
取巧的办法行吗
  1. Dim arr, brr(1 To 1000), crr, i As Long
  2. arr = Range("a1").CurrentRegion
  3. For i = 1 To UBound(arr)
  4.     If i < 1001 Then
  5.         If brr(i) = "" Then brr(i) = 1001
  6.     End If
  7.     brr(arr(i, 1)) = arr(i, 1)
  8. Next
  9. crr = Filter(brr, 1001, False)
  10. [d1].Resize(UBound(crr) + 1) = Application.Transpose(crr)
  11. End Sub
复制代码

点评

已知条件:A列为1-1000的整数,根据这个条件所写的代码不算取巧。  发表于 2011-12-19 15:54
效果不对。不能从小到大排的。要按照源数据出现的顺序。再想想噢。还有啊,9mm,sub ()这句没啦  发表于 2011-12-19 15:51
回复

使用道具 举报

发表于 2011-12-19 16:40 | 显示全部楼层
重做:
  1. Sub a9lee()
  2. Dim arr, i As Long
  3. Dim brr(1 To 1000)

  4. arr = Range("a1").CurrentRegion
  5. For i = 1 To UBound(arr)
  6.     crr = Filter(brr, " " & arr(i, 1) & " ", True)
  7.     If UBound(crr) < 0 Then x = x + 1: brr(x) = " " & arr(i, 1) & " "
  8. Next i
  9. [d1].Resize(x) = Application.Transpose(brr)
  10. End Sub
复制代码

点评

可惜呀,16楼思路的火花闪了一下,到17楼又灭了。这个效果基本正确。说是基本,是因为这个代码的结果为带空格的文本,但显示上看起来和模拟效果一样。filter,速度慢吧?你应该想得出更快的法子的。比字典还快的法子  发表于 2011-12-19 22:14
回复

使用道具 举报

发表于 2011-12-19 17:05 | 显示全部楼层
  1. Sub liuts()
  2.     Dim t As Double, i%
  3.     Dim arr, brr(1 To 1000, 1 To 2)
  4.     t = Timer
  5.     With Sheet1
  6.         .Range("d:d").ClearContents
  7.         arr = Range("A1").CurrentRegion
  8.         For i = 1 To UBound(arr)
  9.             If IsEmpty(brr(arr(i, 1), 2)) Then
  10.                 k = k + 1
  11.                 brr(k, 1) = arr(i, 1)
  12.                 brr(arr(i, 1), 2) = i
  13.             End If
  14.         Next
  15.         .Range("d1").Resize(UBound(brr)) = brr
  16.     End With
  17.     MsgBox Timer - t
  18. End Sub
复制代码
我也来个下标的

评分

参与人数 2 +13 收起 理由
wjc2090742 + 3 很给力!
wcymiss + 10 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2011-12-19 20:41 | 显示全部楼层
Sub JLxiangwei()
    Dim arr, arr1(1 To 1000), arr2(1 To 1000), x&, y&
    arr = Range("a1:a" & Cells(Rows.Count, 1).End(3).Row)
    For x = 1 To UBound(arr)
        If arr1(arr(x, 1)) = "" Then
            arr1(arr(x, 1)) = 1
            y = y + 1
            arr2(y) = arr(x, 1)
        End If
    Next x
    Range("c1").Resize(y) = Application.Transpose(arr2)
End Sub

点评

上次练习里,有提到过,比=“”更效率的判断方法呀!  发表于 2011-12-19 20:51

评分

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

查看全部评分

回复

使用道具 举报

发表于 2011-12-19 20:53 | 显示全部楼层

重新改了一下

本帖最后由 wcymiss 于 2011-12-21 22:41 编辑
  1. Private Sub Happym8888_Click()
  2. Dim a() As Variant, c() As String, GuoDu() As Variant
  3. Dim i As Integer, j As Integer, s As Integer
  4. s = Range("a65536").End(xlUp).Row
  5. a = Range("A1:A" & s)
  6. For i = 1 To s
  7. For j = i + 1 To s - 1
  8. If a(j, 1) = a(i, 1) Then
  9. a(j, 1) = "@"
  10. End If
  11. Next j
  12. Next i
  13. GuoDu = Application.Transpose(a)
  14. ricks = Replace(Join(GuoDu(), ","), ",@", "")
  15. c = Split(ricks, ",")
  16. Range("D1:D" & UBound(c()) + 1) = Application.Transpose(c())
  17. End Sub
复制代码

点评

注意看题目要求:只能使用一次循环。也就是只能用一个for。  发表于 2011-12-20 08:44

评分

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

查看全部评分

回复

使用道具 举报

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

  1. Option Base 1
  2. Sub 兰江自由鱼()
  3.   Dim Arr, Arr_t() As Integer
  4.   Dim Arr_s(1000) As Integer
  5.   Dim i As Integer, iNa As Integer, j As Integer
  6.    j = 1
  7.   Arr = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value
  8.   For i = 1 To UBound(Arr)
  9.     iNa = Arr(i, 1)
  10.     If Arr_s(iNa) <> 1 Then
  11.         ReDim Preserve Arr_t(1 To j)
  12.         Arr_t(j) = iNa
  13.         j = j + 1
  14. '       ReDim Preserve Arr_t(1 To j)
  15.         Arr_s(iNa) = 1
  16.      End If
  17. Next i
  18. Range("C1").Resize(UBound(Arr_t), 1).Value = Application.Transpose(Arr_t)
  19. End Sub
复制代码


敬请批改。

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 08:28 , Processed in 0.339439 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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