Я имею в виду, что у меня есть документ Excel с 4 рядами

   A      B       C        D
1  Data1   Data2  Data3   Data4
2  Data5   Data6  Data7   Data8

Я хочу, чтобы все данные D-строки попали в нижнюю строку и стали такими.

   A      B       C       
1  Data1   Data2  Data3   
2  Data4   // First Data of D row on below line moved on line 2
3  Data5   Data6  Data7 
4  Data8  // Second Data of D row on below line moved on line 4.

Можно ли это сделать в любом случае?

Заранее спасибо. -> Я использую Excel 2007, но я хотел бы знать, можно ли это сделать на более новых версиях Excel.

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

The code of the macro is this:
Sub Μακροεντολή3()
'
' Μακροεντολή3 Μακροεντολή
'

'
    Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    ActiveCell.Offset(-1, 3).Range("A1").Select
    Selection.Cut
    ActiveCell.Offset(1, -3).Range("A1").Select
    ActiveSheet.Paste
End Sub

Можете ли вы помочь мне получить цикл для всех столбцов с шагом 2 до конца?

Заранее спасибо.

4 ответа4

0

Поскольку я попробовал все ваши ответы, я следовал за сборками макросов на Excel. Я сделал некоторые вещи, а затем я получил стек, поэтому я отправил другой, но все еще тот же вопрос по stackoverflow. Так вот и ответ. https://stackoverflow.com/questions/38085058/getting-a-column-on-the-next-row-on-excel-with-macro/38095470?noredirect=1#comment63633911_38095470

    Sub ConvertColDtoRow()
'Note that this code is written specifically for column D, but it can be adjusted as needed by changing the column specified

Dim Count As Long, LastRow As Long
Count = 1
LastRow = ActiveSheet.UsedRange.Rows.Count
Do While Count <= LastRow
    If Not IsEmpty(ActiveSheet.Cells(Count,4)) Then
        Range(Cells(Count,4).Address).Offset(1,0).EntireRow.Insert
        Cells(Count + 1,1).Value = Cells(Count,4).Value
        Cells(Count,4).Value = ""
        Count = Count + 2
        LastRow = LastRow + 1
    Else
        Count = Count + 1
    End If
Loop

End Sub

Кредиты в @RGA. Спасибо всем большое за ваше время.

0

@ Lluser ответ впечатляет.

Мой ответ может быть проще. Опять же, вы можете сделать это, скопировав данные в другую таблицу (или набор столбцов).

Вы можете использовать три формулы в трех новых столбцах, F, G и H следующим образом:

F1:  =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("A",(ROUNDDOWN(ROW()/2,0))+1)),INDIRECT(CONCATENATE("D",(ROUNDDOWN(ROW()/2,0)))))

G1:  =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("B",(ROUNDDOWN(ROW()/2,0))+1)),"")

H1:  =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("C",(ROUNDDOWN(ROW()/2,0))+1)),"")

И заполните их, чтобы удвоить количество строк, как в исходной таблице.

Поэтому это должно выглядеть примерно так:

Некоторое объяснение:

  1. Вы узнаете, является ли текущая строка нечетной или четной. Каждая нечетная / четная пара в новой таблице соответствует одной из строк исходной таблицы (это будет верно, если номер нечетной строки «MOD (ROW (), 2) = 1»).
  2. Если в новой таблице нечетная строка, вы берете значения из столбцов AB и C.
  3. Если хотя бы строка в новой таблице AND находится в одной из групп G или H, то у вас просто пустая строка.
  4. Если хотя бы строка в новой таблице AND находится в столбце F, то вы берете 4-е значение (столбец D) исходной таблицы.

Пункт 2, достигается этим:

INDIRECT(CONCATENATE("A",(ROUNDDOWN(ROW()/2,0))+1))

который просто ссылается на строку, на которую вы нацеливаетесь. "Косвенный" - это особый способ Excel создать ссылку из строки (например, A1, A2 и т.д.). В этом случае я строю строку с A и номером строки, на которую ориентируется новая таблица.

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

Надеюсь, что это помогает и может быть понято.

0

На вкладке "Разработчик" обязательно включите "Использовать относительные ссылки".

  • Запись макроса
  • От A1, перейдите к D1
  • Резать
  • Перейти к A2
  • Вставить строку
  • Вставить
  • Перейти к следующему ряду
  • Остановить макрос
  • Сохранить макрос
  • Затем перезапустите макрос.

Цикл макрос:

Sub Macro1()

Пусть х = 0

Делать, пока х <10

ваш код

х = х + 1

петля

End Sub

0

Эта формула может быть использована для вашего примера. Его можно использовать для создания новой таблицы, в которой "добавляется перенос строки" перед каждым значением в последнем столбце.

=IFERROR(INDEX($A$1:$D$20,TRUNC((ROW()-ROW($F$1)+2)/2,0),COLUMN()-COLUMN($F$1)+1+MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)),"")

$A$1:$D$20 - исходная таблица. $F$1 - первая ячейка новой таблицы.

Для диапазонов, использованных выше: вставьте формулу в ячейку F1 и растяните до H40. Вы можете настроить формулу, заменив диапазон и начальный адрес ячейки в блокноте (CTL+H - ваш друг).

Как это устроено?

  1. Смотрите функцию INDEX для справки Excel.
  2. Параметр строки: TRUNC((ROW()-ROW($F$1)+2)/2,0) , поместите его в любую ячейку и растяните вниз - он возвращает числа, увеличивающиеся на 1 от 1. Это значение одинаково для каждых двух строк.
  3. COLUMN()-COLUMN($F$1)+1+MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)) немного сбивает с толку, но он состоит из двух частей. Первое: COLUMN()-COLUMN($F$1)+1 возвращает только индекс строки в таблице результатов. Второе: MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)) "активен" только на четных строках (потому что MOD((ROW($F$1)-ROW()),2) = 1 , в нечетной строке есть MOD((ROW($F$1)-ROW()),2) = 0 и умножить последнюю часть (COLUMNS($A$1:$D$20)-1) которые представляют количество строк в исходной таблице минус 1. Поэтому, когда эта формула находится в четной строке (в первом столбце), параметром столбца для функции INDEX является "column index in result table"+1*"column count in source table -1") что равно 1+1*(4-1) и его индекс последнего столбца.
  4. Функция IFERROR используется для замены кодов ошибок (когда функция INDEX выходит за пределы диапазона) на "" она представляет пустую ячейку.

Лист, использованный для создания этого ответа

PS: Когда вы растягиваете таблицу результатов до того же числа столбцов, что и исходная таблица, вы получаете нежелательные значения в этом последнем столбце (это можно предотвратить с помощью еще одной функции IF, но формула результата будет гораздо более сложной / запутанной)

PPS: простите за плохой английский

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