ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 Office知识技巧免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 603|回复: 21

[求助] 几十万字符数据如何快速检索

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-25 18:16 | 显示全部楼层 |阅读模式
我有个excel文件,sheet1是原始数据,里面有26列,最大的有50w行数据,都是英文或中文字符;sheet2是要搜索的关键字,1列,上万行。现在要实现sheet2中的关键字在sheet1中查找搜索,如果那行包含有关键字,高亮显示关键字所在行。我用instr循环处理,速度太慢了,哪位高手能给指点一下,最好能给个vba代码。

1.rar

26.97 KB, 下载次数: 40

a

TA的精华主题

TA的得分主题

发表于 2019-12-25 18:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-25 19:57 | 显示全部楼层
附件供参考,不知道数据多了会不会很慢

1.zip

36 KB, 下载次数: 9

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2019-12-25 20:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-25 20:33 | 显示全部楼层
12W行数据3s运行时间,包含关键字的行整行高亮显示
  1. Sub demo()
  2.     Dim t As Double
  3.     t = Timer
  4.     Application.ScreenUpdating = False
  5.     Application.Calculation = xlCalculationManual
  6.     Dim reg As Object, i As Long, j As Long, rnum As Long, lnum As Long, dataArr, tempArr, str As String
  7.     With Worksheets("Sheet2")
  8.     dataArr = .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value
  9.     str = "("
  10.     For i = 1 To UBound(dataArr) - 1
  11.         If Not IsEmpty(dataArr(i, 1)) Then
  12.             str = str & dataArr(i, 1) & "|"
  13.         End If
  14.     Next i
  15.     str = str & dataArr(UBound(dataArr), 1) & ")"
  16.     End With
  17.     rnum = Cells(Rows.Count, 1).End(xlUp).Row
  18.     lnum = Cells(1, Columns.Count).End(xlToLeft).Column
  19.     Range(Cells(2, lnum + 1), Cells(rnum, lnum + 1)).Value = 1
  20.     tempArr = Range(Cells(2, lnum + 1), Cells(rnum, lnum + 1)).Value
  21.     dataArr = Range(Cells(2, 1), Cells(rnum, lnum)).Value
  22.     Set reg = CreateObject("vbscript.regexp")
  23.     With reg
  24.         .Global = True
  25.         .MultiLine = True
  26.         .Pattern = str
  27.         For i = 1 To UBound(dataArr)
  28.             For j = 1 To UBound(dataArr, 2)
  29.                 If .test(dataArr(i, j)) Then
  30.                     tempArr(i, 1) = Empty
  31.                     GoTo continnue
  32.                 End If
  33.             Next j
  34. continnue:
  35.         Next i
  36.     End With
  37.     Set reg = Nothing: Erase dataArr
  38.     Range(Cells(2, lnum + 1), Cells(rnum, lnum + 1)).Value = tempArr
  39.     Range(Cells(2, lnum + 1), Cells(rnum, lnum + 1)).SpecialCells(xlCellTypeBlanks).EntireRow.Interior.ColorIndex = 8
  40.     Cells(1, lnum + 1).EntireColumn.Delete
  41.     Application.Calculation = xlCalculationAutomatic
  42.     Application.ScreenUpdating = True
  43.     Debug.Print Format(Timer - t, ("0.00000"))
  44. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-12-25 21:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-25 22:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-26 00:42 | 显示全部楼层
楼主的意思是sheet2中的那些关键字还指不定会出现在sheet1中的那一列是吗?

TA的精华主题

TA的得分主题

发表于 2019-12-26 00:49 | 显示全部楼层
  1. Sub test()
  2.     Dim V As Variant, V2 As Variant
  3.     Dim R As Long, R2 As Long, X As Long, Y As Long, I As Long
  4.     Dim B() As Boolean
  5.     Dim T As Double
  6.     Application.ScreenUpdating = False
  7.     T = Timer
  8.     With Sheet2
  9.         R2 = .Range("A1").End(xlDown).Row
  10.         V2 = .Range("A1").Resize(R2, 1).Value
  11.     End With
  12.     With Sheet1
  13.         R = .Range("A1").End(xlDown).Row
  14.         ReDim B(1 To R)
  15.         For X = 1 To 26
  16.             V = .Cells(1, X).Resize(R, 1).Value
  17.             For Y = 2 To R
  18.                 If Not B(Y) Then
  19.                     For I = 1 To R2
  20.                         If InStr(1, V(Y, 1), V2(I, 1), vbTextCompare) > 0 Then
  21.                             .Rows(Y).Interior.Color = 5296274
  22.                             B(Y) = True
  23.                             Exit For
  24.                         End If
  25.                     Next
  26.                 End If
  27.             Next
  28.             V = Empty
  29.         Next
  30.     End With
  31.     Debug.Print Format(Timer - T, ("0.00000"))
  32.     Application.ScreenUpdating = True
  33. End Sub
复制代码


我真的将sheet1中复制粘贴成了五十万行数据,而且发现一次性读取五十万行26列的数据会报溢出,不得已用了For X = 1 To 26,V = .Cells(1, X).Resize(R, 1).Value这样的办法,sheet2中就那五个关键字。即便这种情况下,上面代码我这里也运行了一分钟多点。

TA的精华主题

TA的得分主题

发表于 2019-12-26 07:37 | 显示全部楼层
直接用SQL另外做出一张数据表得了,50万行还标颜色,不知道需要多少时间了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2020-4-7 19:37 , Processed in 0.073368 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

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