Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5154|回复: 15

[已解决]数组输出

[复制链接]
发表于 2014-2-14 19:09 | 显示全部楼层 |阅读模式
本帖最后由 张雄友 于 2014-2-15 19:44 编辑

数组输出办法。
最佳答案
2014-2-15 10:05
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, s&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("b10:b" & Range("b65536").End(xlUp).Row)
  5. x = Application.WorksheetFunction.CountIf(Columns(2), "期间")
  6. ReDim brr(1 To UBound(arr), 1 To 1)
  7. For i = 1 To UBound(arr)
  8.     If arr(i, 1) <> "" Then d(arr(i, 1)) = d(arr(i, 1)) + 1
  9.     If d(arr(i, 1)) = x Then s = s + 1: brr(s, 1) = arr(i, 1)
  10. Next
  11. Range("c1").Resize(s) = brr
  12. End Sub
复制代码
不判断期间的话

一列中的重复值.rar

20.13 KB, 下载次数: 4

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-2-14 19:27 | 显示全部楼层
Sub 找出B列的重复值()    '每组都有的,因为B列中有很多组数据
    Dim Arr, i&, Myr&, n&, Arr1(), r&, Arr2()
    Dim d, k, t, ks, js, j&
    Set d = CreateObject("Scripting.Dictionary")
    [C:C].ClearContents
    Myr = Cells(Rows.Count, 2).End(xlUp).Row
    Arr = Range("B1:B" & Myr)
    For i = 1 To UBound(Arr)
        If Arr(i, 1) = "期间" Then
            n = n + 1
            ReDim Preserve Arr1(1 To n)
            Arr1(n) = i
        End If
    Next
    For i = 1 To n
        If i <> n Then
            js = Arr1(i + 1) - 1
        Else
            js = UBound(Arr)
        End If
        ks = Arr1(i) + 1
        For j = ks To js
            If Arr(j, 1) <> "" Then
                d(Arr(j, 1)) = d(Arr(j, 1)) + 1
            End If
        Next
    Next
    k = d.keys: t = d.items
    ReDim Preserve Arr2(1 To Cells(Rows.Count, 2).End(3).Row, 1 To 1)
    For i = 0 To UBound(k)
        If t(i) = n Then
            r = r + 1
            Arr2(r, 1) = k(i)
        End If
    Next
    [C1] = "期间"
    [C2].Resize(r, 1) = Arr2
End Sub

评分

参与人数 1 +3 收起 理由
张雄友 + 3 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-2-14 19:28 | 显示全部楼层
风林火山 发表于 2014-2-14 19:27
Sub 找出B列的重复值()    '每组都有的,因为B列中有很多组数据
    Dim Arr, i&, Myr&, n&, Arr1(), r&, A ...

ReDim Preserve Arr2(1 To Cells(Rows.Count, 2).End(3).Row, 1 To 1)??

ReDim Preserve  比  ReDim 要慢吧?
回复

使用道具 举报

发表于 2014-2-14 19:30 | 显示全部楼层
ReDim Arr2(1 To Cells(Rows.Count, 2).End(3).Row, 1 To 1)
删掉吧,楼主是高手,你明白的,的确慢
回复

使用道具 举报

发表于 2014-2-14 19:36 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, s&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("b10:b" & Range("b65536").End(xlUp).Row)
  5. ReDim brr(1 To UBound(arr), 1 To 1)
  6. s = 1: brr(s, 1) = "期间"
  7. For i = 1 To UBound(arr)
  8.     If arr(i, 1) <> "期间" Then d(arr(i, 1)) = d(arr(i, 1)) + 1
  9.     If d(arr(i, 1)) = 2 Then s = s + 1: brr(s, 1) = arr(i, 1)
  10. Next
  11. Range("c1").Resize(s) = brr
  12. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-2-14 19:40 | 显示全部楼层
dsmch 发表于 2014-2-14 19:36

'每组都有的才算重复,因为B列中有很多组数据,而且答案出现了空值。
回复

使用道具 举报

发表于 2014-2-14 19:43 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, s&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("b10:b" & Range("b65536").End(xlUp).Row)
  5. x = Application.WorksheetFunction.CountIf(Columns(2), "期间")
  6. ReDim brr(1 To UBound(arr), 1 To 1)
  7. s = 1: brr(s, 1) = "期间"
  8. For i = 1 To UBound(arr)
  9.     If arr(i, 1) <> "期间" And arr(i, 1) <> "" Then d(arr(i, 1)) = d(arr(i, 1)) + 1
  10.     If d(arr(i, 1)) = x Then s = s + 1: brr(s, 1) = arr(i, 1)
  11. Next
  12. Range("c1").Resize(s) = brr
  13. End Sub
复制代码
如果每组没有重复

评分

参与人数 1 +3 收起 理由
张雄友 + 3 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-2-14 19:56 | 显示全部楼层
赏析一下不错
回复

使用道具 举报

 楼主| 发表于 2014-2-14 19:58 | 显示全部楼层
(风林火山,dsmch),都是最佳,问题解决了。谢谢大家!

点评

没有原则,和事老。呵呵  发表于 2014-2-14 20:42
回复

使用道具 举报

发表于 2014-2-14 20:50 | 显示全部楼层
张雄友 发表于 2014-2-14 19:58
(风林火山,dsmch),都是最佳,问题解决了。谢谢大家!

把最佳给他
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 04:43 , Processed in 0.372127 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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