Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Vba 按列值重新格式化数据集_Vba_Excel_Sorting_Macros - Fatal编程技术网

Vba 按列值重新格式化数据集

Vba 按列值重新格式化数据集,vba,excel,sorting,macros,Vba,Excel,Sorting,Macros,我有一个关于在Excel中重新格式化大量数据子集的问题。目前,数据分为四列,按“块”值排序,如下所示 我想创建一个函数(或者宏),它可以对数据进行排序,并获取与2的“块”值对应的所有数据,剪切掉这些值,然后将它们粘贴到与块1对应的“F635平均值”值旁边。我还想对块3以及可能存在的任何其他块值迭代该过程。结果应该如下所示: 当然,我是手动完成的,但是当块数扩展到20+时,这会很乏味。我试图创建一个宏来实现这一点,但似乎无法让它工作(并且没有保存它,否则我会发布我的代码…对不起) 任何帮助都将

我有一个关于在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),它也不会跳过一块列,它只会跳过下一个可用的列。从你的例子中,我不知道你想要什么样的行为。如果您想跳过,也可以很容易地合并