修改公式或者哪位给我写一段代码 名称匹配问题,谢谢!

sweetskymoon 2011-06-02 11:12:29
请各位大侠帮我修改一下公式,sheet1 A列的名称和sheet2里A列的名称略有不同,但是是同一个客户,关键字匹配问题
=INDEX(Sheet2!A:A,MIN(IF(COUNTIF(A2,"*"&LEFT(Sheet2!$A$1:$A$30,2)&"*"&RIGHT(Sheet2!$A$1:$A$30,LEN(Sheet2!$A$1:$A$30)-2)&"*"),ROW(Sheet2!$A$1:$A$30),4^8)),)

这个公式有一些名称匹配不出来,不知道什么原因
小弟第一次在此发帖求助,连附件上传都没找到,不知道各位大侠是否理解
如果用程序有更好的方法,请赐教 再次多谢!
...全文
178 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweetskymoon 2011-06-05
  • 打赏
  • 举报
回复
恩 麻烦你了
z_wenqian 2011-06-05
  • 打赏
  • 举报
回复
我看了,不过不好意思,做不出来。

我开始时用 VLOOKUP 找出一半,将这一半剔除后,又把 sheet2 中重复的七千多个删掉,然后开始运行我的代码,结果发现不可行:
1.太慢,我的笔记本配置还行:i5 M560 CPU,2G内存,半小时没转出来,只好中断。
2.我用10个数据实验,发现错误大概在2-4个。

没办法,还是不知道如何取关键点,不好意思了。

如果你执意要用我的代码,建议将sheet1数据分段做(100个),否则(考验耐心)......最坏的情况:崩溃、死机、没有结果。
sweetskymoon 2011-06-04
  • 打赏
  • 举报
回复
其实现在是8000多条数据从5W多条数据里来找 可以匹配出来很多 但是也有很多是匹配错误的 方便留一个邮箱吗 我将附件发给您,能帮我在看一下吗 数据多点测试一下 可以看出不足
sweetskymoon 2011-06-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 z_wenqian 的回复:]

好的:zh_wenqian@yahoo.com.cn
[/Quote]

已发送 请查收 谢谢!
z_wenqian 2011-06-04
  • 打赏
  • 举报
回复

Sub ChaZhao1(L1 As Integer, L2 As Integer)
For Each c1 In Sheet1.Range("A2:A" & L1) ' sheet1 单元格循环
sOLD = 0
For Each c2 In Sheet2.Range("A2:A" & L2) ' sheet2 单元格循环
sNow = 0
For p = 1 To Len(c1) '计算每个字符在sheet2出现的次数和,并找出最大的
If InStr(1, c2, Mid(c1, p, 1)) > 0 Then sNow = sNow + 1 '找到一个就加1
Next p
If sNow > sOLD Then '查找最大的数,并记录单元格行号
sOLD = sNow: pp = c2.Row
End If
Next c2
Sheet1.Range("B" & c1.Row) = Sheet2.Range("A" & pp)
Next c1
End Sub

Sub ChaZhao2(L1 As Integer, L2 As Integer)
For Each c1 In Sheet2.Range("A2:A" & L2) ' sheet2 单元格循环
sOLD = 0
For Each c2 In Sheet1.Range("A2:A" & L1) ' sheet1 单元格循环
sNow = 0
For p = 1 To Len(c1) '计算每个字符在sheet1出现的次数和,并找出最大的
If InStr(1, c2, Mid(c1, p, 1)) > 0 Then sNow = sNow + 1 '找到一个就加1
Next p
If sNow > sOLD Then '查找最大的数,并记录单元格行号
sOLD = sNow: pp = c2.Row
End If
Next c2
Sheet1.Range("B" & pp) = c1
Next c1

End Sub

Sub main()
'主程序
Dim L1 As Integer, L2 As Integer
Application.ScreenUpdating = False
Sheet1.Columns("B:C").ClearContents
L1 = Sheet1.[A65530].End(xlUp).Row
L2 = Sheet2.[A65530].End(xlUp).Row

ChaZhao1 L1, L2

With Sheet1
.Range("C2:C" & L1).FormulaR1C1 = "=IF(COUNTIF(C[-1],RC[-1])>1,""ERROR"","""")"
.Range("C2:C" & L1).Value = .Range("C2:C" & L1).Value
.Rows("2:" & L1).Sort Key1:=.Range("C2"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal
L1 = .[C65530].End(xlUp).Row
End With

With Sheet2
.Range("B2:B" & L2).FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC[-1],Sheet1!C:C[1],2,0)),""ERROR"","""")"
.Range("B2:B" & L2).Value = .Range("B2:B" & L2).Value
.Rows("2:" & L2).Sort Key1:=.Range("B2"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal
L2 = .[B65530].End(xlUp).Row
End With

ChaZhao2 L1, L2
Range("C2:C" & L1).FormulaR1C1 = "=IF(COUNTIF(C[-1],RC[-1])>1,""ERROR"","""")"
Sheet2.Columns("B:B").ClearContents
Application.ScreenUpdating = True
End Sub


结果:
客户名称
昆明市中医院 昆明中医
昆明市五华区人民医院 昆明市五华区人民医院
昆明医学院第一附属医院 昆明医学院第一附属医院
云南省第一人民医院 云南第一人民医院
昆明市延安医院 昆明延安医院
昆明医学院第三附属医院 昆明医学院第三附属医院
云南中医院 云南省中医院
成都军区昆明总医院 成都军区昆明总医院(43医院)
昆明红云医院 昆明红云医院
安宁人民医院 安宁人民医院
昆明市第二人民医院 昆明市第二人民医院
云南昆钢医院 云南昆钢医院
嵩明县医院 嵩明人民医院
云南省红十字会医院 云南省红十字会医院
昆明市第一人民医院 昆明市第一人民医院
昆明医学院第二附属医院 昆明医学院第二附属医院
楚雄州人民医院 楚雄州人民医院
云南省第三人民医院 云南省第三人民医院
云南省交通中心医院 云南省交通中心医院
楚雄州中医院 云南楚雄州中医院


如果还有错误,就把正确的剔除掉,减小范围,多次逐渐筛选,应该差不多了。

注意保留原始数据,在执行过程中要对数据进行排序。我不知道你的数据能不能打乱顺序。
z_wenqian 2011-06-04
  • 打赏
  • 举报
回复
好的:zh_wenqian@yahoo.com.cn
z_wenqian 2011-06-03
  • 打赏
  • 举报
回复
我暂时没想出其他办法来,模糊查找不好搞,主要是不知道如何取关键字。静等高手解决。呵呵。
sweetskymoon 2011-06-03
  • 打赏
  • 举报
回复
可以了 多谢啊 判断最好在详细点就好了 已经恨好了
sweetskymoon 2011-06-03
  • 打赏
  • 举报
回复
谢谢 可是运行了没反映啊
z_wenqian 2011-06-03
  • 打赏
  • 举报
回复
数据量太少,不好做,建议对 C 列排序,将正确的剔除,将错误的数据再贴出来,然后再看看,否则,实在想不出什么办法。我曾经反过来试了试,错误更多,但“昆明市中医院”不错了,我试想判断正方向错而反方向不错时取反方向的,但数据量太少,没法试,我只是建议,你在想想。

顺便说一下,正方向我是指判断sheet1的数据在sheet2中出现的次数,反方向就是sheet2在sheet1中出现的次数,这样做也不知可行不可行。

如果错的不多那就手工改吧,我想不出其他好办法了,就是上面的方法也不能保证没有表示“ERROR"的数据都对,你只能验证了。
sweetskymoon 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 z_wenqian 的回复:]
将几种方法结合起来用应该比较好,不停地筛选,不停地处理,直至解决问题。用单一的方法很难达到目的,祝你顺利。
[/Quote]

可以帮我再优化一下吗 尽可能的加入多一点的筛选或判断条件. 实在是没办法了 谢谢啊
z_wenqian 2011-06-03
  • 打赏
  • 举报
回复
将几种方法结合起来用应该比较好,不停地筛选,不停地处理,直至解决问题。用单一的方法很难达到目的,祝你顺利。
sweetskymoon 2011-06-03
  • 打赏
  • 举报
回复
谢谢各位 其实数据量已经比较大了 哎 真没办法了吗 总之谢谢LS 特别WENJIAN
laoyebin 2011-06-03
  • 打赏
  • 举报
回复
引用
昆明市第二人民医院 昆明市人民医院
昆明市第一人民医院 昆明市人民医院
昆明市人民医院 昆明市人民医院


这种你怎么能用机械的编程语言去判别呢

所以趁现在数据量小,还可补救之前,一个个手工改正吧,不要想其他贪图省力的方法了,不然你以后还会发这么一个贴的
sweetskymoon 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 z_wenqian 的回复:]
放些数据看看,没有数据怎么写?
[/Quote]

不知道LS是否看懂我的意思了
sweetskymoon 2011-06-02
  • 打赏
  • 举报
回复
sheet1的A列
客户名称
昆明医学院第一附属医院
云南省第一人民医院
昆明市延安医院
昆明医学院第三附属医院
云南中医院
成都军区昆明总医院
昆明市中医院
昆明市五华区人民医院
昆明红云医院
安宁人民医院
昆明市第二人民医院
云南昆钢医院
嵩明县医院
云南省红十字会医院
昆明市第一人民医院
昆明医学院第二附属医院
楚雄州人民医院
云南省第三人民医院
云南省交通中心医院
楚雄州中医院
宜良县中医院

sheet2的A列
客户名称
昆明医学院第一附属医院
云南第一人民医院
昆明延安医院
昆明医学院第三附属医院
云南省中医院
成都军区昆明总医院(43医院)
昆明中医
昆明市五华区人民医院
昆明红云医院
安宁人民医院
昆明市第二人民医院
云南昆钢医院
嵩明人民医院
云南省红十字会医院
昆明市第一人民医院
昆明医学院第二附属医院
楚雄州人民医院
云南省第三人民医院
云南省交通中心医院
云南楚雄州中医院
宜良县中医医院

SHEET1的A列的名称到sheet2的A列去找,因为有的名字有出入,所以不能直接VLOOKUP,很多要关键字匹配,匹配上的填在SHEET1的B列..数据非常的多,这里几是几行
z_wenqian 2011-06-02
  • 打赏
  • 举报
回复
放些数据看看,没有数据怎么写?
z_wenqian 2011-06-02
  • 打赏
  • 举报
回复

Dim L1, L2, p, sNow, sOLD, pp
Columns("B:C").ClearContents
For L1 = 2 To [A65530].End(xlUp).Row ' sheet1 单元格循环
With Sheet2
sOLD = 0
For L2 = 2 To .[A65530].End(xlUp).Row ' sheet2 单元格循环
sNow = 0
c = Range("A" & L1) ' sheet1 单元格内容
For p = 1 To Len(c) '计算每个字符在sheet2出现的次数和,并找出最大的
If InStr(1, .Range("A" & L2), Mid(c, p, 1)) > 0 Then
sNow = sNow + 1 '找到一个就加1
End If
Next p
If sNow > sOLD Then '查找最大的数,并记录单元格行号
sOLD = sNow
pp = L2
End If
Next L2
Range("B" & L1) = .Range("A" & pp)
End With
Next L1

'标示错误
Range("C2:C" & [A65530].End(xlUp).Row).FormulaR1C1 = "=IF(COUNTIF(C[-1],RC[-1])>1,""ERROR"","""")"


我写了一个,时间仓促没有优化,我想可以最大限度的找到了吧,也有错误的情况,用 "ERROR" 标示出来。

数据量少,无法做跟多的测试,你试试吧。

运行结果:


A B C
昆明医学院第一附属医院 昆明医学院第一附属医院
云南省第一人民医院 云南第一人民医院
昆明市延安医院 昆明延安医院
昆明医学院第三附属医院 昆明医学院第三附属医院
云南中医院 云南省中医院
成都军区昆明总医院 成都军区昆明总医院(43医院)
昆明市中医院 昆明市五华区人民医院 ERROR
昆明市五华区人民医院 昆明市五华区人民医院 ERROR
昆明红云医院 昆明红云医院
安宁人民医院 安宁人民医院
昆明市第二人民医院 昆明市第二人民医院
云南昆钢医院 云南昆钢医院
嵩明县医院 嵩明人民医院
云南省红十字会医院 云南省红十字会医院
昆明市第一人民医院 昆明市第一人民医院
昆明医学院第二附属医院 昆明医学院第二附属医院
楚雄州人民医院 楚雄州人民医院
云南省第三人民医院 云南省第三人民医院
云南省交通中心医院 云南省交通中心医院
楚雄州中医院 云南楚雄州中医院
宜良县中医院 宜良县中医医院
laoyebin 2011-06-02
  • 打赏
  • 举报
回复
这个就是数据不规范输入的恶果,当时贪省力,等以后汇总时候就头疼了


好好把这些数据改正吧,然后用数据有效性等方式规范一下输入
z_wenqian 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 sweetskymoon 的回复:]
这个公式有一些名称匹配不出来,不知道什么原因
[/Quote]

原因已经找到:
如果sheet1中单元格的内容长度比sheet2中的长,就没问题,如果短,则找不到
如sheet1中的 "云南中医院",在sheet2中是 "云南省中医院",
"*"&LEFT(Sheet2!$A$1:$A$30,2)&"*"&RIGHT(Sheet2!$A$1:$A$30,LEN(Sheet2!$A$1:$A$30)-2)&"*")的结果是 "*云南*省中医院*",则 COUNTIF("云南中医院","*云南*中医院*")=0,所以找不到。把 -2 改成 -3 后能找到,但总有找不到的,如 "嵩明县医院",减太多又无法保证查找正确:如果找不到的单元格不多,手工将 sheet2 的对应单元格改掉算了,如果有太多的话,建议用 VBA 来做,我有个思路:

将 sheet1 每个单元格内容的字符拆开,然后在sheet2中查找匹配数量的总和,最多的应该就是了。
如 云南中医院 在sheet2中查找时,找到 云南省中医院 时,有5个字匹配,而其他单元格将不会有这么多,那么我就认为匹配了(也有错误的情况,少)。

6,210

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office应用
社区管理员
  • Microsoft Office应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧