Vba 根据条件选择单元格,然后重新定位特殊(转置)

Vba 根据条件选择单元格,然后重新定位特殊(转置),vba,excel,Vba,Excel,我想知道是否有人能帮我解决以下问题。我在一张纸上画了一个矩阵,像这样: __ 1w | 2w | .. | 25w a | 5,6 | 4,5 | .. | 12 b | 2,4 | 11,2 | .. | 34,45 : | ::: | ::: | :: | :: z | 3,3 | 1,5 | .. | 24,91 我想以一种特殊的方式转换行和列,以便它们在新的工作表上保持如下状态: 1w |

我想知道是否有人能帮我解决以下问题。我在一张纸上画了一个矩阵,像这样:

  __   1w  |  2w  |  ..  |  25w

  a | 5,6  |  4,5 |  ..  |  12

  b | 2,4  | 11,2 |  ..  |  34,45

  : | :::  |  ::: |  ::  |  ::

  z | 3,3  |  1,5 |  ..  |  24,91
我想以一种特殊的方式转换行和列,以便它们在新的工作表上保持如下状态:

       1w  |   a  |  5,6
       2w  |   a  |  4,5   
       ..  |   .  |  ...
       25w |   a  |  12
       1w  |   b  |  2,4
       2w  |   b  |  11,2
       ..  |   .  |  ...
       25w |   b  |  34,45
       ..  |   .  |  ...
       ..  |   .  |  ...
       1w  |   z  |  3,3
       2w  |   z  |  1,5
       ..  |   .  |  ...
       25w |   z  |  24,91

我可以手工完成,但这需要很长时间,因为我有很多数据。还有什么方法可以实现自动化吗?

通过嵌套循环甚至SQL交叉联接可以实现矩阵的扁平化

Sub flipShow()
    Dim a As Long, b As Long, vTMPs As Variant, vVALs As Variant

    With Worksheets("Sheet1")
        With .Cells(1, 1).CurrentRegion
            vTMPs = .Value2
            ReDim vVALs(1 To (UBound(vTMPs, 1) - 1) * (UBound(vTMPs, 2) - 1), 1 To 3)
        End With
    End With

    For a = LBound(vTMPs, 1) + 1 To UBound(vTMPs, 1)
        For b = LBound(vTMPs, 2) + 1 To UBound(vTMPs, 2)
            Debug.Print (b - 1) + ((a - 2) * UBound(vTMPs, 2))
            vVALs((b - 1) + ((a - 2) * (UBound(vTMPs, 2) - 1)), 1) = vTMPs(1, b)
            vVALs((b - 1) + ((a - 2) * (UBound(vTMPs, 2) - 1)), 2) = vTMPs(a, 1)
            vVALs((b - 1) + ((a - 2) * (UBound(vTMPs, 2) - 1)), 3) = vTMPs(a, b)
        Next b
    Next a

    With Worksheets("Sheet2")
        .Cells.Clear
        .Cells(1, 1).Resize(UBound(vVALs, 1), UBound(vVALs, 2)) = vVALs
    End With

End Sub


通过嵌套循环甚至SQL交叉联接,可以实现矩阵的平坦化

Sub flipShow()
    Dim a As Long, b As Long, vTMPs As Variant, vVALs As Variant

    With Worksheets("Sheet1")
        With .Cells(1, 1).CurrentRegion
            vTMPs = .Value2
            ReDim vVALs(1 To (UBound(vTMPs, 1) - 1) * (UBound(vTMPs, 2) - 1), 1 To 3)
        End With
    End With

    For a = LBound(vTMPs, 1) + 1 To UBound(vTMPs, 1)
        For b = LBound(vTMPs, 2) + 1 To UBound(vTMPs, 2)
            Debug.Print (b - 1) + ((a - 2) * UBound(vTMPs, 2))
            vVALs((b - 1) + ((a - 2) * (UBound(vTMPs, 2) - 1)), 1) = vTMPs(1, b)
            vVALs((b - 1) + ((a - 2) * (UBound(vTMPs, 2) - 1)), 2) = vTMPs(a, 1)
            vVALs((b - 1) + ((a - 2) * (UBound(vTMPs, 2) - 1)), 3) = vTMPs(a, b)
        Next b
    Next a

    With Worksheets("Sheet2")
        .Cells.Clear
        .Cells(1, 1).Resize(UBound(vVALs, 1), UBound(vVALs, 2)) = vVALs
    End With

End Sub


非常感谢!!这是我需要的。我需要学习VBA。多亏了M8,该解决方案是根据在中讨论的方法得出的。更多的方法和关于它们背后的理论的讨论可以在这个链接上找到。非常感谢!!这是我需要的。我需要学习VBA。多亏了M8,该解决方案是根据在中讨论的方法得出的。在这个链接上可以找到更多的方法和关于它们背后的理论的讨论。