在VBA中是否有一种方法可以自动在列中为重复值写入文本? [关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在VBA中是否有一种方法可以自动在列中为重复值写入文本? [关闭]相关的知识,希望对你有一定的参考价值。
我正在使用一个包含约30,000行人的详细信息的电子表格。每个人都有重复的条目(相同的姓氏,DOB等),但是名字经常不同。例如,约翰·史密斯,约翰·史密斯,约翰·史密斯。
我希望编写代码,以遍历姓氏和DOB的方式查找匹配的组。然后,由于最长的名字始终是正确的条目,因此组中最大的名字长度就是我要声明为正确的名字。
例如,在我的附件图像中:
单元C2,C3和C4都具有姓氏'Solo'。如果代码进入下一个单元格(C5),它将是“ Stark”,因此它将在那里停止计数。
然后,通过检查所有各自的DOB匹配(D2:D4),将确认所有这些'Solo'是同一个人。之后,它将计算哪个单元格(B2,B3或B4)具有最大长度。在这种情况下,B2具有最长的长度。
最后,它将在整个组的'注释'单元中写入所有这些与第2行匹配的行,第2行具有相应的'ID'为'1'-'更正为ID 1'。
谢谢您的协助。我希望这有点清楚!
Option Explicit
Sub ProcessNames()
Dim wb As Workbook, ws As Worksheet
Dim dict As Object, sKey As String
Dim iLastRow As Long, iRow As Long
Set dict = CreateObject("Scripting.Dictionary")
Set wb = ThisWorkbook
Set ws = wb.Sheets("Names") ' change to suit
iLastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
For iRow = 2 To iLastRow
' create key using LastName and DOB
sKey = UCase(ws.Cells(iRow, "C")) & Format(Cells(iRow, "D"), "YYYYMMDD")
If dict.exists(sKey) Then
' compare length of first names, store longest
If Len(ws.Cells(iRow, "B")) > Len(ws.Cells(dict(sKey), "B")) Then
dict(sKey) = iRow
End If
Else
dict(sKey) = iRow
End If
Next
' update correct IDs in Comment
For iRow = 2 To iLastRow
sKey = UCase(ws.Cells(iRow, "C")) & Format(Cells(iRow, "D"), "YYYYMMDD")
ws.Cells(iRow, "E") = "Correct to ID " & ws.Cells(dict(sKey), "A")
Next
MsgBox dict.Count & " names found in rows 2 to " & iLastRow, vbInformation
End Sub
以上是关于在VBA中是否有一种方法可以自动在列中为重复值写入文本? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
将行与标题进行比较,然后在列中插入值并在 VBA 中进行重复检查
Excel VBA - 搜索范围和连接的 SQL ADODB 记录集以在列中匹配写入结果集
如何在数据帧中沿值的一列生成随机均匀分布而不必对所述列中的每个值重复?