按列值重新格式化数据集

时间:2016-12-29 18:45:22

标签: excel vba excel-vba sorting macros

我有一个关于在Excel中重新格式化大量数据的问题。按照目前的情况,数据分为四列,按“块”值排序如下。

enter image description here

我想要的是创建一个函数(或者可能是宏),它可以对数据进行排序并获取对应于“Block”值2的所有数据,将这些值删除,然后将它们粘贴到“ F635表示“对应于块1的值”。我想迭代块3的该过程,以及可能存在的任何其他块值。结果应如下所示:

enter image description here

当然,我是手动完成的,但当Block编号扩展到20+时,这很乏味。我已经尝试创建一个宏来执行此操作,但似乎无法使其工作(并且没有保存它,否则我会发布我的代码...对不起)。

任何帮助都将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您的“阻止”值已按顺序排列,就像它们出现在您的示例中一样,那么我认为这样可行:

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

如果它不合适,那就很容易添加。

此外,这预示着如果你的“阻止”值跳过数字(即从3到5),它也不会跳过一列列,它只会取下一个列。从你的例子来看,我无法分辨你想要的行为。如果你想跳过,那么也很容易合并。