包装具有重复项的行

时间:2011-05-10 16:03:49

标签: excel excel-vba excel-2010 vba

我的数据看起来像这样:

BOB  | 4
BOB  | 3
BOB  | 7
MARY | 1
JOE  | 2
JOE  | 1
MIKE | 6

我希望最终得到如下数据:

BOB  | 4 | 3 | 7
MARY | 1 |   |
JOE  | 2 | 1 |
MIKE | 6 |   |

问题是,如何计算名称显示的可变次数?

2 个答案:

答案 0 :(得分:2)

我想出了以下代码。感觉它可能更干净。

这适用于工作表上任何选定的数据块(假设它已预先排序)。它在同一区域的同一张纸上输出。

Sub WrapDuplicates()
    Dim data(), i As Long, startCell As Range, rwCnt As Long, col As Long

    data = Selection //pull selected data into an array
    Set startCell = Selection.Cells(1, 1) //Get reference to write results to
    Selection.ClearContents //remove original data
    startCell = data(1, 1) //Output first name
    startCell.Offset(0, 1) = data(1, 2) //Output first value

    rwCnt = 0
    col = 2

    For i = 2 To UBound(data) //Loop through array and check if name is same or not and output accordingly
        If data(i, 1) = data(i - 1, 1) Then
            startCell.Offset(rwCnt, col) = data(i, 2)
            col = col + 1
        Else
            rwCnt = rwCnt + 1
            col = 2
            startCell.Offset(rwCnt, 0) = data(i, 1)
            startCell.Offset(rwCnt, 1) = data(i, 2)
        End If
    Next i
End Sub

答案 1 :(得分:0)

我假设您要在代码中基于您帖子中的excel-vba标记执行此操作。

我还假设数据按名称排序,或者您可以在代码执行之前按名称对数据进行排序。

源位于表1中,目标位于表2中。代码位于Excel VBA中。我测试了你的样本数据,将这个子程序放在Excel代码隐藏的ThisWorkbook部分并按下play。

每次都会重写目标标题,从性能角度来看这并不理想,但我不认为这是一个问题。您可以将其包装在if语句中,该语句检查目标列index = 2(如果它成为问题)。

Sub ColumnsToRows()

Dim rowHeading
Dim previousRowHeading
Dim sourceRowIndex
Dim targetRowIndex
Dim targetColumnIndex


sourceRowIndex = 1
targetRowIndex = 1
targetColumnIndex = 2

rowHeading = Sheet1.Cells(sourceRowIndex, 1)
previousRowHeading = rowHeading

While Not rowHeading = ""

    If Not previousRowHeading = rowHeading Then
        targetRowIndex = targetRowIndex + 1
        targetColumnIndex = 2
    End If

    Sheet2.Cells(targetRowIndex, 1) = rowHeading
    Sheet2.Cells(targetRowIndex, targetColumnIndex) = Sheet1.Cells(sourceRowIndex, 2)
    previousRowHeading = rowHeading

    sourceRowIndex = sourceRowIndex + 1
    targetColumnIndex = targetColumnIndex + 1
    rowHeading = Sheet1.Cells(sourceRowIndex, 1)

Wend

End Sub

我是开发人员,而不是Excel大师。可能有一些Excel功能,数据透视表或其他一些Excel魔术自动为您执行此操作。