将excel中每批24RX56C转换为56行24C的列

将excel中每批24RX56C转换为56行24C的列,excel,vba,transpose,Excel,Vba,Transpose,我需要在excel中将24RX56C转换为56RX24C,用于144000多个数据点。我需要每批做一次换位。到目前为止,我一直在使用VBA平台和宏来记录一段代码,该代码允许对整个数据集执行操作,但仍然不起作用。我认为这是因为“活动单元格.偏移量”不断变化。因此,当我想使用“Do until isempty(activecell)”和循环时,代码会采用不同的值,而不是我希望它采用的批处理。 我将感谢任何建议。我附上我一直在使用的代码,以及我想如何进行转换的图片 Sub TRANSPOSE() '

我需要在excel中将24RX56C转换为56RX24C,用于144000多个数据点。我需要每批做一次换位。到目前为止,我一直在使用VBA平台和宏来记录一段代码,该代码允许对整个数据集执行操作,但仍然不起作用。我认为这是因为“活动单元格.偏移量”不断变化。因此,当我想使用“Do until isempty(activecell)”和循环时,代码会采用不同的值,而不是我希望它采用的批处理。 我将感谢任何建议。我附上我一直在使用的代码,以及我想如何进行转换的图片

Sub TRANSPOSE()
'
' TRANSPOSE Macro
'
' Keyboard Shortcut: Ctrl+Shift+F
'
    Range("A1:E2").Select
    ActiveCell.Range("A1:E2").Select
    Selection.Copy
    ActiveCell.Offset(0, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
    ActiveCell.Offset(2, -7).Range("A1:E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(3, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
    ActiveCell.Offset(-1, -7).Range("A1:E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(6, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
    ActiveCell.Offset(-4, -7).Range("A1:E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(9, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
    ActiveCell.Offset(-7, -7).Range("A1:E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(12, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
    ActiveCell.Offset(-10, -7).Range("A1:E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(15, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
    ActiveCell.Offset(-13, -7).Range("A1:E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(18, 7).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, TRANSPOSE:=True
End Sub

将它加载到一个数组中,然后在输出它时颠倒顺序。类似这样的方法应该可以做到这一点

Sub transpose_it()
  arr = Sheet1.Range("A1").CurrentRegion

 For i = 1 To UBound(arr, 2)
   For j = 1 To UBound(arr)
    Sheet2.Cells(i, j) = arr(j, i)
  Next j
 Next i
End Sub

下面的代码是VBA代码。它必须安装在标准代码模块中。这是工作簿中不存在的模块。必须创建它。它的默认名称将是
Module1
,但我建议您给它一个有意义的名称(不能包含空格)。安装代码后,工作簿必须另存为““已启用宏”,带有xlsm扩展名

Sub ReorderDataPoints()

    ' specify the range of your data batch here
    Const DataSource    As String = "A2:D3"
    Const OutputTab     As String = "Sheet2"        ' change as appropriate
    
    Dim Ws              As Worksheet
    Dim Arr             As Variant          ' array: input data
    Dim C               As Long             ' loop counter: input columns
    Dim R               As Long             ' loop counter: input rows
    Dim Out             As Variant          ' array: output data
    Dim i               As Long             ' loop counter: output row
    Dim j               As Long             ' loop counter: output columns
    
    Set Ws = Worksheets("Sheet1")           ' change as appropriate
    Arr = Ws.Range(DataSource)
    ReDim Out(1 To UBound(Arr, 2), 1 To UBound(Arr))
    i = 1
    
    For R = 1 To UBound(Arr)
        For C = 1 To UBound(Arr, 2)
            j = j + 1
             If j > UBound(Out, 2) Then
                j = 1
                i = i + 1
            End If
            Out(i, j) = Arr(R, C)
        Next C
    Next R
    
    Application.ScreenUpdating = False
    On Error Resume Next
    Set Ws = Worksheets(OutputTab)
    If Err Then
        Set Ws = Worksheets.Add
        ActiveSheet.Name = OutputTab
    Else
        Ws.Cells.ClearContents              ' delete existing data
    End If
    Ws.Cells(1, 1).Resize(UBound(Out), UBound(Out, 2)).Value = Out
    Application.ScreenUpdating = True
End Sub
在运行代码之前,请设置其参数。顶部有两个常量需要赋值。一个指定要转换的数据的位置,另一个指定输出的位置。您还必须查找代码行
set Ws=Worksheets(“Sheet1”)
并更改工作表的名称。这是您的原始数据所在的工作表,代码希望它与代码位于同一工作簿中


对于过程操作的快速指南,代码从指定的批处理范围读取数据(可以是工作表的任何部分,具有任意数量的行和列),将数据排序到一个模式中,以反转行数和列数,然后将结果写入另一个工作表。如果该工作表在开始时不存在,则将创建该工作表。如果该工作表确实存在,则其中的所有数据将被删除,无需发出警告。完成代码后,目标工作表将处于活动状态。

谢谢您的回答!.这是VBA代码吗?我刚试过,但它不起作用。“它不起作用”是没有帮助的。你能说得更具体些吗?你是如何测试的?你得到了什么结果?嘿@Claudia,它确实起作用。我建议你学习更多关于VBA数组的知识,以及如何加载和卸载它们。谷歌“VBA精通数组”“这将为你指明正确的方向谢谢你的回答@JoshPachner,当我尝试代码时,“运行时错误'424':需要对象”的消息出现。我单击debug,它指向Sheet2。Cells(I,j)=arr(j,I)。谢谢@variatus当我在Const DataSource中选择批处理为String=“A2:E5”(例如)时,代码工作正常,但不是很好它以相同的格式将数据从sheet1移动到Sheet2(无转置)。但是,当我在Const DataSource中仅选择一列作为String=“A2:A5”时,代码进行了适当的转置。但代码仍然没有达到每批转置数据的目标