Vba 按列值重新格式化数据集
我有一个关于在Excel中重新格式化大量数据子集的问题。目前,数据分为四列,按“块”值排序,如下所示 我想创建一个函数(或者宏),它可以对数据进行排序,并获取与2的“块”值对应的所有数据,剪切掉这些值,然后将它们粘贴到与块1对应的“F635平均值”值旁边。我还想对块3以及可能存在的任何其他块值迭代该过程。结果应该如下所示: 当然,我是手动完成的,但是当块数扩展到20+时,这会很乏味。我试图创建一个宏来实现这一点,但似乎无法让它工作(并且没有保存它,否则我会发布我的代码…对不起) 任何帮助都将不胜感激。提前感谢。如果您的“块”值已按顺序排列,如示例中所示,那么我认为这将起作用:Vba 按列值重新格式化数据集,vba,excel,sorting,macros,Vba,Excel,Sorting,Macros,我有一个关于在Excel中重新格式化大量数据子集的问题。目前,数据分为四列,按“块”值排序,如下所示 我想创建一个函数(或者宏),它可以对数据进行排序,并获取与2的“块”值对应的所有数据,剪切掉这些值,然后将它们粘贴到与块1对应的“F635平均值”值旁边。我还想对块3以及可能存在的任何其他块值迭代该过程。结果应该如下所示: 当然,我是手动完成的,但是当块数扩展到20+时,这会很乏味。我试图创建一个宏来实现这一点,但似乎无法让它工作(并且没有保存它,否则我会发布我的代码…对不起) 任何帮助都将
Sub FunnySort()
Dim ws As Worksheet
Dim row, lastRow, newRow, newCol, block, oldBlock As Integer
Dim fromCell, toCell As Range
Set ws = Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row
oldBlock = ws.Range("B2").Value2
newCol = 1
For row = 3 To lastRow
block = ws.Cells(row, 2).Value2
If block = oldBlock And newCol = 1 Then
' same initial block -- don't do anything
Else
If block <> oldBlock Then
newRow = 2
newCol = newCol + 5
oldBlock = block
End If
Set fromCell = ws.Cells(newRow, newCol)
Set toCell = ws.Cells(newRow, newCol + 4)
ws.Range(fromCell, toCell).Value2 = ws.Range("A" & row & ":E" & row).Value2
newRow = newRow + 1
ws.Range("A" & row & ":E" & row).Clear
End If
Next row
End Sub
Sub FunnySort()
将ws设置为工作表
Dim row、lastRow、newRow、newCol、block、oldBlock作为整数
从单元格变暗,到单元格作为范围
设置ws=图纸(“图纸1”)
lastRow=ws.Cells(ws.Rows.Count,1).End(xlUp).row
oldBlock=ws.范围(“B2”).值2
newCol=1
对于第3行到最后一行
block=ws.Cells(第2行).Value2
如果block=oldBlock,newCol=1,则
'相同的初始块--什么都不要做
其他的
如果阻塞oldBlock那么
纽罗=2
newCol=newCol+5
oldBlock=块
如果结束
Set fromCell=ws.Cells(newRow,newCol)
设置为cell=ws.Cells(新行、新列+4)
ws.Range(fromCell,toCell).Value2=ws.Range(“A”&行&“:E”&行).Value2
newRow=newRow+1
ws.Range(“A”&行&“:E”&行)。清除
如果结束
下一排
端接头
如果它不符合顺序,那就很容易添加
此外,这假定如果“块”值跳过数字(即从3到5),它也不会跳过一块列,它只会跳过下一个可用的列。从你的例子中,我不知道你想要什么样的行为。如果您想跳过,也很容易合并。如果您的“块”值已按顺序排列,如示例中所示,则我认为这将起作用:
Sub FunnySort()
Dim ws As Worksheet
Dim row, lastRow, newRow, newCol, block, oldBlock As Integer
Dim fromCell, toCell As Range
Set ws = Sheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row
oldBlock = ws.Range("B2").Value2
newCol = 1
For row = 3 To lastRow
block = ws.Cells(row, 2).Value2
If block = oldBlock And newCol = 1 Then
' same initial block -- don't do anything
Else
If block <> oldBlock Then
newRow = 2
newCol = newCol + 5
oldBlock = block
End If
Set fromCell = ws.Cells(newRow, newCol)
Set toCell = ws.Cells(newRow, newCol + 4)
ws.Range(fromCell, toCell).Value2 = ws.Range("A" & row & ":E" & row).Value2
newRow = newRow + 1
ws.Range("A" & row & ":E" & row).Clear
End If
Next row
End Sub
Sub FunnySort()
将ws设置为工作表
Dim row、lastRow、newRow、newCol、block、oldBlock作为整数
从单元格变暗,到单元格作为范围
设置ws=图纸(“图纸1”)
lastRow=ws.Cells(ws.Rows.Count,1).End(xlUp).row
oldBlock=ws.范围(“B2”).值2
newCol=1
对于第3行到最后一行
block=ws.Cells(第2行).Value2
如果block=oldBlock,newCol=1,则
'相同的初始块--什么都不要做
其他的
如果阻塞oldBlock那么
纽罗=2
newCol=newCol+5
oldBlock=块
如果结束
Set fromCell=ws.Cells(newRow,newCol)
设置为cell=ws.Cells(新行、新列+4)
ws.Range(fromCell,toCell).Value2=ws.Range(“A”&行&“:E”&行).Value2
newRow=newRow+1
ws.Range(“A”&行&“:E”&行)。清除
如果结束
下一排
端接头
如果它不符合顺序,那就很容易添加
此外,这假定如果“块”值跳过数字(即从3到5),它也不会跳过一块列,它只会跳过下一个可用的列。从你的例子中,我不知道你想要什么样的行为。如果您想跳过,也可以很容易地合并