Excel 突出显示第一次出现后的所有重复项

Excel 突出显示第一次出现后的所有重复项,excel,vba,Excel,Vba,我已附上excel表格以供参考。如“After”表所示,我需要用某种颜色突出显示重复关键字的第2到第n个实例 有人能帮我吗。这个网站允许程序员帮助其他程序员发展他们的技能。有时答案中会提供重要的代码片段,但这不是一个免费的编码站点。你一下子要求的太多了,没有表现出解决自己问题的努力。这是该站点的两个主要no 你知道excelvba吗?如果没有,您就不可能理解任何包含代码的答案。搜索“VB Excel教程”。有很多可供选择。尝试一些,并完成一个符合你的学习风格。我更喜欢书。我参观了一个大型图书馆,

我已附上excel表格以供参考。如“After”表所示,我需要用某种颜色突出显示重复关键字的第2到第n个实例


有人能帮我吗。

这个网站允许程序员帮助其他程序员发展他们的技能。有时答案中会提供重要的代码片段,但这不是一个免费的编码站点。你一下子要求的太多了,没有表现出解决自己问题的努力。这是该站点的两个主要no

你知道excelvba吗?如果没有,您就不可能理解任何包含代码的答案。搜索“VB Excel教程”。有很多可供选择。尝试一些,并完成一个符合你的学习风格。我更喜欢书。我参观了一个大型图书馆,并复习了所有Excel VBA入门。然后我买了我喜欢的

一旦你有了VBA,试着自己写宏。当我不确定如何创建宏时,我会将整个问题分为几个步骤。然后我编写了一个宏来处理步骤1,并证明它已经成功地处理了步骤1。然后,我更新宏以处理步骤2,并证明它已成功处理步骤1和2。这种技术的优点是:

  • 我隔离每个问题并
  • 我知道我正在进步
若您编写了一个大型宏,但它不起作用,那个么您不知道从何处开始调试。这项技术的一个优点是,如果您无法执行步骤4,例如,工作,您可以隔离相关代码,说明它的功能,并在此处寻求帮助,使其实现您想要的功能。这是回答最快的问题类型

下面有很多细节。慢慢地查找我提到的语句和函数。如果有必要,带着问题回来,但是,你能为自己锻炼的越多,你的技能发展就越快

我应该警告你,下面的代码已经直接输入到答案中,并且没有被检查。我不认为有任何错误,但你应该为这种可能性做好准备。我还故意省略了一些语句的部分,以迫使您查找它们,我相信这将有助于您的发展。我希望这能让你在没有给出答案的情况下开始

以下是我针对此问题建议的步骤:


您需要一个for循环来检查从2到最后一行的每一行。您如何找到RowLast的值?我搜索了
[excel vba]查找最后一行
,找到了各种各样的问题和答案,解释了如何做到这一点。设置RowLast后,您可以通过将其输出到即时窗口来证明您具有正确的值,方法是:

Debug.Print RowLast

对循环进行编码,以获取所需工作表中每行的单元格A。为了证明您正在访问每行的每个单元格A,我建议如下:

Debug.Print RowCrnt & " " & .Cells(RowCrnt, "A").Value
Dim Found As Boolean
Dim InxTokenCrnt As Long
Dim InxTokenCrntMax As Long     ' Last used entry in Token
Dim RowCrnt As Long
Dim RowLast As Long
Dim Token() As String

...

For RowCrnt = 2 ....
  CellPart = Split( ...
  For InxCP = 0 ...     
    TokenCrnt = Trim(CellPart(InxCP))
    Found = False
    For InxTokenCrnt = 1 To InxTokenCrntMax
      If Token(InxTokenCrnt) = TokenCrnt Then
        ' Highlight TokenCrnt within Cell
        ....
        Found = True
        Exit For
      End If
    Next
    If Not Found Then
      ' Add TokenCrnt to Token
      ...
    End If
  Next
Next

...

' Prove all the words/phrases have been collected into Token
For InxTokenCrnt = 1 To InxTokenCrntMax
  Debug.Print Token(InxTokenCrnt)
Next

您需要将每个单元格拆分为单独的单词或短语。在您的示例中,分隔符始终是
逗号空间
。你能相信它总是
逗号空格
吗?或者它可能是
逗号空格
空格逗号
空格逗号空格
等等中的一个选择?您需要使用
Split
。查一查。我建议您在
comma
上拆分,然后使用函数
Trim
删除任何空格。如果您拆分为数组CellPart,我建议您获得初始证据,证明您已使用以下方法正确拆分单元格:

Debug.Print Trim(CellPart(0)) & "|" Trim(CellPart(1))

要正确分割单元格,您需要另一个For循环来访问
CellPart
的每个元素。查找
UBound
,了解如何获取数组最后一个元素的编号。我建议如下。查找
Debug.Print
以查找第2行末尾“;”的重要性

For InxCP = 0 to ....
  Debug.Print Trim(CellPart(InxCP)) & "|";
Next
Debug.Print

现在情况变得更复杂了。你必须建立一个包含所有单词或短语的数组。对于
CellPart
的每个元素,您需要检查它是否已经存在于数组中。如果它已经存在,你要给它上色。如果不存在,则需要将其添加到数组中。您事先不知道数组必须容纳多少个条目。语句
Redim
调整数组大小,而
Redim Preserve
调整数组大小而不丢弃当前内容

如果需要构建大型阵列,
Redim Preserve
可能是一个缓慢的语句。解释器必须找到一些足够大的内存来容纳新的、更大的数组,将现有数组复制到此新空间,并将旧数组的空间传递给垃圾收集器。我更喜欢大批量增加数组的大小,以减少使用
Redim Preserve
的次数。还有其他可能更好的技术,但我相信这种技术是最容易理解的(不容易,只是比其他技术容易):

Dim InxTokenCrntMax As Long     ' Last used entry in Token
Dim Token() As String

' Initialise Token with room for 1000 entries
ReDim Token(1 To 1000)
InxTokenCrntMax = 0

...

' Add new word/phrase to Token
InxTokenCrntMax = InxTokenCrntMax + 1
If InxTokenCrntMax > UBound(Token) Then
  ' Token is full.  Add another 1000 entries.
  ReDim Preserve Token( 1 To 1000 + UBound(Token))
EndIf
Token(InxTokenCrntMax) = NewWordOrPhrase
前面我讨论了您需要的两个外部For循环。外部循环用于工作表中的每一行,中间循环用于一行单元格A中的每个单词/短语。对于每个单词/短语,您需要删除任何前导或尾随空格,然后使用一个内部循环,将其与数组标记的当前内容相匹配。如果找到匹配项,则突出显示单元格中的单词/短语,并退出当前重复的内部循环。如果没有找到匹配项,请将单词/短语添加到令牌中,如上所示。我会使用类似于:

Debug.Print RowCrnt & " " & .Cells(RowCrnt, "A").Value
Dim Found As Boolean
Dim InxTokenCrnt As Long
Dim InxTokenCrntMax As Long     ' Last used entry in Token
Dim RowCrnt As Long
Dim RowLast As Long
Dim Token() As String

...

For RowCrnt = 2 ....
  CellPart = Split( ...
  For InxCP = 0 ...     
    TokenCrnt = Trim(CellPart(InxCP))
    Found = False
    For InxTokenCrnt = 1 To InxTokenCrntMax
      If Token(InxTokenCrnt) = TokenCrnt Then
        ' Highlight TokenCrnt within Cell
        ....
        Found = True
        Exit For
      End If
    Next
    If Not Found Then
      ' Add TokenCrnt to Token
      ...
    End If
  Next
Next

...

' Prove all the words/phrases have been collected into Token
For InxTokenCrnt = 1 To InxTokenCrntMax
  Debug.Print Token(InxTokenCrnt)
Next

最后一步是高亮显示重复的单词/短语

  • 打开宏录制器
  • 突出显示单元格中的一两个单词/短语
  • 关闭宏录制器
录制的宏将向您显示高亮显示部分单元格的语句的语法。但是,该代码: