Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 兰色幻想

[习题] 第8讲示例: VBA数组处理重复值

[复制链接]
发表于 2008-1-9 21:14 | 显示全部楼层

filter把A1找到A10,A11当成找到?

Sub 一有二无()<br/>Range("E2:E20").ClearContents<br/>Dim arr1, arr2, k%, l%, arr3(1 To 10)<br/>arr1 = Application.Transpose(Range("a2:A11"))<br/>arr2 = Application.Transpose(Range("B2:B11"))<br/>For k = LBound(arr1) To UBound(arr1)<br/>&nbsp;ss = Filter(arr2, arr1(k))<br/>&nbsp; If UBound(ss) = -1 Then<br/>&nbsp;&nbsp;&nbsp; l = l + 1<br/>&nbsp;&nbsp;&nbsp; arr3(l) = arr1(k)<br/>&nbsp;&nbsp; End If<br/>Next k<br/>Range("E2").Resize(UBound(arr3)) = Application.Transpose(arr3)<br/>End Sub
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2008-1-9 21:35 | 显示全部楼层

Sub cn()<br/>&nbsp;&nbsp;&nbsp; Dim arr1(), arr2(), arr3(), arr4(), arr5()<br/>&nbsp;&nbsp;&nbsp; t = Timer<br/>&nbsp;&nbsp;&nbsp; Range(Range("D2"), Range("F" &amp; Range("d65536").End(xlUp).Row + 1)).ClearContents<br/>&nbsp;&nbsp;&nbsp; k = 1<br/>&nbsp;&nbsp;&nbsp; l = 1<br/>&nbsp;&nbsp;&nbsp; m = 1<br/>&nbsp;&nbsp;&nbsp; x = Range("a65536").End(xlUp).Row<br/>&nbsp;&nbsp;&nbsp; y = Range("b65536").End(xlUp).Row<br/>&nbsp;&nbsp;&nbsp; arr1 = Range("A2:A" &amp; x)<br/>&nbsp;&nbsp;&nbsp; arr2 = Range("B2:B" &amp; y)<br/>&nbsp;&nbsp;&nbsp; ReDim arr3(1 To UBound(arr1), 1 To 1)<br/>&nbsp;&nbsp;&nbsp; ReDim arr4(1 To UBound(arr2), 1 To 1)<br/>&nbsp;&nbsp;&nbsp; ReDim arr5(1 To UBound(arr2), 1 To 1)<br/>&nbsp;&nbsp;&nbsp; For i = 1 To x - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j = 1 To y - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If arr1(i, 1) = arr2(j, 1) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr5(m, 1) = arr1(i, 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr1(i, 1) = ""<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr2(j, 1) = ""<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = m + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit For<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next j<br/>&nbsp;&nbsp;&nbsp; Next i<br/>&nbsp;&nbsp;&nbsp; For i = 1 To x - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If arr1(i, 1) &lt;&gt; "" Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr3(k, 1) = arr1(i, 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = k + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If arr2(i, 1) &lt;&gt; "" Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr4(l, 1) = arr2(i, 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l = l + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next<br/>&nbsp;&nbsp;&nbsp; Sheet1.Range("D2").Resize(k - 1, 1) = arr3<br/>&nbsp;&nbsp;&nbsp; Sheet1.Range("D2").Offset(k - 1, 0).Resize(m - 1, 1) = arr5<br/>&nbsp;&nbsp;&nbsp; Sheet1.Range("D2").Offset(k + m - 2, 0).Resize(l - 1, 1) = arr4<br/>&nbsp;&nbsp;&nbsp; Sheet1.Range("e2").Resize(k - 1, 1) = arr3<br/>&nbsp;&nbsp;&nbsp; Sheet1.Range("f2").Resize(l - 1, 1) = arr4<br/>&nbsp;&nbsp;&nbsp; MsgBox Timer - t<br/>End Sub
[此贴子已经被作者于2008-1-9 21:47:03编辑过]
回复

使用道具 举报

发表于 2008-1-9 21:35 | 显示全部楼层
回复

使用道具 举报

发表于 2008-1-9 21:38 | 显示全部楼层

学习一下。
回复

使用道具 举报

发表于 2008-1-9 22:59 | 显示全部楼层

<p>Sub 唯一值循环法()<br/>if [d2]="" then Range("d2:d" &amp; Range("d65536").End(xlUp).Row) = ""<br/>&nbsp;Dim arr1, arr2, arr3()<br/>&nbsp;arr1 = Range("a2:a11")<br/>&nbsp;arr2 = Range("b2:b11")<br/>&nbsp;ReDim arr3(1 To UBound(arr1) + UBound(arr2), 1 To 1)<br/>&nbsp;For x = 1 To UBound(arr1)<br/>&nbsp;&nbsp; arr3(x, 1) = arr1(x, 1)<br/>&nbsp;Next x<br/>&nbsp;'-------------------------<br/>&nbsp;For z = 1 To UBound(arr2)<br/>&nbsp;&nbsp; For y = 1 To UBound(arr1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; If arr2(z, 1) = arr1(y, 1) Then GoTo 100<br/>&nbsp;&nbsp; Next y<br/>&nbsp;&nbsp; k = k + 1<br/>&nbsp;&nbsp; arr3(x + k - 1, 1) = arr2(z, 1)<br/>100:<br/>&nbsp; Next z<br/>&nbsp;Range("d2").Resize(k + x) = arr3<br/>End Sub</p><p>第一句不加判断,就会在开始执行是时清除D2的标题</p>
回复

使用道具 举报

发表于 2008-1-10 00:00 | 显示全部楼层

<p>Sub 唯一的编号()<br/>Range("d2:d23") = ""<br/>Dim mrg As Range, arr(), arr1(), x%, m%, t%, n%<br/>ReDim arr(1 To 22, 1 To 1)<br/>For Each mrg In Range("a2:b11")<br/>If mrg &lt;&gt; "" Then<br/>k = k + 1<br/>arr(k, 1) = mrg<br/>End If<br/>Next mrg<br/>ReDim arr1(1 To 22, 1 To 1)<br/>t = 1<br/>For m = 1 To 22<br/>For x = 2 + t - 1 To 22<br/>If arr(x, 1) = arr(t, 1) Then<br/>arr(x, 1) = ""<br/>End If<br/>Next x<br/>If arr(t, 1) &lt;&gt; "" Then<br/>n = n + 1<br/>arr1(n, 1) = arr(t, 1)<br/>End If<br/>t = t + 1<br/>Next m<br/>Range("d2:d23") = arr1<br/>End Sub</p><p>先把两列合成一列 再去重复</p>
回复

使用道具 举报

发表于 2008-1-10 10:44 | 显示全部楼层

<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>lpz001</i>在2008-1-9 20:02:00的发言:</b><br/>来啦!</div><p></p>
回复

使用道具 举报

发表于 2008-1-10 10:58 | 显示全部楼层

<p><font size="1">Sub 唯一编号普通()<br/>&nbsp; Dim z%, x%, y%<br/>&nbsp; z = 2<br/>&nbsp; For y = 1 To 2<br/>&nbsp;&nbsp;&nbsp; x = Cells(65536, y).End(xlUp).Row<br/>&nbsp;&nbsp;&nbsp; Range(Cells(2, y), Cells(x, y)).Copy Range("d" &amp; z)<br/>&nbsp;&nbsp;&nbsp; z = [d65536].End(xlUp).Row + 1<br/>&nbsp; Next<br/>&nbsp;&nbsp;&nbsp; Range("d2:d" &amp; z).AdvancedFilter Action:=xlFilterInPlace, Unique:=True<br/>End Sub</font></p><p><font size="1">Sub 唯一编号数组()<br/>&nbsp;&nbsp;&nbsp; Dim arr1, arr2, arr3(), z%, x%, y%<br/>&nbsp; arr1 = Range("a2:a11")<br/>&nbsp; arr2 = Range("b2:b11")<br/>&nbsp; ReDim Preserve arr3(1 To 20, 1 To 1)<br/>&nbsp; For z = 1 To 10<br/>&nbsp;&nbsp;&nbsp; arr3(z, 1) = arr1(z, 1)<br/>&nbsp; Next<br/>&nbsp; z = z - 1<br/>&nbsp; For y = 1 To 10<br/>&nbsp;&nbsp;&nbsp; For x = 1 To 10<br/>&nbsp;&nbsp;&nbsp; If arr2(y, 1) = arr1(x, 1) Then GoTo 100<br/>&nbsp;&nbsp;&nbsp; Next<br/>&nbsp;&nbsp;&nbsp; z = z + 1<br/>&nbsp; arr3(z, 1) = arr2(y, 1)<br/>100<br/>&nbsp; Next<br/>&nbsp;Range("d2").Resize(20, 1) = arr3<br/>End Sub<br/></font></p><p><font size="1">Sub 唯一编号字典()<br/>&nbsp; Dim d As New Dictionary<br/>&nbsp; Dim arr1, arr2, x%, y%<br/>&nbsp; arr1 = Range("a2:a11")<br/>&nbsp; arr2 = Range("b2:b11")<br/>&nbsp; For x = 1 To UBound(arr1)<br/>&nbsp;&nbsp; d(arr1(x, 1)) = ""<br/>&nbsp; Next x<br/>&nbsp; For y = 1 To UBound(arr2)<br/>&nbsp;&nbsp;&nbsp; d(arr2(y, 1)) = ""<br/>&nbsp; Next y<br/>&nbsp; Range("d2").Resize(d.Count) = Application.Transpose(d.Keys)<br/>End Sub<br/></font></p><p><font size="1">Sub 物品1有物品2没有()<br/>&nbsp; Dim arr1, arr2, z%, x%, y%<br/>&nbsp; arr1 = Range("a2:a11")<br/>&nbsp; arr2 = Range("b2:b11")<br/>&nbsp; For y = 1 To 10<br/>&nbsp;&nbsp;&nbsp; For x = 1 To 10<br/>&nbsp;&nbsp;&nbsp; z = [e65536].End(xlUp).Row + 1<br/>&nbsp;&nbsp;&nbsp; If arr1(y, 1) = arr2(x, 1) Then GoTo 100<br/>&nbsp;&nbsp;&nbsp; Next<br/>&nbsp;&nbsp;&nbsp; Range("e" &amp; z) = arr1(y, 1)<br/>100<br/>&nbsp; Next<br/>End Sub</font></p>
[此贴子已经被作者于2008-1-10 10:58:17编辑过]
回复

使用道具 举报

发表于 2008-1-10 16:18 | 显示全部楼层

这次的收获真大,以前从未使用过字典,不知道会不会用[em01][em01][em01]
回复

使用道具 举报

发表于 2008-1-20 20:20 | 显示全部楼层

<p>同学们好,老师辛苦了</p>
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 22:47 , Processed in 0.291146 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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