1

У меня есть столбец, который содержит конечные выходные данные, которые я заинтересован в обработке, данные в этом столбце дают результаты, которые попадают в группы, которые очень близки по значению. Как только я сортирую их в порядке возрастания, они выглядят как пример ниже:

Values
  1.1
  1.0
  1.3
  3.3
  3.1
  3.5
  8.7
  8.8
  8.8

Расхождение в стоимости зависит от расчета, но обычно они довольно близки. Есть ли способ автоматического разделения этого столбца на массив, подобный приведенному ниже?

Value 1   Value 2   Value 3
  1.1       3.3       8.7
  1.0       3.1       8.8
  1.3       3.5       8.8

Количество результатов, попадающих в каждую "группу", не предсказуемо, но минимальная разница между группами равна.

есть ли функция, которая может помочь?

Реалистичные данные, отсортированные по группам после использования макроса:

3.314496   4.707067   5.765178   6.659030   7.449414   8.155307   9.981672   10.527740
3.315203   4.709271   5.765736   6.660503   7.449503   8.157916   9.981750   10.528012
3.315863   4.710029   5.766142   6.660533   7.449609   8.157919   9.982425   10.529845
3.315932   4.710119   5.766472   6.660641   7.449958   8.159919   9.982623   10.531364
3.316198   4.710421   5.766765   6.660654   7.451202   8.160223   9.984346   10.531996
3.316321   4.712422   5.766781   6.661423   7.451525   8.808907   9.984503   10.532077
3.316874              5.767053   6.662583   7.452031   8.809137   9.985143   10.532135
3.317010              5.767273   6.663421   7.452424   8.809198   9.986184   10.532675
3.317121              5.767418   6.663555   7.452803   8.810217   9.986405   10.532898
3.317911              5.767530              7.452806   8.810217   9.986435   10.533993
3.318345              5.767669              7.453056   8.810876   9.986791   10.535355
3.319082              5.768146              7.453588   8.811238   9.986828   10.535844
                      5.768337              7.453770   8.811370   9.986854   
                      5.768448              7.453845   8.811435   9.987180   
                      5.768824              7.453880   8.811577   9.987482   
                      5.768931              7.453912   8.812060   9.987610   
                      5.768971              7.453966   8.812245   9.987809   
                      5.769521              7.453979   8.812363   9.987816   
                      5.769725              7.454064   8.812508   9.987951   
                      5.769920              7.454538   8.812781   9.988456   
                      5.770123              7.455970   8.813038   9.990445   
                      5.770187              7.456215   8.813130   9.990558   
                      5.771034              7.456421   8.813236   9.990600   
                      5.771230              7.456464   8.813414   9.991091   
                                                       8.814133      
                                                       8.814462      
                                                       8.814524      
                                                       8.814553      
                                                       8.815093      

1 ответ1

2

РЕДАКТИРОВАТЬ

Исходя из ваших комментариев, это то, что вы ищете, поскольку вы можете установить порог (разница между двумя числами, которая создает новую «группу»)

Sub Button1_Click()

Dim threshold As Double
threshold = 0.4    ' UPDATE THIS AS YOU SEE FIT

Dim column As Integer
column = 66 ' assumes the next column is B. 65 = A, 66=B, 67= C etc

Dim aRow As Integer
aRow = 1 ' The starting row where the data is

Dim otherRow As Integer
otherRow = aRow

Dim previousCol As Integer
previousCol = 64


Do While (True)

    If (column = 90) Then
        previousCol = previousCol + 1
        column = 65
    End If


    If (Range("A" & aRow).Value = "") Then
        Exit Do
    End If

    If (aRow <> 1) Then

        If Range("A" & aRow).Value - Range("A" & aRow - 1).Value >= threshold Then

            otherRow = 1
            column = column + 1

        End If

    End If


    If (previousCol < 65) Then
        Range(Chr(column) & otherRow).Value = Range("A" & aRow).Value
    Else
        Range(Chr(previousCol) & Chr(column) & otherRow).Value = Range("A" & aRow).Value
    End If

    aRow = aRow + 1
    otherRow = otherRow + 1

Loop

End Sub

Единственная разница в том, что вы можете установить порог в коде (см. Выше), но он больше не удаляет исходные значения из столбца A (см. Снимок экрана ниже). Вы можете удалить это вручную, я думаю.

Выше также ограничен столбец ZZ, который дает около 700 столбцов


Предыдущий ответ по истории:

Этот макрос делает то, что вы хотите

Sub Button1_Click()

Dim column As Integer
column = 66

Dim aRow As Integer
aRow = 1

Dim otherRow As Integer
otherRow = 1

Dim current As Integer
current = -99

Do While (True)

    If (Range("A" & aRow).Value = "") Then
        Exit Do
    End If

    If (current < 0) Then
        current = Split(Range("A" & aRow), ".")(0)
    End If

    If (Split(Range("A" & aRow), ".")(0) <> current) Then
        current = Split(Range("A" & aRow), ".")(0)
        otherRow = 1
        column = column + 1
    End If

    Range(Chr(column) & otherRow).Value = Range("A" & aRow).Value
    Range("A" & aRow).Value = "" 'Clear A column

    otherRow = otherRow + 1
    aRow = aRow + 1

Loop

End Sub

До

После

Итак, на что следует обратить внимание:

  1. Предполагается, что столбец A имеет все содержимое и что будут пустые ячейки (пустая ячейка будет указывать на конец списка)
  2. Он разделяется на десятичную дробь (.). Если десятичная дробь отсутствует, она будет обрабатываться как N.0
  3. Столбец A становится пустым столбцом, но я предполагаю, что удалить столбец впоследствии не составит труда ... Или, согласно коду, вы можете закомментировать строку Range("A" & aRow).Value = "" 'Clear A column который будет сохранять столбец A как есть.
  4. В приведенном вами примере у вас есть 3 записи на группу номеров (3 начались с 1.N, 3 началось с 3.N и 3 начались с 8.N). Это не нужно, чтобы быть в группах по 3
  5. Предполагается, что ваш список уже отсортирован

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .