0

我有一个 Excel 电子表格,其中包含从不同数据源中提取的数据。

我遇到的问题是数据被“重复”:

(站点是 A 列,所有者是 B 列):

Site                         Owner
http://website1.com          John Doe
http://website1.com          Jane Doe
http://website2.com          John Smith
http://website2.com          Jane Smith
http://website2.com          John Doe

我想将其更改为:

Site                         Owner1       Owner 2      Owner 3
http://website1.com          John Doe     Jane Doe
http://website2.com          John Smith   Jane Smith   John Doe

我目前正在为每个站点复制“所有者”,并使用“转置”方法粘贴它们以完成此操作。问题是,有很多记录,这是非常无聊而且可能是浪费的工作。

有没有办法通过宏、脚本或其他方式自动完成此操作?

谢谢!

4

3 回答 3

1

为了弥补我上面糟糕的数据透视表建议......

Sub Tester()

    Dim data, rngTL As Range, num
    Dim i As Long, f As Range
    Dim site, owner

    data = Selection.Value 'select raw data before running

    'where the pivoted data goes: edit to suit...
    Set rngTL = ThisWorkbook.Sheets("Sheet1").Range("A1")

    num = 0
    For i = 1 To UBound(data, 1)
        site = Trim(data(i, 1))
        owner = Trim(data(i, 2))

        Set f = rngTL.Resize(num + 1, 1).Find(site, , xlValues, xlWhole)
        If f Is Nothing Then
            num = num + 1
            rngTL.Offset(num, 0).Value = site
            rngTL.Offset(num, 1).Value = owner
        Else
            f.End(xlToRight).Offset(0, 1).Value = owner
        End If
    Next i

End Sub
于 2013-05-09T20:54:38.310 回答
1

我不会为你写出任何 VBA。但是,您可以通过一些简单的工作表单击来完成此操作:

您将需要 OzGrid 上的 mrickerson 提供的这个自定义函数:

Function ConcatIf(ByVal compareRange As Range, ByVal xCriteria As Variant, _
    Optional ByVal stringsRange As Range, Optional Delimiter As String) As String
    Dim i As Long, j As Long, criteriaMet As Boolean

    Set compareRange = Application.Intersect(compareRange, _
    compareRange.Parent.UsedRange)

    If compareRange Is Nothing Then Exit Function
    If stringsRange Is Nothing Then Set stringsRange = compareRange
    Set stringsRange = compareRange.Offset(stringsRange.Row - compareRange.Row, _
    stringsRange.Column - compareRange.Column)

    For i = 1 To compareRange.Rows.Count
        For j = 1 To compareRange.Columns.Count
            If (Application.CountIf(compareRange.Cells(i, j), xCriteria) = 1) Then
                ConcatIf = ConcatIf & Delimiter & CStr(stringsRange.Cells(i, j))
            End If
        Next j
    Next i
    ConcatIf = Mid(ConcatIf, Len(Delimiter) + 1)
End Function

然后,您将需要为您的网站创建一个包含唯一值的列。

然后,您只需要使用 ConcatIf 函数创建组合列,然后您可以将其直接复制并粘贴到文本编辑器中,然后将其保存为 CSV:

例子

如果你想自动化这个,我相信这对你来说并不难,但这通常是你会做的。祝你好运。

于 2013-05-09T19:22:13.447 回答
-1

对唯一条目使用高级过滤方法,并使用带有转置的 pastespecial 方法将结果复制到另一个位置。

于 2013-05-09T19:18:27.057 回答