1

Я пытаюсь разбить массив столбцов с вкраплениями нулей на отдельные столбцы в Excel, разбивая нули в столбце и игнорируя нули.

Например, если у меня есть массив {1,2,3,0,4,5,0,0,6,7,0} , Excel должен вернуть три массива - массив 1 должен быть {1,2,3} , массив 2 должен быть {4,5} , а массив 3 должен {6,7} . Как я могу сделать это в Excel?

2 ответа2

1

Вам нужно использовать VBA для этого.
Как бы я это сделал:

  • читать каждое число, которое является числовым, а не 0, в массив.
  • посчитайте, сколько значений имеет массив и прочитайте его в целое число:
    скажем, i это количество массивов. Чем разделить его на 3. i = i/3
  • проверьте, если i целое число.
    Если да, выведите первые значения i массива, затем второе и третье.
  • Если это не целое число, например, количество массивов было 13 => 13/3 = 4,333 .
    Отбросьте дробь и проверьте четность или нечетность.
    Если оно четное, выходное значение будет 1. i+1 2. i+1 3. i массива.
    Если нечетное: 1. i+1 2. i 3. i

Чтобы получить первую i , вторую i и третью i часть массива, вам нужно использовать другое целое число ex. j . Установите j в 0 , создайте do while array(j) = i-1 для первой части (-1, потому что индекс массива начинается с 0, а не 1).
Вторая часть, которую вы установите j = i(+1 if necessary) , и т.д.

0

Я бы предложил два метода ... сначала с кодом (возможно, это более грязный способ, чем предлагал Divin3, но для меня это проще понять). По сути, вы создаете массив, используя «,» в качестве разделителя, а затем собираете новые массивы для ненулевых элементов. Когда ноль найден, мы сохраняем текущую переменную массива и переходим к следующему, чтобы "собрать" непрерывные ненулевые сегменты:

Sub splitter()
    Dim theNewArray(999)

    theStr = ActiveCell.Value
    theOldArray = Split(theStr, ",")
    x = 0

    theNewArray(x) = ""

    For i = 0 To UBound(theOldArray)
        If theOldArray(i) <> 0 And theOldArray(i) <> "0" Then
            If Len(theNewArray(x)) > 0 Then
                theNewArray(x) = theNewArray(x) & "," & theOldArray(i)
            Else
                theNewArray(x) = theOldArray(i)
            End If
        Else
            If Len(theNewArray(x)) > 0 Then
                x = x + 1
                theNewArray(x) = ""
            End If
        End If
    Next i

    For i = 0 To (x - 1)
        ActiveCell(1, (2 + i)).Value = theNewArray(i)
    Next i
End Sub

Это даст вам следующее (где синий - исходные данные, а оранжевый - выходные данные):

Вывод кода

В качестве альтернативы вы можете предпочесть сделать это с помощью пары простых функций ... выберите ваши данные и используйте «текст в столбцы»:

Текст в столбцы

Скажем, ваши данные разделены. Выберите «другое» и введите 0 (ноль), как показано ниже:

Разделитель

Остальное можно оставить по умолчанию. В итоге вы получите результат, показанный ниже желтым цветом:

Результаты

После этого вы можете очистить символы запятой, используя следующую формулу:

=IF(F1=",","",IF(LEFT(F1, 1)=",",IF(RIGHT(F1, 1)=",",MID(F1, 2, (LEN(F1)-2)),MID(F1,2,(LEN(F1)-1))),MID(F1, 1, (LEN(F1)-1))))

Результаты этой формулы - то, что вы видите выше оранжевым цветом.

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