以文本方式查看主题 - Foxtable(狐表) (http://www.foxtable.com/bbs/index.asp) -- 专家坐堂 (http://www.foxtable.com/bbs/list.asp?boardid=2) ---- [求助]批量查找替换 (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=99576) |
||||
-- 作者:13865161910 -- 发布时间:2017/4/21 16:31:00 -- [求助]批量查找替换 现有表A,[列a][列b] 数据如下: [列a] [列b] ZL0001 ZL0004 ZL0003 ZL0004 ZL0002 ZL0018 ... 表B, [列1] [列2] ZL0001 JLT-10124 ZL0002 JLT-02023 ZL0003 JLT-10121 ZL0004 JLT-45001 ... ZL0018 JLT-12315 请教,如果将表A中[列a][列b]的内容 根据表B的[列1]的内容替换成对应[列2]内容,匹配替换,而非覆盖替换,因为单元格中还存在其他内容,代码如何编辑? |
||||
-- 作者:有点色 -- 发布时间:2017/4/21 16:51:00 -- For Each dr As DataRow In DataTables("表a").DataRows Dim fdr As DataRow = DataTables("表B").find("第一列 = \'" & dr("第一列") & "\'") If fdr IsNot Nothing Then dr("第二列") = fdr("第二列") End If Next |
||||
-- 作者:13865161910 -- 发布时间:2017/4/21 17:14:00 -- 回复:(有点色)For Each dr As DataRow In DataTabl... 额,好像这个不是将表A中的两列内容根据表B中的内容同时替换把??? 现有表A,[列a][列b] 数据如下: [列a] [列b] ZL0001 ZL0004 ZL0003 ZL0004 ZL0002 ZL0018 ... 表B, [列1] [列2] ZL0001 JLT-10124 ZL0002 JLT-02023 ZL0003 JLT-10121 ZL0004 JLT-45001 ... ZL0018 JLT-12315 希望替换后的效果 表A变成 [列a] [列b] JLT-10124 JLT-45001 JLT-10121 JLT-45001 JLT-02023 JLT-12315 [此贴子已经被作者于2017/4/21 17:16:49编辑过]
|
||||
-- 作者:有点色 -- 发布时间:2017/4/21 17:17:00 -- 以下是引用13865161910在2017/4/21 17:14:00的发言:
额,好像这个不是将表A中的两列内容根据表B中的内容同时替换把???
你根据第一列查找,替换的是第二列。 |
||||
-- 作者:13865161910 -- 发布时间:2017/4/21 17:17:00 -- 回复:(有点色)以下是引用13865161910在2017/4/21 1... 见附件
表C为表A的内容通过查询表B后获得结果
[此贴子已经被作者于2017/4/21 17:31:09编辑过]
|
||||
-- 作者:有点色 -- 发布时间:2017/4/21 17:35:00 -- Dim cs() As String = {"第一列", "第二列"} \'表A要替换的列名 For Each dr As DataRow In DataTables("表a").DataRows For Each c As String In cs For Each cdr As DataRow In DataTables("表B").Select("第一列 is not null") If dr(c).Contains(cdr("第一列")) Then dr(c) = dr(c).replace(cdr("第一列"), cdr("第二列")) Exit For End If Next Next Next |
||||
-- 作者:有点色 -- 发布时间:2017/4/21 17:37:00 -- Dim cs() As String = {"前号码", "后号码"} \'表A要替换的列名 For Each dr As DataRow In DataTables("表a").DataRows For Each c As String In cs For Each cdr As DataRow In DataTables("表B").Select("zl号码 is not null") If dr(c).Contains(cdr("zl号码")) Then dr(c) = dr(c).replace(cdr("zl号码"), cdr("jlt号码")) Exit For End If Next Next Next |
||||
-- 作者:13865161910 -- 发布时间:2017/4/22 10:17:00 -- 以下是引用有点色在2017/4/21 17:37:00的发言:
感谢老师帮助!
Dim cs() As String = {"前号码", "后号码"} \'表A要替换的列名 For Each dr As DataRow In DataTables("表a").DataRows For Each c As String In cs For Each cdr As DataRow In DataTables("表B").Select("zl号码 is not null") If dr(c).Contains(cdr("zl号码")) Then dr(c) = dr(c).replace(cdr("zl号码"), cdr("jlt号码")) Exit For End If Next Next Next [此贴子已经被作者于2017/4/22 10:17:53编辑过]
|
||||
-- 作者:13865161910 -- 发布时间:2017/4/22 10:24:00 -- 回复:(有点色)Dim cs() As String = {"前号码", "后... 还有个小问题需要请教! 如果表a的某一列,存在两个编码需要根据表B的对照表进行转换,代码需要如何优化?! 比如 表a 前号码 后号码 ZL0001 ZL0006/ZL0016 ... 表b ZL号码 JLT号码 ZL0001 JLT-01001 ... ZL0006 JLT-06023 .. ZL0016 JLT-19023 目前替换后的效果是: 前号码 后号码 JLT-01001 JLT-06023/ZL0016 需要重复执行一次代码,实现替换效果 能否直接变成? 前号码 后号码 JLT-01001 JLT-06023/JLT-19023 另,老师能否给个注释,解释一下这个代码的逻辑分析!毕竟其中有好几个遍历,还有If语句!有点懵 [此贴子已经被作者于2017/4/22 10:25:04编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2017/4/22 10:58:00 -- 7楼代码把Exit For去掉就行了。 你这个逻辑也就只能这样处理,慢是肯定的 For Each dr As DataRow In DataTables("表a").DataRows 逐行循环替换 For Each c As String In cs 循环需要替换的列 For Each cdr As DataRow In DataTables("表B").Select("zl号码 is not null") 循环所有表B号码不为空的行 If dr(c).Contains(cdr("zl号码")) Then 如果表A某行某列的内容包含这个zl号码 dr(c) = dr(c).replace(cdr("zl号码"), cdr("jlt号码"))进行替换 Exit For退出此单元格的替换操作,如果一个单元格有多个号码要替换,去掉这行代码 End If Next Next Next 要想优化代码,要对录入的数据做一些限定,比如表A存储的号码是这样:[ZL0006]/[ZL0016],就可以方便的提取号码,不需要循环进行包含判断。当然这样需要数据来源方进行配合。
|