Excel - объединить несколько столбцов в один столбец - PullRequest
9 голосов
/ 05 июня 2010

У меня есть несколько списков, которые находятся в отдельных столбцах в Excel. Что мне нужно сделать, это объединить эти столбцы данных в один большой столбец. Мне все равно, если есть повторяющиеся записи, однако я хочу, чтобы пропустить строку 1 каждого столбца.

Кроме того, что если ROW1 имеет заголовки с января по декабрь, а длина столбцов различна и их необходимо объединить в один большой столбец?

ROW1| 1   2   3    
ROW2| A   D   G    
ROW3| B   E   H    
ROW4| C   F   I

должно объединиться в

A    
B    
C    
D    
E    
F    
G    
H    
I

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

Ответы [ 5 ]

16 голосов
/ 05 июня 2010

Попробуй это. Щелкните в любом месте диапазона данных, а затем используйте этот макрос:

Sub CombineColumns()
Dim rng As Range
Dim iCol As Integer
Dim lastCell As Integer

Set rng = ActiveCell.CurrentRegion
lastCell = rng.Columns(1).Rows.Count + 1

For iCol = 2 To rng.Columns.Count
    Range(Cells(1, iCol), Cells(rng.Columns(iCol).Rows.Count, iCol)).Cut
    ActiveSheet.Paste Destination:=Cells(lastCell, 1)
    lastCell = lastCell + rng.Columns(iCol).Rows.Count
Next iCol
End Sub
9 голосов
/ 03 декабря 2014

Вы можете комбинировать столбцы без использования макросов. Введите следующую функцию в строке формул:

= ЕСЛИ (СТРОКА () <= СЧЕТЗ (А: А), ИНДЕКС (А: А, СТРОКА ()), ЕСЛИ (СТРОКА () <= СЧЕТЗ (А: В), ИНДЕКС (В: В, СТРОКА () - СЧЕТЗ (А: А)), ЕСЛИ (СТРОКА ()> СЧЕТЗ (А: В), "", ИНДЕКС (С: С, СТРОКА () - СЧЕТЗ (А: В)))))

В операторе используются 3 функции IF, поскольку ему необходимо объединить 3 столбца:

  • Для столбца A функция сравнивает номер строки ячейки с общим количеством ячеек в столбце A, которые не являются пустыми. Если результат равен true, функция возвращает значение ячейки из столбца A в строке (). Если результат равен false, функция переходит к следующему оператору IF.
  • Для столбца B функция сравнивает номер строки ячейки с общим количеством ячеек в диапазоне A: B, которые не являются пустыми. Если результат равен true, функция возвращает значение первой непустой ячейки в столбце B. Если значение false, функция переходит к следующему оператору IF.
  • Для столбца C функция сравнивает номер строки ячейки с общим количеством ячеек в диапазоне A: C, которые не являются пустыми. Если результат равен true, функция возвращает пустую ячейку и больше не производит вычислений. Если false, функция возвращает значение первой ячейки, которая не является пустой в столбце C.
2 голосов
/ 27 марта 2013

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

https://docs.google.com/a/umich.edu/spreadsheet/ccc?key=0AuSyDFZlcRtHdGJOSnFwREotRzFfM28tWElpZ1FaR2c#gid=0

1 голос
/ 05 июня 2010
Function Concat(myRange As Range, Optional myDelimiter As String) As String 
  Dim r As Range 
  Application.Volatile 
  For Each r In myRange 
    If Len(r.Text) Then 
      Concat = Concat & IIf(Concat <> "", myDelimiter, "") & r.Text 
    End If 
  Next 
End Function
1 голос
/ 05 июня 2010

Не уверен, что это полностью помогает, но у меня была проблема, когда мне нужно было "умное" слияние. У меня было две колонки, A & B. Я хотел переместить B, только если A был пустым. Увидеть ниже. Он основан на диапазоне выбора, который можно использовать для смещения первой строки, возможно.

Private Sub MergeProjectNameColumns()
    Dim rngRowCount As Integer
    Dim i As Integer

    'Loop through column C and simply copy the text over to B if it is not blank
    rngRowCount = Range(dataRange).Rows.Count
    ActiveCell.Offset(0, 0).Select
    ActiveCell.Offset(0, 2).Select
    For i = 1 To rngRowCount
        If (Len(RTrim(ActiveCell.Value)) > 0) Then
            Dim currentValue As String
            currentValue = ActiveCell.Value
            ActiveCell.Offset(0, -1) = currentValue
        End If
        ActiveCell.Offset(1, 0).Select
    Next i

    'Now delete the unused column
    Columns("C").Select

    selection.Delete Shift:=xlToLeft
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...