Bagaimana cara menggabungkan nilai dari beberapa baris menjadi satu baris di Excel?

10

Saya memiliki dump data di Excel yang terdiri dari data pelanggan tahunan untuk dua nilai yang berbeda. Data diberikan dengan baris terpisah untuk nilai setiap tahun dan pelanggan. Yaitu seperti ini:

masukkan deskripsi gambar di sini

Aku terjebak dengan baris untuk Pelanggan 1 untuk Nilai A pada 2009 dan baris yang terpisah untuk Nilai B untuk sama pelanggan dalam yang sama tahun.

Dalam beberapa kasus tidak ada Nilai A atau Nilai B. Dalam contoh di atas, Anda dapat melihat bahwa Pelanggan 1 tidak memiliki Nilai B di 2011, jadi tidak ada baris yang dihasilkan untuk itu. Dan, meskipun tidak terwakili dalam contoh, beberapa klien tidak akan memiliki data untuk nilai baik dalam satu tahun (dan dengan demikian tidak ada baris untuk pelanggan pada tahun itu). Dalam situasi itu, tidak memiliki baris untuk pelanggan pada tahun itu baik-baik saja.

Saya ingin memasukkan ini ke lembar kerja di mana ada satu baris untuk kedua nilai untuk setiap tahun dan pelanggan. Yaitu, saya ingin data terlihat seperti ini:

masukkan deskripsi gambar di sini

Apa cara paling efektif untuk menciptakan hasil itu?

Greg R.
sumber

Jawaban:

6

Ini adalah VBA, atau makro yang bisa Anda jalankan di sheet Anda. Anda harus menekan alt+ F11untuk membuka prompt Visual Basic for Application, buka buku kerja Anda right click - insert - moduledan tempel kode ini di sana. Anda kemudian dapat menjalankan modul dari dalam VBA dengan menekan F5. Makro ini bernama "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

Ini akan dijalankan melalui spreadsheet yang diurutkan dan menggabungkan baris berturut-turut yang cocok dengan pelanggan dan tahun dan menghapus baris yang sekarang kosong. Spreadsheet harus diurutkan sesuai cara Anda menyajikannya, pelanggan dan tahun naik, makro khusus ini tidak akan terlihat di luar baris berturut-turut .

Sunting - sangat mungkin saya with statementbenar-benar tidak dibutuhkan, tetapi tidak menyakiti siapa pun ..

REVISASI 02/28/14

Seseorang menggunakan jawaban ini dalam pertanyaan lain dan ketika saya kembali saya pikir VBA ini buruk. Saya telah memperbaikinya -

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

Revisited 05/04/16

Ditanya lagi Bagaimana cara menggabungkan nilai dari beberapa baris menjadi satu baris? Memiliki modul, tetapi perlu menjelaskan variabel dan sekali lagi, itu sangat buruk.

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

Namun, tergantung pada masalahnya, mungkin lebih baik step -1menggunakan nomor baris sehingga tidak ada yang terlewati.

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
Raystafarian
sumber
2

Pilihan lain:

  1. Pilih Kolom B, tekan CTRL+G-> Special-> Blanks->OK
  2. Ketik =tekan , laluCTRL+ENTER
  3. Pilih Kolom C, tekan CTRL+G-> Special-> Blanks->OK
  4. Ketik =IF(press tipe =pers press tipe ,pers tipe ,0)kemudianCTRL+ENTER
  5. Pilih semua data dan CopydanPaste Special as Values
  6. Hapus duplikat.

EDIT:

Penjelasan: Saya mencoba memanfaatkan opsi GoTo Blanks . Setelah Anda memilih kosong, Anda dapat memasukkan rumus yang sama untuk semua sel kosong yang dipilih. Mengenai pertanyaan OP, data sepertinya memiliki kekosongan yang konsisten , yaitu: Value Akolom kosong memiliki sama CustomerIDdengan baris di atas yang tidak kosong. Dengan cara yang sama, Value Bkolom kosong memiliki yang sama CustomerIDseperti di bawah baris tidak kosong.

zx8754
sumber
Halo zx8754. Bisakah Anda menambahkan beberapa penjelasan apa ide di balik solusi Anda?
nixda
@nixda Penjelasan ditambahkan, maaf pikir langkahnya sudah cukup jelas.
zx8754
0

Cara paling efektif untuk melakukan ini adalah membuang semua data ke dalam Tabel Pivot dan memasukkan 'Pelanggan' ke dalam Label Baris dan kemudian menindaklanjuti dengan kolom lainnya. Anda dapat memasukkan 'Tahun' ke dalam tajuk kolom jika Anda ingin melihat rinciannya menurut tahun

Tabel Pivot dapat ditemukan di bawah Sisipkan di Excel 2010

xXPhenom22Xx
sumber
Anda akan mengalami masalah meskipun dengan sel yang tidak memiliki nilai di kolom B karena Excel tidak akan memiliki cara untuk mengetahui bahwa nilai dalam B2 dan B3 saling terkait.
xXPhenom22Xx
Saya diakui memiliki sedikit pengalaman dengan Pivot Tables, tetapi saya tidak berpikir bahwa Pivot Tables memecahkan masalah yang saya miliki. Saya ingin data untuk semua nilai untuk pelanggan dalam satu baris per tahun sehingga saya dapat memanipulasinya (misalnya membuat kolom menambahkan Nilai A + Nilai B), bukan hanya mengubah cara saya melihatnya melalui Tabel Pivot. Saya benar-benar ingin data terstruktur secara berbeda di lembar kerja.
Greg R.
Ya akan sulit kecuali Anda selalu memiliki kolom bergantian dengan data yang hilang seperti yang Anda lakukan dalam contoh. Jika ini bukan masalahnya maka tidak ada cara bagi Excel untuk secara logis melakukan apa yang Anda inginkan juga.
xXPhenom22Xx
Greg - Anda dapat memecahkan masalah sebagai berikut: setelah berada di tabel pivot dalam format yang Anda inginkan, salin dari tabel pivot ke lokasi lain (lembar yang sama atau yang lain) - dan kemudian Anda dapat memanipulasinya sesuka Anda , termasuk menambahkan kolom, rumus, dll.
yosh m
0

Berikut adalah langkah-langkah untuk membuat tabel terpisah dengan data yang diringkas.

  1. Salin seluruh meja Anda dan rekatkan pada lembar baru.
  2. Pilih tabel baru Anda dan Hapus Duplikat (Pita data -> Hapus Duplikat) pada kolom Customerdan Year. Ini akan memberikan kerangka kerja untuk tabel kental.
  3. Di B2 (entri pertama untuk Value A) masukkan berikut ini:

    =IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")

    Masukkan rumus sebagai rumus array dengan menekan Ctrl+ Shift+ Enter.

  4. Isi formula di bawah kolom. Kemudian isi untuk mengisi Value Bkolom juga. Voila!

Beberapa catatan:

  • Anda tentu saja harus menyesuaikan alamat agar sesuai dengan data Anda. Untuk referensi, Sheet1 adalah data asli di kolom A hingga D.
  • Saya mengasumsikan data Anda (atau header) dimulai pada Baris 1. Ini mungkin benar jika ini adalah dump data. Formula harus disesuaikan jika ini bukan masalahnya.
  • Saya berasumsi meja Anda memiliki kurang dari satu juta baris. Jika Anda memiliki lebih dari itu, ubah 1000000s dalam rumus menjadi sesuatu yang lebih besar dari jumlah baris Anda.
  • Jika tabel Anda memiliki ribuan baris (100.000+), Anda mungkin ingin mempertimbangkan untuk menggunakan solusi VBA sebagai gantinya karena rumus array bisa macet dengan array besar.
Excellll
sumber
0

Semua orang menggunakan banyak kode VBA atau fungsi rumit untuk ini. Saya memiliki metode yang membutuhkan waktu satu detik untuk diterapkan tetapi jauh lebih mudah dipahami dan sangat mudah untuk disesuaikan tergantung pada berbagai kemungkinan lainnya.

Dalam contoh yang Anda berikan di atas, rekatkan masing-masing (4) fungsi ini ke dalam sel, E2, F2, G2, dan H2 (sel referensi fungsi F&G di atas):

=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,            ""))

Seret formula ini sejauh yang diperlukan. Ini menghasilkan satu baris data setiap kali 2 baris hadir, meninggalkan baris tunggal tidak terpengaruh. Rekatkan nilai khusus (untuk menghapus formula) kolom EFGH di tempat lain dan urutkan berdasarkan pelanggan untuk menghapus semua baris tambahan.

Kindlin
sumber