2016-12-01 2 views
0

У меня есть файл Excel, который имеет только один столбец. Я хочу перенести содержимое с первых 4 строк на четыре разных столбца (первая строка в столбце 1, вторая строка в столбце 2 и т. Д.), А затем я хочу повторить эту же операцию до тех пор, пока все значения из столбцов не будут распределены эти четыре столбца (четыре строки повторяются в серии). Затем каждая строка имеет уникальное слово, которое я хочу найти, и на основании этого я хочу переместить его (вырезать и вставить) в определенный столбец. Я думаю, что приведенный ниже пример легче объяснить. Я хочу найти слово «сыр», и если он найден, я хочу, чтобы его переместили в столбец два, и эта операция повторялась до тех пор, пока все строки, содержащие слово «сыр», не были объединены в один столбец. Я пытаюсь упорядочить данные в таблицу, которую я могу использовать позже. Спасибо за помощь. Я получаю данные из TXT-файла и помещаю его в Excel, и это тоже сложно.Excel Macro: упорядочивание данных из строки в другой столбец

Пример

Row1 
Cheese: 250 
Row2 
Ham: 35 
Row3 
Cheese: 200 
Row 4 
Ham:40 
Row5 
Cheese: 230 
Row6 
Ham:45 

код

Sub test4() 

    Dim lastrow As Long 
    lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 

    For i = 1 To lastrow 
     Range("A1").Activate 
     Cells.Find(What:="Part").Copy 
     If ActiveSheet.Cells(i, 2) = "" Then 
      ActiveSheet.Cells(i, 2).Activate 
      'Range("B1").Activate 
      ActiveCell.PasteSpecial (xlPasteAll) 
     End If 
    Next i 
End Sub 
+0

Непонятно, что вы хотите сделать. Вы говорите: «Я хочу перенести содержимое с первых четырех строк на четыре разных столбца», но есть только две ключевые работы: «Сыр» и «Ветчина», а затем вы хотите переместить их снова? Я снимал снимки с фактических данных, и желаемый результат был бы идеальным. –

+0

Томас Инзина и Тим Уильямс. Вы предоставили два очень умных и элегантных решения моей проблемы. Большое спасибо! – JAGR

ответ

2

Это будет копировать данные, начиная с C1

Sub test4() 
    Const PER_ROW As Long = 4 
    Dim i As Long, sht as WorkSheet 

    Set sht = ActiveSheet 

    For i = 1 To sht.UsedRange.SpecialCells(xlCellTypeLastCell).Row 

     sht.Cells(1,3).offset(Application.Floor((i-1)/PER_ROW, 1) , _ 
           (i-1) Mod PER_ROW).value = sht.Cells(i,1).Value 
    Next i 

End Sub 
+0

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

2

enter image description here

Sub MoveData() 
    Dim x As Long 
    Application.ScreenUpdating = False 

    For x = 1 To Range("A" & Rows.Count).End(xlUp).Row 
     Range("B1:E1").Cells(x).Value = Cells(x, 1).Value 
    Next 

    Columns(1).Delete 
    Columns.AutoFit 
    Application.ScreenUpdating = True 
End Sub 
+0

Ницца! - Я бы никогда не подумал об этом. –

+0

@TimWilliams Спасибо! FYI: вы можете транспонировать 1 или 2 мерные массивы, используя ту же технику. Это происходит потому, что 'For Every' выполняет итерацию по каждому элементу в столбце Array по столбцу. –

+0

@TimWilliams, кстати, я бы никогда не думал использовать ваш метод. –

Смежные вопросы