Excel 将动态范围数据从垂直格式转换为水平格式
这是给我的数据,你可以看到B列和C列在所有方面都相似,除了导出项数据: 这是在没有VBA代码的情况下转换为水平方式的数据: 唯一的问题是,每当我尝试通过VBA代码执行时,我都无法获得剩余的数据。 它是杂乱无章的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
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是否更喜欢简单的数据转换或重新排列的数据:)