ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 大雨治水

[分享] 对比两单元格字符不同的用颜色标注出来

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-11-10 14:55 | 显示全部楼层
大雨治水 发表于 2018-8-21 15:55
修改了一下,把最新的代码上传一下:

下载下来的压缩包,里面excel的格式是xls.代码都丢失了。请问能post出来吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-6 16:30 | 显示全部楼层
skyskyabc 发表于 2019-11-10 14:55
下载下来的压缩包,里面excel的格式是xls.代码都丢失了。请问能post出来吗?

我下载了一楼的代码,没有问题呀?
  1. <div><div>Sub 恢复颜色()</div><div>    Cells.Font.ColorIndex = 0</div><div>End Sub</div><div>
  2. </div><div>Sub 标注不同字符()</div><div>    Dim myrow%, i%, j%, n%, m%, s%</div><div>    Dim str$, s1$, s2$, s3$</div><div>    Dim strA$, strB$</div><div>
  3. </div><div>    On Error Resume Next</div><div>
  4. </div><div>    Call 恢复颜色</div><div>
  5. </div><div>    ''将区域设置为文本格式</div><div>    Columns("A:B").NumberFormatLocal = "@"</div><div>
  6. </div><div>    myrow = Range("A65536").End(xlUp).Row</div><div>
  7. </div><div>    For i = 2 To myrow</div><div>        ''先修改全部字符串的颜色</div><div>        Cells(i, 1).Font.Color = vbRed</div><div>        Cells(i, 2).Font.Color = vbRed</div><div>
  8. </div><div>        strA = Cells(i, 1).Value</div><div>        strB = Cells(i, 2).Value</div><div>
  9. </div><div>        ''提取最大相同字符串</div><div>        s1 = xt(strA, strB)</div><div>abc:</div><div>        m = Len(s1)</div><div>        n = InStr(1, Cells(i, 1).Value, s1)</div><div>        ''.Characters(Start:=1, Length:=1).Font....</div><div>        Cells(i, 1).Characters(n, m).Font.ColorIndex = vbBlack    '改成黑色</div><div>
  10. </div><div>        n = InStr(1, Cells(i, 2).Value, s1)</div><div>        Cells(i, 2).Characters(n, m).Font.ColorIndex = vbBlack    '改成黑色</div><div>
  11. </div><div>
  12. </div><div>        ''去除相同内容后,再提取相同内容</div><div>        strA = Replace(strA, s1, "")</div><div>        strB = Replace(strB, s1, "")</div><div>        If StrReverse(strA) <> strB Then</div><div>            If Len(strA) >= 2 And Len(strB) >= 2 Then</div><div>                ''提取最大相同字符串</div><div>                s1 = xt(strA, strB)</div><div>                If s1 <> "" Then</div><div>                    GoTo abc</div><div>                End If</div><div>            End If</div><div>        End If</div><div>        m = 0</div><div>        n = 0</div><div>
  13. </div><div>    Next i</div><div>
  14. </div><div>End Sub</div><div>
  15. </div><div>Function xt(rng1, rng2)</div><div>''最大相同部分</div><div>    Dim n%, j%, i%</div><div>    zf = LCase(rng1)</div><div>    zf2 = LCase(rng2)</div><div>    p = ""</div><div>    n = Len(zf)</div><div>    For i = n To 1 Step -1</div><div>        For j = 1 To n - i + 1</div><div>            z = Mid(zf, j, i)</div><div>            If InStr(zf2, z) Then</div><div>                p = z</div><div>                GoTo 100</div><div>            End If</div><div>        Next</div><div>    Next</div><div>100:</div><div>    xt = p</div><div>End Function</div></div><div></div>
复制代码



TA的精华主题

TA的得分主题

发表于 2020-4-10 17:09 | 显示全部楼层
大雨治水 发表于 2020-2-6 16:30
我下载了一楼的代码,没有问题呀?

整理下
Sub 恢复颜色()
    Cells.Font.ColorIndex = 0
End Sub

Sub 标注不同字符()
    Dim myrow%, i%, j%, n%, m%, s%
    Dim str$, s1$, s2$, s3$
    Dim strA$, strB$
    On Error Resume Next
    Call 恢复颜色
    Columns("A:B").NumberFormatLocal = "@"
    myrow = Range("A65536").End(xlUp).Row
    For i = 2 To myrow
        Cells(i, 1).Font.Color = vbRed
        Cells(i, 2).Font.Color = vbRed
        strA = Cells(i, 1).Value
        strB = Cells(i, 2).Value
        s1 = xt(strA, strB)
        abc:
        m = Len(s1)
        n = InStr(1, Cells(i, 1).Value, s1)
        Cells(i, 1).Characters(n, m).Font.ColorIndex = vbBlack
        n = InStr(1, Cells(i, 2).Value, s1)
        Cells(i, 2).Characters(n, m).Font.ColorIndex = vbBlack
        strA = Replace(strA, s1, "")
        strB = Replace(strB, s1, "")
        If StrReverse(strA) <> strB Then
            If Len(strA) >= 2 And Len(strB) >= 2 Then
                s1 = xt(strA, strB)
                If s1 <> "" Then
                    GoTo abc
                End If
            End If
        End If
        m = 0
        n = 0
    Next i
End Sub

Function xt(rng1, rng2)
    Dim n%, j%, i%
    zf = LCase(rng1)
    zf2 = LCase(rng2)
    p = ""
    n = Len(zf)
    For i = n To 1 Step -1
        For j = 1 To n - i + 1
            z = Mid(zf, j, i)
            If InStr(zf2, z) Then
                p = z
                GoTo 100
            End If
        Next
    Next
    100:
    xt = p
End Function


TA的精华主题

TA的得分主题

发表于 2020-4-11 11:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大神厉害,一下子解决个大问题。

不过,我刚才测试了一下,我把想相同位置的字符相比较,
比如第一列的第一个字符和第二列的第一个字符比较,需要改哪个代码

TA的精华主题

TA的得分主题

发表于 2020-8-26 11:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大雨治水 发表于 2018-9-2 19:50
具体截图说明一下!

比如我增加倒数两行的数据A和B,A完全不=B,但是A和B两个字符串都没有被标记成红色,能否修改下代码,让两个单元格中没有出现相同的字符时,让他们两个单元格里的字符串都被标成红色,或者蓝色。
还请老师帮帮忙,谢谢啦!

比如我增加倒数两行的数据,A<>B,但是A和B两个字符串都没有被标记成红色,能否修改下代码,让两个单元 ...

比如我增加倒数两行的数据,A<>B,但是A和B两个字符串都没有被标记成红色,能否修改下代码,让两个单元 ...

TA的精华主题

TA的得分主题

发表于 2020-8-26 15:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
关注下,学习啦

TA的精华主题

TA的得分主题

发表于 2020-9-9 09:41 | 显示全部楼层
本帖最后由 lukeforall 于 2020-9-9 09:43 编辑

复制代码
我写了个类似的编码,应该可以完美解决大家的类似问题,大家只需修改 columnA 和  columnB 的列号, rowNum 首行,就可以了楼主的代码我也看了,简单的比较没有问题,但是会出现抽取的最大字串是合并后的字段的问题,也没有比较单字,相同文字但调换位置的修改不会高亮。

大家可以试下我的代码,有问题讨论


  1. Type MatchStruct
  2. substrText As String
  3. posAstart As Integer
  4. posBstart As Integer
  5. posAend As Integer
  6. posBend As Integer
  7. substrLength As Integer
  8. substrMatch As Boolean
  9. End Type

  10. Sub HighlightDiff()
  11. Dim columnA%, columnB%, rowNum%, rowMax%, i%, j%, posTmp%, temp%
  12. Dim strA$, strB$, substr$
  13. Dim substrList(5000) As MatchStruct
  14. Dim matchCount As Integer

  15. On Error Resume Next

  16. columnA = 1 'Index for current translation column
  17. columnB = 2 'Index for suggested translation column
  18. rowNum = 2 'Index for the first row to compare
  19. 'Format the range as red

  20. rowMax = Range("A65536").End(xlUp).Row
  21. Range(Cells(2, columnA), Cells(rowMax, columnA)).Font.Color = vbRed
  22. Range(Cells(2, columnB), Cells(rowMax, columnB)).Font.Color = vbRed

  23. For rowNum = 2 To rowMax
  24. 'skip blank rows
  25. If Len(Cells(rowNum, columnA).Text) = 0 Or Len(Cells(rowNum, columnB).Text) = 0 Then rowNum = rowNum + 1

  26. 'Extract longest to shortest common strings,and store their positions
  27. strA = LCase(Cells(rowNum, columnA).Value)
  28. strB = LCase(Cells(rowNum, columnB).Value)
  29. n = Len(strA)
  30. matchCount = 1
  31. For i = n To 1 Step -1
  32. For j = 1 To n - i + 1
  33. substr = Mid(strA, j, i)
  34. posTmp = InStr(strB, substr)
  35. If posTmp > 0 Then
  36. strA = Replace(strA, substr, String(i, "犇"), 1, 1, vbTextCompare)
  37. strB = Replace(strB, substr, String(i, "淼"), 1, 1, vbTextCompare)
  38. substrList(matchCount).substrMatch = True
  39. substrList(matchCount).substrText = substr
  40. substrList(matchCount).substrLength = i
  41. substrList(matchCount).posAstart = j
  42. substrList(matchCount).posBstart = posTmp
  43. substrList(matchCount).posAend = j + i - 1
  44. substrList(matchCount).posBend = posTmp + i - 1
  45. matchCount = matchCount + 1
  46. End If
  47. Next j
  48. Next i

  49. 'Check if the matches are in their original order, matches that are in different order will stay in red
  50. For i = 1 To matchCount - 1
  51. For j = 1 To i
  52. If substrList(i).posAend < substrList(j).posAstart And substrList(i).posBstart > substrList(j).posBend Or substrList(i).posAstart > substrList(j).posAend And substrList(i).posBend < substrList(j).posBstart Then
  53. substrList(i).substrMatch = False
  54. Exit For
  55. End If
  56. Next j
  57. Next i

  58. 'Set matched words back to black
  59. For i = 1 To matchCount - 1
  60. If substrList(i).substrMatch = True Then
  61. Cells(rowNum, columnA).Characters(substrList(i).posAstart, substrList(i).substrLength).Font.Color = vbBlack
  62. Cells(rowNum, columnB).Characters(substrList(i).posBstart, substrList(i).substrLength).Font.Color = vbBlack
  63. End If
  64. Next

  65. Next rowNum

  66. End Sub
复制代码



TA的精华主题

TA的得分主题

发表于 2020-9-9 12:04 | 显示全部楼层
excel-ssy01 发表于 2020-8-26 11:30
比如我增加倒数两行的数据A和B,A完全不=B,但是A和B两个字符串都没有被标记成红色,能否修改下代码,让 ...

用我的代码就可以解决,楼主的代码不比较一个字符

TA的精华主题

TA的得分主题

发表于 2020-9-10 14:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lukeforall 发表于 2020-9-9 12:04
用我的代码就可以解决,楼主的代码不比较一个字符

太感谢了,大师。

TA的精华主题

TA的得分主题

发表于 2022-7-13 23:13 | 显示全部楼层
大神,你的这个帖子, https://club.excelhome.net/thread-1384696-3-3.html

能不能把相同的标红啊?急用,万分感谢,能不能发个弄好的表格,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-5 14:49 , Processed in 0.045228 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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