B列包含A列数据,A、B列数据有重复,C列数值不重复,把B列对应的C列数值写在D列(按A的排列顺序)

B列包含A列数据,A、B列数据有重复,C列数值不重复,把B列对应的C列数值写在D列(按A的排列顺序)A列B列C列D列(实现效果)张三李四SS001SS002李四张三SS0... B列包含A列数据,A、B列数据有重复,C列数值不重复,把B列对应的C列数值写在D列(按A的排列顺序)
A列 B列 C列 D列(实现效果)

张三 李四 SS001 SS002

李四 张三 SS002 SS001

张三 王五 SS003 SS004

王五 张三 SS004 SS003

刘一 刘一 SS005 SS005

李三 刘一 SS006 SS008

刘一 王五 SS007 SS006

王五 李三 SS008 SS007
展开
 我来答
2724421
2013-06-23 · TA获得超过2489个赞
知道大有可为答主
回答量:1551
采纳率:71%
帮助的人:889万
展开全部

因为有重复数据,而你的例子是顺序向下取重复数据.这个用公式我做不到只能用VBA帮你做到

Sub bb()
Dim Dic, N, ArrD
Dim iRowA, iRowB As Long, iValA, iValB, iValC As Variant
iRowA = Range("A65536").End(xlUp).Row
iRowB = Range("B65536").End(xlUp).Row
Set Dic = CreateObject("Scripting.Dictionary")
Set N = CreateObject("Scripting.Dictionary")
For i = 1 To iRowB
    iValB = Range("B" & i).Value
    iValC = Range("C" & i).Value
    If Dic.exists(iValB) Then
        Dic(iValB) = Dic(iValB) & "," & iValC
    Else
        Dic(iValB) = iValC
    End If
Next
For j = 1 To iRowA
    iValA = Range("A" & j).Value
    If Dic.exists(iValA) Then
        If InStr(Dic(iValA), ",") > 0 Then
            ArrD = Split(Dic(iValA), ",")
            N(iValA) = N(iValA) + 1
            If N(iValA) <= UBound(ArrD)+1 Then Range("D" & j) = ArrD(N(iValA) - 1)
        Else
            Range("D" & j).Value = Dic(iValA)
        End If
    End If
Next
End Sub
更多追问追答
追问

太感谢了,能不能再帮优化一下,把前面的三列展开成第4、第5列之后,后面的和你上面实现的一样。

追答
没看懂你要让我做什么?
是让我帮帮你吧黄色的区域里的标识号 和列一,按数量这一列的数字,用代码帮你展开在标识号1和列二,这个位置吗?
还有绿色区域的数据时原本就存在的.对吧?
之后我在用我上面给你的代码把相应的数据写在红字标识的D列,是这样吧.
来自:求助得到的回答
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式