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

 
 
 
日一二三四五六
       
       
       
       
       
       

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

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

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月23日漏签0天
vba吧 关注:17,094贴子:66,989
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

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

思路决定运行速度

  • 只看楼主
  • 收藏

  • 回复
  • 国泰家美
  • 四方游侠
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
思路决定运行速度
excel提取重复值的数量(筛选出唯一值的数量)有很多方法,不同方法的运行速度差别很大,尤其在处理海量数据是选择不当的话速度能让人崩溃。
要提取重复值的数量分删除重复值+重复值计数2个动作,在低版本的excel一般采用函数Countif、函数match等求的处理,对于海量数据简直是煎熬,用高级筛选或删除重复值速度能稍微少一些,至于用VBA的字典或集合等方式更是蛮不可以,80万行数据要4000s才能给出结果。有没有更迅捷的方式?
下面是新写自定义函数适合所有excel版本,速度超快,100万行数据4s出数据,堪比高版本新出的函数unique。
思路:备份数据、原位排序、数组计数、恢复数据、输出
Function dys(a As Range) As Long'独有数
'a为在同一列內单元格区域,默认没有合并单元格,空行忽略不计数
i = Range(a.Cells(1, 1), a.Cells(a.Rows.Count, 1)) '把原始数据保存,最后再恢复
a.Cells(1, 1).Select
Range(a.Cells(1, 1), a.Cells(a.Rows.Count, 1)).Sort Key1:=a.Cells(1, 1), Order1:=1 '把原始数据排序便于比较
h = Range(a.Cells(1, 1), a.Cells(Cells(1048576, Selection.Column).End(xlUp).Row - a.Cells(1, 1).Row + 1, 1)) '把排序数据存入新数组提高比较运行速度
a.Cells(1, 1).Resize(UBound(i), 1) = i: Set i = Nothing'恢复数据、释放内存
For i = 2 To UBound(h)
If h(i, 1) = h(i - 1, 1) Then c = c + 1’对重复值计数,不能采用h(i, 1)<>h(i - 1, 1)N
ext
i = UBound(h) - c
Set h = Nothing'释放内存
dys = i
End Function


  • 国泰家美
  • 四方游侠
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
设计唯一值/独有值提取还有一个案例,求2列数据的独有值(A列有且不在J列的称A列独有值)
在低版本的excel一般采用函数Countif、函数match、函数vlookup等的处理,对于海量数据简直是煎熬,至于用VBA的字典或集合等方式更是蛮不可以,80万行数据要4000s才能给出结果。有没有更迅捷的方式?
用删除重复值速度大约20s(2列都是60多万行为例):A列数据复制到J列数据下,执行数据-删除重复值,J列数据下面就是A列独有值,J列同理。
有没有更快的方式,采用VBa调用更成熟的bat处理,写个自定义函数,3s出结果。
vba:我数据从3行开始
aa= Range("a3:a" & [a1048576].End(xlUp).Row)
jj= Range("j3:j" & [j1048576].End(xlUp).Row)
Workbooks.Add
[a1].Resize(UBound(aa), 1) = aa
ActiveWorkbook.SaveAs Filename:="G:\319\a.txt",FileFormat:=xlUnicodeText, CreateBackup:=False
[a1].Resize(UBound(aa), 1).Clear: Set aa = Nothing
[a1].Resize(UBound(jj), 1) = jj: Set jj = Nothing
ActiveWorkbook.SaveAs Filename:="G:\319\j.txt", FileFormat:=xlUnicodeText,CreateBackup:=False
ActiveWorkbook.Close
Setwsh = CreateObject("WScript.Shell")
result = wsh.Run("""" & "G:\319\求独有.bat"& """", 0, True)
Workbooks.Open Filename:="G:\319\独有a.txt"
aa= Range("a1:a" & [a1048576].End(xlUp).Row)
ActiveWorkbook.Close
Range("a" & [a1048576].End(xlUp).Row +1).Resize(UBound(aa), 1) = aa: Set aa = Nothing
Workbooks.Open Filename:="G:\319\独有j.txt"
aa= Range("a1:a" & [a1048576].End(xlUp).Row)
ActiveWorkbook.Close
bat脚本
<#*,:
@璐村惂鐢ㄦ埛_000076K馃惥 off
cd /d "%~dp0"
set "batchfile=%~f0"
Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
exit /b
#>
# a.txt j.txt 生成独有文件
$srca = "a.txt" # 文件 a.txt
$srcj = "j.txt" # 文件 j.txt
$dsta = "独有a.txt" #文件 独有a.txt
$dstj = "独有j.txt" #文件 独有j.txt
foreach ($item in $srca, $srcj) {
if (-not [IO.File]::Exists($item)) {
"找不到文件:$item"
return
}
}
$watch = [System.Diagnostics.Stopwatch]::StartNew() # 计时器
Add-Type -AssemblyName System.Core
# 读取$srca
"读取文件:$srca"
$linesa = [IO.File]::ReadAllLines($srca)
# 读取$srcj
"读取文件:$srcj"
$linesj = [IO.File]::ReadAllLines($srcj)
# 兼容ps2.0,需要先获取GenericMethod
$method_except = [System.Linq.Enumerable].GetMethods() | Where-Object { $_.Name -eq 'Except' } | Select-Object -First 1
$method_except_string = $method_except.MakeGenericMethod([string])
# 生成$dsta
"生成文件:$dsta"
$method_except_string.Invoke($null, @($linesa, $linesj)) | Set-Content -LiteralPath $dsta
# 生成$dstj
"生成文件:$dstj"
$method_except_string.Invoke($null, @($linesj, $linesa)) | Set-Content -LiteralPath $dstj
"脚本用时:"
$watch.Elapsed #统计脚本用时


2026-06-23 17:36:46
广告
不感兴趣
开通SVIP免广告
  • 终于不瘦了
  • 仗剑天涯
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Excel处理数据量较小是很不错的,但像这类数据量大的问题还是使用一些数据库工具用SQL查询比较好


  • ISD_狮子座
  • 江湖少侠
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ADO引用数据盘表,然后SQL GROUP BY 就出结果了


  • ISD_狮子座
  • 江湖少侠
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼



用的就是ADO的方式,1048576数据去重


  • ISD_狮子座
  • 江湖少侠
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2列10位 1048576行 1000000000到1000001000的随机数分别去重



登录百度账号

扫二维码下载贴吧客户端

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