Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Excel 将动态范围数据从垂直格式转换为水平格式_Excel_Vba - Fatal编程技术网

Excel 将动态范围数据从垂直格式转换为水平格式

Excel 将动态范围数据从垂直格式转换为水平格式,excel,vba,Excel,Vba,这是给我的数据,你可以看到B列和C列在所有方面都相似,除了导出项数据: 这是在没有VBA代码的情况下转换为水平方式的数据: 唯一的问题是,每当我尝试通过VBA代码执行时,我都无法获得剩余的数据。 它是杂乱无章的 Sub test2() Dim Ws As Worksheet Dim toWs As Worksheet Dim vDB, vR() Dim rngDB As Range Dim i As Long, j As Long, n As Lo

这是给我的数据,你可以看到B列和C列在所有方面都相似,除了导出项数据:

这是在没有VBA代码的情况下转换为水平方式的数据:

唯一的问题是,每当我尝试通过VBA代码执行时,我都无法获得剩余的数据。 它是杂乱无章的

  Sub test2()
    Dim Ws As Worksheet
    Dim toWs As Worksheet
    Dim vDB, vR()
    Dim rngDB As Range
    Dim i As Long, j As Long, n As Long
    Dim r As Long, c As Long, k As Long

    Set Ws = Sheets(1)
    Set toWs = Sheets(2)

    Set rngDB = Ws.Range("a1").CurrentRegion
    vDB = rngDB

    r = UBound(vDB, 1)
    c = UBound(vDB, 2)

    For j = 2 To c
        n = n + 1
        'ReDim Preserve vR(1 To 4, 1 To n)
        ReDim Preserve vR(1 To 5, 1 To n)
        vR(1, n) = vDB(1, j)
        vR(2, n) = vDB(2, j)
        vR(3, n) = vDB(3, j)
        vR(4, n) = vDB(4, j)
        vR(5, n) = vDB(r, j) 'added insurance
        'For i = 5 To r
        For i = 5 To r - 1
            If vDB(i, j) <> "" Then
                n = n + 1
                ReDim Preserve vR(1 To 5, 1 To n)
                vR(4, n) = vDB(i, j)
            End If
        Next i
    Next j

    With toWs
        k = .UsedRange.Rows.Count + 1
        '.Range("a" & k).Resize(n, 4) = WorksheetFunction.Transpose(vR)
        .Range("a" & k).Resize(n, 5) = WorksheetFunction.Transpose(vR)
    End With

End Sub
子测试2()
将Ws设置为工作表
将拖缆变暗为工作表
Dim vDB,vR()
Dim rngDB As范围
暗i为长,j为长,n为长
变暗r为长,c为长,k为长
设置Ws=图纸(1)
设置拖航=张数(2)
设置rngDB=Ws.Range(“a1”).CurrentRegion
vDB=rngDB
r=UBound(vDB,1)
c=UBound(vDB,2)
对于j=2到c
n=n+1
'重读保留vR(1到4,1到n)
重拨保留vR(1到5,1到n)
vR(1,n)=vDB(1,j)
vR(2,n)=vDB(2,j)
vR(3,n)=vDB(3,j)
vR(4,n)=vDB(4,j)
vR(5,n)=vDB(r,j)“附加保险”
'对于i=5到r
对于i=5到r-1
如果vDB(i,j)“,则
n=n+1
重拨保留vR(1到5,1到n)
vR(4,n)=vDB(i,j)
如果结束
接下来我
下一个j
拖
k=.UsedRange.Rows.Count+1
'.Range(“a”&k).Resize(n,4)=工作表函数.Transpose(vR)
.Range(“a”&k).Resize(n,5)=工作表函数.Transpose(vR)
以
端接头
试试这个:

Sub Test2()

    Dim i&, j&, vIn, vOut

    With ThisWorkbook

        vIn = .Worksheets(1).Range("a1").CurrentRegion.Value2

        ReDim vOut(1 To UBound(vIn, 2), 1 To UBound(vIn, 1))

        For i = 1 To UBound(vIn, 1)
            For j = 1 To UBound(vIn, 2)
                vOut(j, i) = vIn(i, j)
            Next
        Next

        .Worksheets(2).Range("a1").Resize(UBound(vOut, 1), UBound(vOut, 2)) = vOut

    End With    

End Sub
一种更通用、可重用和功能性更强的方法是

Sub Test3()

    Dim vIn

    With ThisWorkbook        
        vIn = .Worksheets(1).[a1].CurrentRegion.Value2
        .Worksheets(2).[a1].Resize(UBound(vIn, 2), UBound(vIn, 1)) = MyTranspose(vIn)            
    End With

End Sub

Function MyTranspose(vIn)

    Dim i&, j&, vOut

    ReDim vOut(1 To UBound(vIn, 2), 1 To UBound(vIn, 1))        
    For i = 1 To UBound(vIn, 1)
        For j = 1 To UBound(vIn, 2)
            vOut(j, i) = vIn(i, j)
        Next
    Next    
    MyTranspose = vOut

End Function

转置数据

tltr;我没有遵循之前的讨论。。。但是为什么不将
Application.Transpose()
应用于整个数据集,而不是执行内部和外部循环呢

Option Explicit                                               ' declaration head of code module

Sub TransposeData()
    '[1]get data and assign them to variant 1-based 2-dim array
        Dim v ' As Variant
        v = Sheet1.Range("A1").CurrentRegion.Value2            ' << change to your source worksheet's CodeName

    '[2]transpose data and write to target sheet - e.g. Code(Name) Sheet2  
        Sheet2.Range("A1").Resize(UBound(v, 2), UBound(v, 1)) = Application.Transpose(v)

End Sub
选项显式“代码模块的声明头”
副主席(a)
“[1]获取数据并将其分配给基于变体1的2维阵列
Dim v’作为变体

v=Sheet1.Range(“A1”).CurrentRegion.Value2'您是否使用长时间的手动方式进行学习?是的,过程很长,但@Dy.Lee给出的代码在我有少量数据时效果很好,但现在我有了长时间的数据,而循环的使用是我非常不擅长的。rngDB.Transpose()没有被使用bcz的原因是我有本质上是动态的数据,简单地转置数据将不起作用,或者我想我只做了手动转置。答案对你有用吗?@AmitShah,你的数据形式又变了。您之前询问的数据现在完全不同了。您应该始终如一地询问有关数据的确切类型和转换类型的问题。前面的代码不适用于此数据。给出答案而不以任何方式确认是不礼貌的。如果解决方案对您有效,请接受答案。如果不起作用,请解释原因。此代码无法下一行,如果我有新数据,即每次输入新数据时,新数据似乎覆盖了前一行。请澄清您的问题。上面的代码非常适合您的初始问题。但是如果我必须输入新的数据集,那么它将覆盖以前的数据。它没有被输入下一行。请帮帮我。我也给你发了一封邮件,里面有所有的细节和文件。OP在评论中说他不想使用Transpose().Thx作为提示;不太确定-阅读最新评论,无需进一步解释/编辑,我不清楚OP是否更喜欢简单的数据转换或重新排列的数据:)