2012-02-28 22:05:49 +0000 2012-02-28 22:05:49 +0000
10
10

Excelで複数行の値を1つの行にまとめる方法は?

私は、2つの異なる値の年間顧客データで構成されているExcelのデータダンプを持っています。そのデータは、各年と顧客の値のための別の行で提供されていました。つまり、以下のようになります。 上の例では、顧客 1 には 2011 年の価値 B がないので、その分の行が生成されていません。また、この例では表現されていませんが、ある年にどちらの値のデータもない(したがって、その年のその顧客の行が生成されない)クライアントもあります。そのような状況では、その年のその顧客の行がないのは問題ありません。

これをワークシートに入れて、各年と顧客の両方の値の行が1つになるようにしたいと思います。つまり、データは次のようになります。

この結果を作成する最も効果的な方法は何ですか?

回答 (5)

6
6
6
2012-02-29 12:18:49 +0000

これはVBA、またはシート上で実行できるマクロです。alt+F11を押してVisual Basic for Applicationプロンプトを表示させ、ワークブックに移動してright click - insert - moduleと入力し、そこにこのコードを貼り付けてください。その後、F5を押すことでVBA内からモジュールを実行することができます。このマクロの名前は “test”

Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
    With Cells
    'if customer name matches
    If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
        'and if customer year matches
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
            'move attribute 2 up next to attribute 1 and delete empty line
            Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
            Rows(RowNum + 1).EntireRow.Delete
        End If
     End If
    End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True

End Sub

これはソートされたスプレッドシートを実行し、顧客と年の両方に一致する連続した行を組み合わせて、現在の空の行を削除します。スプレッドシートは、顧客と年が昇順に表示されるようにソートされている必要があります。

編集 - 私のwith statementは完全に不要な可能性がありますが、誰にも迷惑をかけていません。

revisited 02/28/14

誰かが別の質問でこの答えを使っていて、私が戻ったときにこのVBAは貧弱だと思いました。やり直しました -

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
            c.Offset(,3) = c.Offset(1,3)
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

再訪 05/04/16

再質問 複数の行から1つの行に値を結合するには?モジュールを持っているが、変数の説明が必要 またしても、かなりお粗末。

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

しかし、問題によっては、何も飛ばされないように、行番号にstep -1を付けた方が良いかもしれません。

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub
2
2
2
2013-07-17 18:08:36 +0000

別の方法もあります。

  1. Select Column B, press CTRL+G -> Special-> Blanks -> OK
  2. 0x6 と入力して ↑を押し、次に CTRL+ENTER
  3. Select Column C, press CTRL+G -> =-> Special -> Blanks
  4. OKをタイプして ←をタイプして =IF(を押す ←をタイプして ↓をタイプして =を押す ↓をタイプして ,を押す ↓をタイプして CTRL+ENTER を押す 5. 全てのデータを選択して,0)Copy
  5. 重複しているデータを削除します。

EDIT:

説明: GoTo Blanks オプションを利用しようとしています。一度ブランクを選択してしまえば、選択したすべてのブランクセルに同じ数式を入力することができます。OPの質問についてですが、データにはconsistentブランクがあるように見えます。同様に、Paste Special as Values列の空白は、空白でない行の下の行と同じValue Aを持っています。

0
0
0
2012-02-29 18:12:36 +0000

凝縮されたデータで別表を作成する手順をご紹介します。

1.表全体をコピーし、新しいシートに貼り付けます。 2. 新しい表を選択し、列 CustomerYear の重複を削除 (Data ribbon -> Remove Duplicates) を実行します。これにより、凝縮された表のフレームワークが提供されます。 3. B2 (Value A の最初のエントリ) に以下を入力します。

  1. 4. 列の下の方に数式を記入します。次に、Value B列も同様に塗りつぶします。これで完成です。

いくつか注意点があります。

  • もちろん、データに合わせてアドレスを調整する必要があります。参考までに、Sheet1 は A 列から D 列までの元のデータです。
  • データ(またはヘッダ)は 1 行目から始まると仮定しています。 これはおそらくデータダンプの場合に当てはまります。そうでない場合は、式を調整する必要があります。
  • テーブルの行数が100万行未満であると仮定しています。どうにかしてそれ以上の行数がある場合は、数式の1000000を行数よりも大きな値に変更してください。
  • テーブルの行数が数千行(100,000行以上)の場合は、配列式が大きな配列で詰まってしまう可能性があるので、代わりにVBAソリューションの使用を検討した方がよいでしょう。
0
0
0
2016-07-15 16:44:30 +0000

誰もがVBAコードを多用したり、複雑な関数を使ったりしています。私は、実装するのに1秒かかりますが、はるかに理解しやすく、他のさまざまな可能性に応じて調整するのが非常に簡単な方法を持っています。

上記の例では、以下の(4)関数をそれぞれE2, F2, F2, G2, H2のセル(F&G関数は上記のセルを参照)に貼り付けます:

=IF(D2=D3, A2, IF(D2<>D1, A2, ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2, ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2, IF(D2<>D1, D2, ""))

これらの式を必要なだけ下にドラッグしてください。これは、2行が存在するたびに1行のデータを生成し、1行は影響を受けないままにします。E-F-G-H列の値を(数式を削除するために)別の場所に特別に貼り付け、余分な行をすべて削除するために顧客ごとにソートします。

0
0
0
2012-02-28 22:15:04 +0000

最も効果的な方法は、すべてのデータをピボットテーブルにダンプして、「顧客」を行ラベルにドロップし、他の列でフォローアップすることです。年

ピボットテーブルは、Excel 2010の「挿入」の下にあります。