Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA数据转换表_Vba_Excel - Fatal编程技术网

VBA数据转换表

VBA数据转换表,vba,excel,Vba,Excel,试图用宏完成如图所示的任务 想知道是否有一种不使用循环就能完成上述任务的方法?如果您使用的是Excel 2013及更高版本,您可以使用Power Query将这些数据转换为所需的格式。你只需要取消日期列。 此外,它还具有足够的动态性,因此如果以后在数据表中添加数据,只需刷新power查询返回的表,新数据就会显示在表中 要了解这些步骤,请观看这个简短的演示视频 试试这段代码 Sub Transpose(ByVal WhatToTranspose As Range, ByVal WhereToPa

试图用宏完成如图所示的任务


想知道是否有一种不使用循环就能完成上述任务的方法?

如果您使用的是Excel 2013及更高版本,您可以使用Power Query将这些数据转换为所需的格式。你只需要取消日期列。 此外,它还具有足够的动态性,因此如果以后在数据表中添加数据,只需刷新power查询返回的表,新数据就会显示在表中

要了解这些步骤,请观看这个简短的演示视频

试试这段代码

Sub Transpose(ByVal WhatToTranspose As Range, ByVal WhereToPaste As Range)
    Dim col As Integer  'loop through columns
    Dim row As Integer  'loop through rows
    Dim a() As Variant
    Dim b() As Variant
    Dim i As Integer

    a() = WhatToTranspose

    For row = 2 To UBound(a, 1)
    For col = 2 To UBound(a, 2)
        If a(row, col) > 0 Then
          i = i + 1
          ReDim Preserve b(1 To 3, 1 To i)
          b(1, i) = a(row, 1)
          b(2, i) = a(1, col)
          b(3, i) = a(row, col)
        End If
      Next
    Next
    b() = Application.Transpose(b())
    WhereToPaste.Resize(UBound(b, 1), UBound(b, 2)).Value = b()
End Sub
应该被称为

Sub Caller()
Transpose Range("A1:D4"), Range("F1")
End Sub
注:我在未经测试的情况下发布此答案。如果您有问题,我将稍后尝试编辑此帖子

这是一个“取消打印”操作。如果假设数据实际上来自SQL Server数据库,则可以在源位置取消PIVOT。见鬼,如果是这样的话,那么源代码很有可能正在旋转已经规范化的数据。如果不是。。。我不这么认为。在任何情况下,这个问题对于这个站点来说可能太宽泛了——考虑把代码放在上面,改进工作代码是每个审稿人的任务。
Sub Caller()
Transpose Range("A1:D4"), Range("F1")
End Sub