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,该解决方案是根据在中讨论的方法得出的。在这个链接上可以找到更多的方法和关于它们背后的理论的讨论。