【问题标题】:Macro for Intelligent Transpose智能转置宏
【发布时间】:2018-09-22 19:15:04
【问题描述】:

所以目前,根据标题,我正在寻找一个智能且相对自动的转置系统。

到目前为止,我弄清楚如何做到这一点的唯一方法是使用宏、特殊粘贴和大量手动工作(处理 2,000~ 行工作表)。

下面的例子是一个例子。 所有事件都属于 A1,但在新行中向下分布。目标是将它们全部放在一行中(在单个单元格中或相邻的单元格中)。

A       Event 1
A       Event 2
A       Event 3
B       Group 1
B       Group 2

所有事件都属于 A1,但在新行中向下分布。目标是将它们全部放在一行中(在单个单元格中或相邻的单元格中)。 我需要它们的示例如下所示。

A       Event 1 Event 2 Event 3
B       Group 1 Group 2

我进行了广泛的搜索,但没有找到任何可以解决这个奇怪请求的东西。

【问题讨论】:

  • 如果这是针对单个文件,power query 将能够做到这一点(假设 a/b 分类在一个列中,而事件名称在另一列中)。如果查看重复使用和/或不同的文件。也许是一个选择数据并创建 PQ 的宏?我之前并没有真正走那么远,所以我不确定你能做到多泛化... 注意:如果你正在寻找一个人来为你做所有的工作,这个不是适合您的网站。
  • 看看我在Combining consecutive values in a column with the help of VBA 给出的答案,这个任务非常相似,可以很容易地适应你的。否则请阅读idownvotedbecau.se/noattempt

标签: vba excel


【解决方案1】:

您可以使用字典轻松完成此操作。看看以下内容。您需要使用输入和目标范围更新两个 With

Public Sub test()
    Dim dict As Object
    Dim arr As Variant, tmp As Variant
    Dim i As Long
    Dim key

    Set dict = CreateObject("Scripting.Dictionary")

    ' Source Data
    With Sheet1
        arr = .Range(.Cells(1, "A"), .Cells(.Cells(.Rows.Count, "A").End(xlUp).Row, "B")).Value2
    End With

    For i = LBound(arr, 1) To UBound(arr, 1)
        If Not IsEmpty(tmp) Then Erase tmp
        If dict.exists(arr(i, 1)) Then
            tmp = dict(arr(i, 1))
            ReDim Preserve tmp(LBound(tmp) To UBound(tmp) + 1)
            tmp(UBound(tmp)) = arr(i, 2)
            dict(arr(i, 1)) = tmp
        Else
            ReDim tmp(0)
            tmp(LBound(tmp)) = arr(i, 2)
            dict.Add key:=arr(i, 1), Item:=tmp
        End If
    Next i

    ' Destination
    With Sheet1.Cells(1, 5)
        i = 0
        For Each key In dict.keys
            .Offset(i, 0) = key
            '' Side by side
            Range(.Offset(i, 1), .Offset(i, UBound(dict(key)) + 1)).Value2 = dict(key)
            '' In one cell
            '.Offset(i, 1).Value2 = Join(dict(key), ",")
            i = i + 1
        Next key
    End With
End Sub

【讨论】:

    【解决方案2】:

    假设我们在 AB 列中有数据,例如:

    运行此代码:

    Sub Macro1()
        Dim Na As Long, Nd As Long, rc As Long
        Dim i As Long, j As Long, K As Long
        Dim v As Variant
    
        Range("A:A").Copy Range("D:D")
        Range("D:D").RemoveDuplicates Columns:=1, Header:=xlNo
    
        rc = Rows.Count
        K = 5
        Na = Cells(rc, "A").End(xlUp).Row
        Nd = Cells(rc, "D").End(xlUp).Row
        For i = 1 To Nd
            v = Cells(i, "D")
            For j = 1 To Na
                If v = Cells(j, 1) Then
                    Cells(i, K) = Cells(j, 2)
                    K = K + 1
                End If
            Next j
            K = 5
        Next i
    End Sub
    

    将产生:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2018-03-07
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多