2

У меня есть колонка из 200 мобильных номеров.
Я хочу преобразовать их в строки текста в виде набора из 4 мобильных номеров, разделенных запятой.

12345678, 12345678, 12345678, 12345678
12345678, 12345678, 12345678, 12345678
12345678, 12345678, 12345678, 12345678

Пожалуйста, дайте мне совет.

3 ответа3

2

Простой макрос VBA для транспонирования одного столбца в несколько столбцов

Я прокомментировал каждый шаг, так что легко настроить макрос в соответствии с вашими личными потребностями.
Вы можете выбрать столбец данных и сколько столбцов вы хотите после транспонирования

  1. Откройте редактор Excel и VBA с помощью Alt+F11
  2. На левой панели вставьте код под лист, где размещены ваши данные
  3. Измените первые две строки в соответствии с вашими потребностями
  4. Выполнить макрос с помощью F5

Const strCol = "B"    '## select the column with your data
Const iTrans = 4      '## select how many columns you want after transposing

Sub transposeColumn()
    '## search the last row to know how many cells we have to iterate through
    iLastrow = Range(strCol & ActiveSheet.Rows.Count).End(xlUp).Row
    iCol = Range(strCol & 1).Column

    '## begin to loop through the chosen column
    '## Cause we delete cells on every loop, we need to divide the loop counter
    '## And since the division result isn't an integer, we have to round up
    For i = 1 To WorksheetFunction.RoundUp(iLastrow / iTrans, 0)

        '## set the source and target range for easier access later
        Set rngSrc = Range(Cells(i + 1, iCol), Cells(i + iTrans - 1, iCol))
        Set rngTrg = Range(Cells(i, iCol + 1), Cells(i, iCol + iTrans - 1))

        '## set the format of target range to text
        rngTrg.NumberFormat = "@"

        '## copy and paste the values, the trick is to use transpose
        rngSrc.Copy
        rngTrg.PasteSpecial Transpose:=True

        '## delete all cells which we have just transposed
        rngSrc.Delete shift:=xlUp
    Next i
End Sub  
0

Сценарий awk поможет с проблемой.

Первый цикл for скрипта awk имеет дело с числами до конечного числа, кратного четырем. Второй цикл печатает последние несколько цифр. Если это окончательное число, конечная запятая не печатается.

awk '{ 
    for (n=1; n < NF-4; n+=4)
           printf("%s, %s, %s, %s\n", $n, $(n+1), $(n+2), $(n+3));    
    for (; n <= NF; n++)
        if (n == NF) 
            print $n;
        else 
            printf("%s, ", $n)          
}' filename
0

Вот решение функции листа. Где ваш список в A1:A40:

=TEXT(INDEX($A$1:$A$40,(ROW()-1)*4+COLUMN()-2),"0000000000")

Это вводится в C1 и заполняется вправо до F1 а затем вниз столько строк, сколько вам нужно.

Вам нужно будет настроить формулу в соответствии с вашим листом.

Например, если вы хотите, чтобы ваши выходные строки начинались с C2 , второй аргумент функции INDEX должен быть (ROW()-2)*4+COLUMN()-2 .

Если вы хотите, чтобы выходные строки начинались с D1 , вторым аргументом функции INDEX должно быть (ROW()-1)*4+COLUMN()-3 .

РЕДАКТИРОВАТЬ:
Я только что увидел, что вы хотели вывод через запятую. Это немного хакерски, потому что CONCATENATE не может принимать аргументы массива, но он будет работать. Просто заполните следующую формулу вниз по столбцу.

=CONCATENATE(TEXT(INDEX($A$1:$A$40,(ROW()-1)*4+1),"0000000000"),", ",TEXT(INDEX($A$1:$A$40,(ROW()-1)*4+2),"0000000000"),", ",TEXT(INDEX($A$1:$A$40,(ROW()-1)*4+3),"0000000000"),", ",TEXT(INDEX($A$1:$A$40,(ROW()-1)*4+4),"0000000000"))

Это зависит от вашего вывода, начиная со строки 1. Если, например, ваш вывод начинается со строки 2, вам нужно изменить каждый экземпляр ROW()-1 на ROW()-2 .

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