根据唯一ID加入行

时间:2016-10-18 00:37:08

标签: excel excel-vba excel-formula vba

我有32.000行数据。有些数据位于不同的地方,我希望将它们加入到我可以应用于所有行而不是手动的内容中。每个"组"具有相同的ID,在此示例中为" XPTO"

我现在有类似的东西(但有更多列): http://i.imgur.com/6kTGjfi.png

我希望它是这样的: enter image description here

问题在于我需要一种聪明的方法,因为它们并不总是像这个例子。其中一些有10行具有相同的ID" XPTO" (实施例)

我正在努力克服这个= / ty

2 个答案:

答案 0 :(得分:0)

这是我如何处理这个问题。

1)从你的评论中,我理解逻辑是位置的(左边的第一个(Casteloes de)与右边的第一个(R Dr Antonio)一起用于A列中的匹配值。如果是是的,然后我会插入一个列,您可以按顺序开始编号,然后向下填充以获得一直到最后的序列号。如果您需要对数据进行排序或重新排列,这将有助于保留位置逻辑。它还有助于你有“第一场比赛”,“第二场比赛”等逻辑

2)我的下一步是将两组数据分成单独的表/标签(每个表中都有顺序编号的列)并使用INDEX / MATCH。最近的答案将帮助您了解如何增加匹配:Is there such thing as a VLOOKUP that recognises repeated numbers?

3)备选方案 - 这甚至可能更容易,但您需要进行大量数据检查以确保没有任何问题被搞砸。使用步骤2中的两个表,按任意列对其中的数据进行排序,然后从每个表中删除空行。然后,按顺序编号的列对每个进行排序以返回到原始顺序。此时,您可以只能复制和粘贴。如果你这样做,请仔细检查是否有错误。

答案 1 :(得分:0)

我很肯定上面的解决方案由CriketBird提供,至少它有一个很好的逻辑来解决它,但由于我是excel的新手,我无法弄明白如何以这种方式解决它。

所以我通过在excel中使用VBA来解决它...(也许我对这个简单的问题走得太远了,但这是我唯一的选择)。

如果有人想要类似的情况,我会把代码留在这里。 (只需选择表格的第一列和第一行并点击运行)

Function Area(medico As String) As Integer

Do While countOk < 1

If medico = ActiveCell.Value Then
        ActiveCell.Offset(1, 0).Select
        rowCount = rowCount + 1
Else: countOk = 1
End If

Loop

Area = rowCount

End Function


Sub Teste()

Dim PaginaMedico As String
Dim totalrowCount As Integer
Dim rowCount As Integer
Dim countOk As Integer
Dim right As Integer
Dim left As Integer
Dim listaleft As New Collection
Dim listaright As New Collection


rowCount = 1
rowOk = 0
totalrowCount = 0
right = 0
left = 0


Do While ActiveCell.Value <> 0

PaginaMedico = ActiveCell.Value
rowCount = Area(PaginaMedico)
totalrowCount = totalrowCount + rowCount

Range("A" & (totalrowCount - (rowCount - 1))).Select

For i = ((totalrowCount + 1) - rowCount) To totalrowCount

If IsEmpty(Range("E" & (i)).Value) And IsEmpty(Range("F" & (i)).Value) Then
        Range("T" & (i)).Value = "Empty"
    ElseIf Not IsEmpty(Range("E" & (i)).Value) And Not IsEmpty(Range("F" & (i)).Value) Then
            Range("T" & (i)).Value = "Full"
        ElseIf Not IsEmpty(Range("E" & (i)).Value) And IsEmpty(Range("F" & (i)).Value) Then
                left = left + 1
                listaleft.Add i

            ElseIf IsEmpty(Range("E" & (i)).Value) And Not IsEmpty(Range("F" & (i)).Value) Then
                    right = right + 1
                    listaright.Add i


End If

Next i

If Not (right = left) Then
    Range("T" & totalrowCount).Value = "BOSTA"
    right = 0
    left = 0
End If

If listaleft.Count = listaright.Count Then

For i = 1 To listaleft.Count

    Range("F" & listaright(1) & ":" & "S" & listaright(1)).Cut     Range("F" & listaleft(1) & ":" & "S" & listaleft(1))
    listaright.Remove (1)
    listaleft.Remove (1)

Next i

End If

Set listaleft = New Collection
Set listaright = New Collection


Range("A" & (totalrowCount + 1)).Select


Loop


End Sub