紧急求教高手: EXCEL中不同行列数据重复字段自动判断、标记、清理和排序问题!解决绝对加分!

原始数据:数据在不同行列中不同次数的重复出现

重复判断:按照先行后列的顺序,对前面行列重复出现的数据自动判断,并标记

重复清理:对"重复判断"步骤中出现的重复数据进行清理;

条件排序:对清理后的数据表格自动靠前排序,排序按照字段字数多少进行“行”前后排序(绝对把所有数据集成为一列或者一行来显示,因为涉及到大类区分)
大哥,不对啊!你没仔细看懂要求啊!
每行的数据是不能全部归集到一列的!
判断重复内容(先行后列)→重复内容标记→清理重复内容→空格清理|自动考前|字段文字越多的越靠后!

根据你的问题补充,看来是不方便以通用的自定义函数来解决了,——需要编写一个专门的小程序:

Sub 清理重复数据()
Dim rnga, rngb
Set dic = CreateObject("scripting.dictionary")
With [a1].CurrentRegion.Offset(0, 1)
rnga = .Value
.ClearContents
rngb = .Value
For i = 1 To UBound(rnga, 1)
m = 0
For j = 1 To UBound(rnga, 2)
If rnga(i, j) <> "" And Not dic.exists(rnga(i, j)) Then
dic.Add rnga(i, j), ""
m = m + 1
rngb(i, m) = rnga(i, j)
End If
Next
Next
.Value = rngb
End With
End Sub

###############以下内容是原回答#########################
你的目的不就是要提取无重复值吗?
我给你一个自定义函数,你可以用它来直接写公式,提取你想要的数据!

Function DISTINCT(ParamArray rng())
'对任意多个可选参数,返回其所有元素不重复值构成的一维数组值。
'参数可为单元格区域、数组或单个值。
Dim rnga As Variant
Dim rngb As Variant
Set dic = CreateObject("scripting.dictionary")
For Each rnga In rng
If IsObject(rnga) Then rnga = rnga.Value
If IsArray(rnga) Then
For Each rngb In rnga
If Not IsEmpty(rngb) Then If Not dic.exists(rngb) Then dic.Add rngb, ""
Next
ElseIf Not IsEmpty(rnga) Then If Not dic.exists(rnga) Then dic.Add rnga, ""
End If
Next
DISTINCT = dic.keys
End Function

使用方法:首先,在EXCEL中,按Ctrl+F11打开VBA编程器,“插入”→“模块”,然后在代码窗口中粘贴以上自定义函数代码,关闭VBA编辑器。最后,在工作表数据区域最末行下边选择一个空单元格,输入公式并下拉(假如你的原始数据区域是A1:D20):
=INDEX(DISTINCT($A$1:$D$20),ROW(A1))

如果你要引用多个方形区域的原始数据,可在函数中以英文逗号分隔,例如:
=INDEX(DISTINCT($A$1:$D$20,$E$3:$J$6),ROW(A1))追问

非常感谢楼上的哥哥给予的回答!但是小弟确实没有用来!再把要求说详细一点,附图!

追答

Sub 清理重复数据()
Dim rnga, rngb
Set dic = CreateObject("scripting.dictionary")'创建词典,用于剔除重复数据
With range([a1],[a1].SpecialCells(xlCellTypeLastCell))'取从A1单元格到最末尾单元格的全体区域
rnga = .Value'把值存入内存数组中
.ClearContents'清除表格中的内容,给新的处理结果写入做好准备
rngb = .Value'为保存计算结果而获取一个与原表格区域相当的空白内存数组区域
For i = 1 To UBound(rnga, 1)'从第1行到最后一行
m = 0'用变量m记录该行已经写入的不重复数据个数:初始值为0个
For j = 1 To UBound(rnga, 2)'从第1列到最后一列
If rnga(i, j) "" And Not dic.exists(rnga(i, j)) Then‘这一步判断是关键:空白的或已经存于在词典中的(即重复的)数据被剔除,
'如果原值不为空且未存在于词典中,则:
dic.Add rnga(i, j), ""'把这个项添加到词典中
m = m + 1'定位不重复的数据需要写入的列号:是紧接已有数据的右边1列
rngb(i, m) = rnga(i, j)'在计算出的行列位置写入这个不重复数据
End If'完成1个数据的处理
Next'处理同一行的下一个数据
Next'处理下一行的数据
.Value = rngb'把计算所得的结果写入原单元格区域
End With'结束对原单元格区域的处理
End Sub'结束程序

温馨提示:答案为网友推荐,仅供参考
相似回答