Excel 突出显示第一次出现后的所有重复项
我已附上excel表格以供参考。如“After”表所示,我需要用某种颜色突出显示重复关键字的第2到第n个实例Excel 突出显示第一次出现后的所有重复项,excel,vba,Excel,Vba,我已附上excel表格以供参考。如“After”表所示,我需要用某种颜色突出显示重复关键字的第2到第n个实例 有人能帮我吗。这个网站允许程序员帮助其他程序员发展他们的技能。有时答案中会提供重要的代码片段,但这不是一个免费的编码站点。你一下子要求的太多了,没有表现出解决自己问题的努力。这是该站点的两个主要no 你知道excelvba吗?如果没有,您就不可能理解任何包含代码的答案。搜索“VB Excel教程”。有很多可供选择。尝试一些,并完成一个符合你的学习风格。我更喜欢书。我参观了一个大型图书馆,
有人能帮我吗。这个网站允许程序员帮助其他程序员发展他们的技能。有时答案中会提供重要的代码片段,但这不是一个免费的编码站点。你一下子要求的太多了,没有表现出解决自己问题的努力。这是该站点的两个主要no 你知道excelvba吗?如果没有,您就不可能理解任何包含代码的答案。搜索“VB Excel教程”。有很多可供选择。尝试一些,并完成一个符合你的学习风格。我更喜欢书。我参观了一个大型图书馆,并复习了所有Excel VBA入门。然后我买了我喜欢的 一旦你有了VBA,试着自己写宏。当我不确定如何创建宏时,我会将整个问题分为几个步骤。然后我编写了一个宏来处理步骤1,并证明它已经成功地处理了步骤1。然后,我更新宏以处理步骤2,并证明它已成功处理步骤1和2。这种技术的优点是:
- 我隔离每个问题并
- 我知道我正在进步
您需要一个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
最后一步是高亮显示重复的单词/短语
- 打开宏录制器
- 突出显示单元格中的一两个单词/短语
- 关闭宏录制器
- 将对所选单元格进行操作
- 将使用一个数字作为起始位置。