Excel精英培训网

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

[已解决]如何将A列数据不重复的填入到一个数组当中?并将这个数组重新填充到 B列

[复制链接]
发表于 2013-6-21 22:37 | 显示全部楼层 |阅读模式
本帖最后由 事后诸葛亮 于 2013-6-21 22:40 编辑

如何将A列数据不重复的填入到一个数组当中?并将这个数组重新填充到 B列
假设有100个数据。
For i= 1 to 100
      arr临时(k)=cells(i,1)
      k=k+1
next i

差不多是这个模型吧。如果在填充之前进行判断,如果原有数组中有,则不填充。如果没有,则填充。

或者说 是字典吧??
请用最简单的代码生成。谢谢。
最佳答案
2013-6-22 00:36
本帖最后由 adders 于 2013-6-21 11:38 编辑

If Range is not big (like you said, A1:A100), just use Collection:
  1. Sub tt1()
  2.     Range("B1:B100").ClearContents
  3.     Dim Cel As Range, colMG As Collection, i As Byte
  4.     Set colMG = New Collection
  5.    
  6.     On Error Resume Next
  7.         For Each Cel In Range("A1:A100")
  8.             colMG.Add Cel, CStr(Cel)
  9.         Next Cel
  10.     On Error GoTo 0
  11.    
  12.     For i = 1 To colMG.Count
  13.         Range("B" & i) = colMG(i)
  14.     Next i
  15. End Sub
复制代码
With a huge Range in A column, for speed, you can combine array and collection:
  1. Sub tt2()
  2.     Range("B1:B" & Range("B1").End(xlDown).Row).ClearContents
  3.     Dim a(), b(), colMG As Collection, i As Long, n As Long
  4.     a = Range("A1:A" & Range("A1").End(xlDown).Row)
  5.     Set colMG = New Collection
  6.    
  7.     On Error Resume Next
  8.         For i = LBound(a) To UBound(a)
  9.             colMG.Add a(i, 1), CStr(a(i, 1))
  10.         Next i
  11.     On Error GoTo 0
  12.    
  13.     n = colMG.Count
  14.     ReDim b(1 To n)
  15.     For i = 1 To n
  16.         b(i) = colMG(i)
  17.     Next i
  18.    
  19.     Range("B1").Resize(n, 1) = Application.Transpose(b)
  20. End Sub
复制代码
Example file attached:

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-6-21 23:08 | 显示全部楼层
回复

使用道具 举报

发表于 2013-6-22 00:32 | 显示全部楼层
arr临时(k)=cells(i,1)前面加上一句:if application.match(cells(i,1),arr,0)>0 then 跳过此句,不过这样没找到时会报错,还要做容错。用if application.counif(range("a1:a"&i-1,cells(i,1)>0来判断也行
回复

使用道具 举报

发表于 2013-6-22 00:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 adders 于 2013-6-21 11:38 编辑

If Range is not big (like you said, A1:A100), just use Collection:
  1. Sub tt1()
  2.     Range("B1:B100").ClearContents
  3.     Dim Cel As Range, colMG As Collection, i As Byte
  4.     Set colMG = New Collection
  5.    
  6.     On Error Resume Next
  7.         For Each Cel In Range("A1:A100")
  8.             colMG.Add Cel, CStr(Cel)
  9.         Next Cel
  10.     On Error GoTo 0
  11.    
  12.     For i = 1 To colMG.Count
  13.         Range("B" & i) = colMG(i)
  14.     Next i
  15. End Sub
复制代码
With a huge Range in A column, for speed, you can combine array and collection:
  1. Sub tt2()
  2.     Range("B1:B" & Range("B1").End(xlDown).Row).ClearContents
  3.     Dim a(), b(), colMG As Collection, i As Long, n As Long
  4.     a = Range("A1:A" & Range("A1").End(xlDown).Row)
  5.     Set colMG = New Collection
  6.    
  7.     On Error Resume Next
  8.         For i = LBound(a) To UBound(a)
  9.             colMG.Add a(i, 1), CStr(a(i, 1))
  10.         Next i
  11.     On Error GoTo 0
  12.    
  13.     n = colMG.Count
  14.     ReDim b(1 To n)
  15.     For i = 1 To n
  16.         b(i) = colMG(i)
  17.     Next i
  18.    
  19.     Range("B1").Resize(n, 1) = Application.Transpose(b)
  20. End Sub
复制代码
Example file attached:

Collections Example.zip

20.66 KB, 下载次数: 8

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 04:21 , Processed in 0.230349 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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