将包含数据集的1列转换为多行

时间:2013-04-22 13:26:28

标签: excel excel-vba one-to-many vba

我有一个格式化的CSV:

label1,data1
label2,data2
label3,data3

label1,data4
label2,data5
label3,data6

... etc ...

我尝试将它在Excel中转​​换为这种格式:

label1,label2,label3
data1,data2,data3
data4,data5,data6

我不认为使用内置工具是可行的,所以我正在考虑为它编写宏,但我是PowerShell / C#人而不是VB人。任何帮助或指导将不胜感激!

2 个答案:

答案 0 :(得分:1)

我将假设这是一次性的事情,并且spreasheet公式适合你。

您可以在OzGrid上使用 mikerickson 中的自定义电子表格功能,将所有数据与公共标签连接起来。

首先,你需要获得所有独特的价值观:

Example1

然后,您需要使用此自定义函数来查找并使用公共标签连接值:

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

Example2

如果需要,您可以进行额外的连接以组合您的标签:

Example3

然后您可以将其直接粘贴到文本编辑器中,也可以按原样使用,如果需要,可以将其保存为csv:

Example4

然后在excel中打开它并根据需要进行转置:

Example5

这种方式可以做到这一点,但在我看来,这比编写宏更容易 - 至少是这样。祝你好运。

答案 1 :(得分:0)

最合适的技术可能在某种程度上取决于您需要执行此操作的频率以及您拥有多少数据块但不需要宏:

导入Excel并将文本拆分为列,并使用逗号作为分隔符 分成三行并在“数据”列上方移动一组“label1 label2 label3” 删除“标签”列和空白行 将列作为无格式文本复制到Word中 插入>表格 - 表格,将文本转换为表格,列数= 3 复制回Excel并按行与逗号分隔符(&","&

连接