网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月02日漏签0天
excel吧 关注:281,443贴子:1,550,840
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回excel吧
>0< 加载中...

测试VBA代码去重复效率,求解优化代码

  • 只看楼主
  • 收藏

  • 回复
  • 秦時明月漢時圓
  • 以E待劳
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
RT,今天测试了200000组数据,随机值为区间范围[200,720]的随机整数,测试结果如图:

代码如下:
Sub 命令式去重复()
Dim arr, r As Long, t As Single
t = Timer
r = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("a3:a" & r)
Range("b2:b" & r).ClearContents
[b3].Resize(UBound(arr)) = arr
Range("b3:b" & r).RemoveDuplicates _
Columns:=1, Header:=xlNo
[b2] = Format(Timer - t, "0.0000秒")
End Sub
Sub 字典法去重复()
Dim arr, dic_keys
Dim r As Long
Dim t As Single
Dim dic As Object
t = Timer
Set dic = CreateObject("Scripting.Dictionary")
r = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("a3:a" & r)
For i = 1 To UBound(arr)
dic(arr(i, 1)) = ""
Next
dic_keys = dic.Keys
ReDim brr(1 To dic.Count, 1 To 1)
For i = 1 To dic.Count
brr(i, 1) = dic_keys(i - 1)
Next
Range("c2:c" & r).ClearContents
[c3].Resize(dic.Count) = brr
[c2] = Format(Timer - t, "0.0000秒")
End Sub
Sub 数组法去重复()
Dim arr, brr, tmp
Dim i As Long, n As Long
Dim r As Long, t As Single
t = Timer
r = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("a3:a" & r)
ReDim brr(1 To UBound(arr), 1 To 1)
For i = 1 To UBound(arr)
tmp = arr(i, 1)
For j = 1 To i
If brr(j, 1) = tmp Then GoTo line
Next
n = n + 1
brr(n, 1) = tmp
line:
Next
Range("d2:d" & r).ClearContents
[d3].Resize(n) = brr
[d2] = Format(Timer - t, "0.0000秒")
End Sub
Sub 标记法去重复()
Dim arr, brr, tmp
Dim i As Long, found As Long
Dim t As Single, r As Long
t = Timer
r = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("a3:a" & r)
ReDim brr(1 To UBound(arr), 1 To 1)
For i = 1 To UBound(arr)
tmp = arr(i, 1)
For j = 1 To i
If arr(j, 1) = tmp Then
found = found + 1
End If
Next
If found = 1 Then
n = n + 1
brr(n, 1) = tmp
End If
found = 0
Next
Range("e2:e" & r).ClearContents
[e3].Resize(n) = brr
[e2] = Format(Timer - t, "0.0000秒")
End Sub
Sub 生成随机数()
Dim i As Long, arr(1 To 200000, 1 To 1)
For i = 1 To 200000
Randomize
arr(i, 1) = 520 * Rnd \ 1 + 200
Next
[a3:a200002].ClearContents
[a3].Resize(200000) = arr
End Sub
目前看来当关键字很少,字典取重复效率最高。那么问题来了,如果不用字典,请问代码怎么优化?


  • 夜辰无星
  • E通百通
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
sql呢


2025-08-02 11:12:03
广告
不感兴趣
开通SVIP免广告
  • zipall
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
字典法
dic(arr(i, 1)) = 0(或=null) 比=""效率高


  • 硫酸下
  • E夫当关
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Sub 去重复()
Dim arr, dic_keys
Dim r As Long
Dim t As Single
Dim dic As Object
t = Timer
r = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("a3:a" & r)
k = "の"
For i = 1 To UBound(arr)
If InStr(k, "の" & arr(i, 1) & "の") = 0 Then k = k & arr(i, 1) & "の"
Next
brr = Split(Mid(k, 2, Len(k)), "の")
[C3].Resize(UBound(brr) + 1) = Application.Transpose(brr)
[c2] = Format(Timer - t, "0.0000秒")
End Sub
也慢,文本就慢


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回excel吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示