手动复制 - 粘贴 - 转置的自动化解决方案?

时间:2013-05-09 17:05:04

标签: excel excel-vba copy-paste vba

我有一个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

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

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

谢谢!

3 个答案:

答案 0 :(得分: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:

Example

如果你想自动化这个,我相信你不会有困难,但这通常是你如何做到的。祝你好运。

答案 1 :(得分: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

答案 2 :(得分:-1)

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