Excel精英培训网

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

[已解决]excel高级替换,部分替换匹配的内容,内含excel文件

[复制链接]
发表于 2017-1-10 20:36 | 显示全部楼层 |阅读模式
excel高级替换,部分替换匹配的内容,内含excel文件,文件中包含对问题的描述!!!
最佳答案
2017-1-11 14:03
本帖最后由 today0427 于 2017-1-11 15:07 编辑

我估计,第一,要替换的数据源还有很多;第二,道路名称也不可能只有H13一个,也就是说要替换的关键词可能会有变化,因此做了个通用的自定义函数。
效果如图:左边黄色区域分别是数据源,要替换的关键字和替换结果,右边蓝色区域是道路代码及字符串(注意,找到就替换,找不到就照抄)
2017-01-11_13-59-48.jpg



  1. Dim d As Object, n%
  2. Function td(rng As Range, s$) As String
  3.     If n = 0 Then Call csh
  4.     Dim str$, ar, a, j%, ks$, js$, mh
  5.         a = Split(rng.Text, " ")
  6.         For j = 0 To UBound(a)
  7.             If a(j) = s Then ks = a(j - 1): js = a(j + 1): Exit For
  8.         Next
  9.         With CreateObject("vbscript.regexp")
  10.             .Pattern = ks & "(.*)?" & js
  11.             Set mh = .Execute(d(s))
  12.             If mh.Count = 0 Then
  13.                 td = rng
  14.             Else
  15.                 str = Trim(mh(0).submatches(0))
  16.                 td = Replace(rng.Text, s, str)
  17.             End If
  18.         End With
  19. End Function
  20. Sub csh()
  21.     Dim arr
  22.     Set d = CreateObject("scripting.dictionary")
  23.         arr = Range("e2:f" & [e65536].End(3).Row)
  24.         For i = 1 To UBound(arr)
  25.             d(arr(i, 1)) = arr(i, 2)
  26.         Next
  27.     n = 1
  28. End Sub
复制代码
捕获.PNG

高级替换---求助.zip

6.98 KB, 下载次数: 19

发表于 2017-1-10 22:12 | 显示全部楼层
回复

使用道具 举报

发表于 2017-1-11 11:50 | 显示全部楼层
不用Vba 就是坑

下面是 ( 纯函数 + 辅助单元格 ) , 别问 为什么
高级替换-(坑)--求助.rar (10.31 KB, 下载次数: 15)
回复

使用道具 举报

发表于 2017-1-11 14:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 today0427 于 2017-1-11 15:07 编辑

我估计,第一,要替换的数据源还有很多;第二,道路名称也不可能只有H13一个,也就是说要替换的关键词可能会有变化,因此做了个通用的自定义函数。
效果如图:左边黄色区域分别是数据源,要替换的关键字和替换结果,右边蓝色区域是道路代码及字符串(注意,找到就替换,找不到就照抄)
2017-01-11_13-59-48.jpg



  1. Dim d As Object, n%
  2. Function td(rng As Range, s$) As String
  3.     If n = 0 Then Call csh
  4.     Dim str$, ar, a, j%, ks$, js$, mh
  5.         a = Split(rng.Text, " ")
  6.         For j = 0 To UBound(a)
  7.             If a(j) = s Then ks = a(j - 1): js = a(j + 1): Exit For
  8.         Next
  9.         With CreateObject("vbscript.regexp")
  10.             .Pattern = ks & "(.*)?" & js
  11.             Set mh = .Execute(d(s))
  12.             If mh.Count = 0 Then
  13.                 td = rng
  14.             Else
  15.                 str = Trim(mh(0).submatches(0))
  16.                 td = Replace(rng.Text, s, str)
  17.             End If
  18.         End With
  19. End Function
  20. Sub csh()
  21.     Dim arr
  22.     Set d = CreateObject("scripting.dictionary")
  23.         arr = Range("e2:f" & [e65536].End(3).Row)
  24.         For i = 1 To UBound(arr)
  25.             d(arr(i, 1)) = arr(i, 2)
  26.         Next
  27.     n = 1
  28. End Sub
复制代码

高级替换---求助.rar

18.11 KB, 下载次数: 19

回复

使用道具 举报

 楼主| 发表于 2017-1-13 07:48 | 显示全部楼层
砂海 发表于 2017-1-11 11:50
不用Vba 就是坑

下面是 ( 纯函数 + 辅助单元格 ) , 别问 为什么

谢谢你的帮助
回复

使用道具 举报

 楼主| 发表于 2017-1-13 07:49 | 显示全部楼层
today0427 发表于 2017-1-11 14:03
我估计,第一,要替换的数据源还有很多;第二,道路名称也不可能只有H13一个,也就是说要替换的关键词可能 ...

请受我一拜[em17]
回复

使用道具 举报

发表于 2017-1-13 07:58 | 显示全部楼层
神人,你都做到工机料替换了。考过一建后我也做一个
回复

使用道具 举报

发表于 2017-1-13 10:39 | 显示全部楼层
下载学习一下!
回复

使用道具 举报

发表于 2017-1-13 15:27 | 显示全部楼层
4楼的基础上再加个反向查找就完美了。
  1. Dim d, dr, n%
  2. Function td(rng As Range, s$) As String
  3.     If n = 0 Then Call csh
  4.     Dim str$, ar, a, j%, ks$, js$, mh
  5.         a = Split(rng.Text, " ")
  6.         For j = 0 To UBound(a)
  7.             If a(j) = s Then ks = a(j - 1): js = a(j + 1): Exit For
  8.         Next
  9.         With CreateObject("vbscript.regexp")
  10.             .Pattern = ks & "(.*)?" & js
  11.             Set mh = .Execute(d(s))
  12.             If mh.Count = 0 Then Set mh = .Execute(dr(s))   '如果正向没有,反向查找一遍
  13.             If mh.Count = 0 Then
  14.                 td = rng
  15.             Else
  16.                 str = Trim(mh(0).submatches(0))
  17.                 td = Replace(rng.Text, s, str)
  18.             End If
  19.         End With
  20. End Function
  21. Sub csh()
  22.     Dim arr
  23.     Set d = CreateObject("scripting.dictionary")
  24.     Set dr = CreateObject("scripting.dictionary")    '反向
  25.     arr = Range("d2:e" & [e65536].End(3).Row)
  26.     For i = 1 To UBound(arr)
  27.         xrr = Split(arr(i, 2), " ")
  28.         For k = UBound(xrr) To 0 Step -1
  29.             y = y & " " & xrr(k)
  30.         Next
  31.         d(arr(i, 1)) = arr(i, 2)
  32.         dr(arr(i, 1)) = Mid(y, 2)
  33.     Next
  34.     n = 1
  35. End Sub
复制代码

高级替换---求助.rar

15.49 KB, 下载次数: 25

点评

如果再完美一点应该把替换关键词的参数设为多参数 一次可以同时替换多个关键词 哈哈哈  发表于 2017-1-13 16:52
回复

使用道具 举报

 楼主| 发表于 2017-2-5 23:07 | 显示全部楼层
grf1973 发表于 2017-1-13 15:27
4楼的基础上再加个反向查找就完美了。

两位大神新年快乐,谢谢你们的指导!        最后的问题就是多参数时怎么替换,数据量非常大,单个替换臣妾办不到啊[em06]

问题最新描述见下图,请指教!
00001.PNG
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 17:04 , Processed in 0.363025 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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