web-dev-qa-db-ja.com

Excel-複数の列を1つの列に結合する

Excelの別々の列にある複数のリストがあります。これらのデータ列を1つの大きな列に結合する必要があります。重複するエントリがあるかどうかは気にしませんが、各列の行1をスキップする必要があります。

また、ROW1に1月から12月までのヘッダーがあり、列の長さが異なり、1つの大きな列に結合する必要がある場合はどうでしょうか。

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

各列の最初の行はスキップする必要があります。

10
Akib

これを試して。データの範囲内の任意の場所をクリックしてから、次のマクロを使用します。

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
17
Alex P

マクロを使用せずに列を組み合わせることができます。数式バーに次の関数を入力します。

= IF(ROW()<= COUNTA(A:A)、INDEX(A:A、ROW())、IF(ROW()<= COUNTA(A:B)、INDEX(B:B、 ROW()-COUNTA(A:A))、IF(ROW()> COUNTA(A:C)、 ""、INDEX(C:C、ROW()-COUNTA(A:B))))) =

3つの列を組み合わせる必要があるため、ステートメントは3つのIF関数を使用します。

  • 列Aの場合、関数はセルの行番号を空でないA列のセルの総数と比較します。結果がtrueの場合、関数は、row()にある列Aのセルの値を返します。結果がfalseの場合、関数は次のIFステートメントに進みます。
  • 列Bの場合、関数はセルの行番号を空でないA:B範囲のセルの総数と比較します。結果がtrueの場合、関数は列Bの空でない最初のセルの値を返します。falseの場合、関数は次のIFステートメントに進みます。
  • 列Cの場合、関数はセルの行番号を空でないA:C範囲のセルの総数と比較します。結果がtrueの場合、関数は空白のセルを返し、それ以上の計算は行いません。 falseの場合、関数は列Cで空でない最初のセルの値を返します。
9
CristinaP

簡単なExcelの数式を使用して、マクロを使用せずにこれを行う方法のサンプルスプレッドシートを作成しました(最初の行を取り除くために独自の調整を行う必要がありますが、これが私の例を理解したら簡単になるはずです)スプレッドシートは機能します):

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

2
Kenny LJ

これが完全に役立つかどうかはわかりませんが、「スマート」マージが必要な問題がありました。 AとBの2つの列がありました。Aが空白の場合にのみBを移動したいと思いました。下記参照。これは、おそらく最初の行をオフセットするために使用できる選択範囲に基づいています。

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
1
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
Mark Baker