在Excel中按组转换数据

时间:2017-02-08 14:18:28

标签: excel vba excel-vba

我在Excel中将一些数据分组到一列中的数据块中。每个块都有一个标识在顶部的序列号,然后是一个空格,然后是相关的数据。格式类似于以下内容:

    20204

    0.009447773
    0.008672609
    0.04769611
    0.041069839
    -0.035158783
    -0.06094639
    0.059548043
    0.029640036

    8081

    0.003970223
    -0.024156246
    0.063038863
    0.005341972
    0.124618374
    0.005495709
    0.098642513
    0.005636186
    0.063350961
    0.128130779


    106663

    0.115009077
    0.049194194
    -0.057100467
    0.037476741
    0.063087314
    0.072773643
    0.003909923
    0.000448073
    0.008006874
    0.008718021
    0.009883258
   -0.022708477
    0.028655466

块以规则的间隔出现并且长度相同(间隔为2007个单元)。因此,第一个序列号出现在D19,下一个出现在D2026,然后是D4033等。这延伸了几千行。

我想根据序列号将每个数字块乘以不同的数量。所以我希望将第一个块中的所有内容乘以0.5,将第二个块中的所有内容乘以2,将第三个中的所有内容乘以1.2,等等,根据如下表格:

   Serial   Scalar
    20204   0.5
    8081    2
    106663  1.2 

通过VBA或相邻单元格中的公式,最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以展开Areas对象

Range属性
Option Explicit

Sub main2()
    Dim iArea As Long
    Dim serialToScalarTable As Range, cell As Range
    Dim multiplier As Double

    Set serialToScalarTable = Range("A2:B4") '<--| table where you have serial/scalar correspondence

    With Range("D19", Cells(Rows.count, 4).End(xlUp)).SpecialCells(xlCellTypeConstants, xlNumbers)
        For iArea = 2 To .Areas.count Step 2
            multiplier = Application.VLookup(.Areas(iArea - 1).Value, serialToScalarTable, 2, False)
            For Each cell In .Areas(iArea)
                cell.Value = cell.Value * multiplier
            Next
        Next
    End With
End Sub