Vba 在列中重新排列行数据

Vba 在列中重新排列行数据,vba,excel,rows,Vba,Excel,Rows,我有以下格式的excel数据 Resource 2/2/2013 2/3/2013 2/4/2013 Name1 9 9 9 Name2 9 9 9 Name3 9 9 9 我必须将上述数据转换为如下内容: Resource Date Hours Name1 2/2/2013

我有以下格式的excel数据

Resource     2/2/2013   2/3/2013  2/4/2013
  Name1         9          9         9  
  Name2         9          9         9  
  Name3         9          9         9  
我必须将上述数据转换为如下内容:

Resource  Date        Hours
Name1     2/2/2013      9
Name1     2/3/2013      9
Name1     2/4/2013      9
Name2     2/2/2013      9
Name2     2/3/2013      9
Name2     2/4/2013      9
Name3     2/2/2013      9
Name3     2/3/2013      9
Name3     2/4/2013      9
excel
中是否有任何函数可以做到这一点。我只能找到没有帮助的
行到列
函数,因为它只会
转置
数据,而不会像上面那样创建多个条目


即使通过
VBA

我也在想,如果没有VBA,是否有可能实现这一点,而且似乎是这样。 但是有一些假设,特别是你要变换的区域是矩形的

然后,您可以使用MOD函数(可以将“helper columns C-E”合并在一起,但为了更清晰的解释,我将它们显示出来)

在A9中,我有一个列数为的值(可以通过另一个函数获得)——只是有点泛化

然后我以这种方式使用间接()函数:

  • 单元格G9:
    =间接(“R”和2+D9和“C1”为假)
  • 单元格H9:
    =间接(“R1C”&2+E9;错误)
  • 单元格I9:
    =间接(“R”&2+D9&“C”&2+E9;假)

然后向下拖动它。

这里是一个VBA解决方案:

Sub Example()
    Dim Resources() As String
    Dim rng As Range
    Dim row As Long
    Dim col As Long
    Dim x As Long

    ReDim Resources(1 To (ActiveSheet.UsedRange.Rows.Count - 1) * (ActiveSheet.UsedRange.Columns.Count - 1), 1 To 3)

    'Change this to the source sheet
    Sheets("Sheet1").Select

    'Read data into an array
    For row = 2 To ActiveSheet.UsedRange.Rows.Count
        For col = 2 To ActiveSheet.UsedRange.Columns.Count
            x = x + 1
            Resources(x, 1) = Cells(row, 1).Value    ' Get name
            Resources(x, 2) = Cells(1, col).Value    ' Get date
            Resources(x, 3) = Cells(row, col).Value  ' Get value
        Next
    Next

    'Change this to the destination sheet
    Sheets("Sheet2").Select

    'Write data to sheet
    Range(Cells(1, 1), Cells(UBound(Resources), UBound(Resources, 2))).Value = Resources

    'Insert column headers
    Rows(1).Insert
    Range("A1:C1").Value = Array("Resource", "Date", "Value")

    'Set strings to values
    Set rng = Range(Cells(1, 3), Cells(ActiveSheet.UsedRange.Rows.Count, 3))
    rng.Value = rng.Value
End Sub
原件:

结果:


Thank@Ripster完成了这项工作。唯一的问题是它将数据复制到同一张表中,而不是复制到目标表中。这很奇怪,因为我给出了正确的
工作表名称
,但最后它只选择了
dest工作表
,所有数据都只在
源工作表中填充。这不应该发生。这对我来说是正确的。您是否尝试过单步遍历代码,并试图找到它按预期停止工作的行?我已将代码复制到工作表中。当我通过模块使用它时,它工作得很好。我将稍微修改一下这段代码。我将使用3个独立的一维数组。但是这一行
范围(单元格(1,1),单元格(UBound(参考资料),1))。Value=Resources
仅为所有字段提供第一个元素的值。