Birden çok satırdaki değerleri Excel'de tek bir satıra nasıl birleştirebilirim?


10

Excel'de iki farklı değer için yıllık müşteri verilerinden oluşan bir veri dökümü var. Verilere her yıl ve müşteri için ayrı bir değer satırı sağlanmıştır. Yani şöyle görünüyor:

resim açıklamasını buraya girin

2009 yılında Değer A için Müşteri 1 için bir satır ve aynı yıl için aynı müşteri için Değer B için ayrı bir satır ile takılı kaldım .

Bazı durumlarda A Değeri veya B Değeri yoktur. Yukarıdaki örnekte, Müşteri 1'in 2011 yılında B Değeri olmadığını görebilirsiniz, bu nedenle bunun için herhangi bir satır oluşturulmadı. Ve, örnekte gösterilmemesine rağmen, bazı müşterilerin bir yıldaki her iki değer için verisi olmayacaktır (ve dolayısıyla o yıl o müşteri için herhangi bir satır bulunmayacaktır). Bu durumda, o yıl o müşteri için bir satır eksik olması iyidir.

Olduğu yerde ben bir çalışma içine bu almak istiyorum bir satır için hem her yıl ve müşteri için değerler. Yani, verilerin şöyle görünmesini istiyorum:

resim açıklamasını buraya girin

Bu sonucu oluşturmanın en etkili yolu nedir?

Yanıtlar:


6

Bu VBA veya sayfanızda çalıştırabileceğiniz bir makro. Sen vurmak zorundadır alt+ F11istemi Uygulama için Visual Basic getirmek için, çalışma kitabınızda gidip right click - insert - moduleorada bu kodu yapıştırın. Ardından düğmesine basarak modülü VBA içinden çalıştırabilirsiniz F5. Bu makronun adı "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

Bu, sıralanmış bir e-tablo üzerinden çalışır ve hem müşteriyle hem de yılla eşleşen ardışık satırları birleştirir ve şimdi boş satırı siler. Elektronik tablo, sunduğunuz şekilde, müşteriler ve artan yıllar şeklinde sıralanmalıdır; bu belirli makro, ardışık satırların ötesine bakmaz .

Edit - with statementtamamen gereksiz benim tamamen mümkündür , ama kimseye zarar vermiyor ..

REVİZİT 02/28/14

Birisi bu cevabı başka bir soruda kullandı ve geri döndüğümde bu VBA'nın fakir olduğunu düşündüm. Yeniden yaptım -

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

Tekrar soruldu Birden çok satırdaki değerleri tek bir satıra nasıl birleştirebilirim? Bir modül var, ama açıklayan değişkenlere ihtiyaç var ve yine oldukça zayıf.

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

Bununla birlikte, soruna bağlı olarak, step -1hiçbir satır atlanmaması için bir satır numarasında daha iyi olabilir .

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

Başka seçenek:

  1. B Sütununu seçin, CTRL+G-> Special-> Blanks-> tuşlarına basınOK
  2. Tür =basın , ardındanCTRL+ENTER
  3. C Sütununu seçin, CTRL+G-> Special-> Blanks-> tuşlarına basınOK
  4. Tip =IF(basın tip =basın basın tip ,basın tip ,0)sonraCTRL+ENTER
  5. Tüm verileri seçin CopyvePaste Special as Values
  6. Kopyaları kaldırın.

DÜZENLE:

Açıklama: GoTo Blanks seçeneğini kullanmaya çalışıyorum . Boşlukları seçtikten sonra, seçilen tüm boş hücreler için aynı formülü girebilirsiniz. OP'nin sorusuyla ilgili olarak, veriler tutarlı boşluklara sahip gibi görünür , yani: Value Asütun boşlukları CustomerIDboş olmayan satırın üstündekiyle aynıdır . Aynı şekilde, Value Bsütun boşlukları CustomerIDboş olmayan satırın altındaki ile aynıdır .


Merhaba zx8754. Çözümünüzün ardındaki fikrin ne olduğunu biraz açıklayabilir misiniz?
nixda

@ nixda Açıklama eklendi, üzgünüm adımların yeterince açık olduğunu düşündüm.
zx8754

0

Bunu yapmanın en etkili yolu tüm verileri bir Pivot Tablosuna dökmek ve 'Müşteri'yi Satır Etiketleri'ne bırakmak ve ardından diğer sütunları takip etmektir. Yıllara göre dökümü görmek istiyorsanız 'Yılı' sütun başlığına bırakabilirsiniz

Pivot Tablolar, Excel 2010'da Ekle altında bulunabilir


Ancak B sütununda değeri olmayan hücrelerle ilgili sorunlar yaşarsınız, çünkü Excel B2 ve B3'teki değerin bir şekilde ilişkili olduğunu bilmenin bir yolu yoktur.
xXPhenom22Xx

Kuşkusuz Pivot Tables ile çok az deneyimim var, ama Pivot Tables'ın sahip olduğum problemi çözdüğünü sanmıyorum. Ben sadece bir Pivot Tablo üzerinden görüntülemek nasıl değiştirmek değil, (örneğin Değer A + Değer B ekleyerek bir sütun oluşturmak) manipüle böylece yılda bir satırda bir müşteri için tüm değerleri için veri istiyorum. Kelimenin tam anlamıyla çalışma sayfasında farklı yapılandırılmasını istiyorum.
Greg R.Şubat

Örnekte yaptığınız gibi eksik verileri içeren alternatif sütunlar her zaman olmadıkça evet zor olurdu. Eğer durum böyle değilse, Excel'in mantıklı bir şekilde istediğinizi yapmasının bir yolu yoktur.
xXPhenom22Xx

Greg - sorunu şu şekilde çözebilirsiniz: pivot tabloda istediğiniz formatta olduğunda, pivot tablodan başka bir konuma (aynı sayfa veya başka bir yere) kopyalayın - ve sonra istediğiniz şekilde değiştirebilirsiniz. , sütunlar, formüller vb. ekleme dahil
yosh m

0

Aşağıda, yoğunlaştırılmış verilerle ayrı bir tablo oluşturma adımları verilmiştir.

  1. Tüm tablonuzu kopyalayın ve yeni bir sayfaya yapıştırın.
  2. Yeni tablonuzu seçin ve sütunlardaki Yinelenenleri Kaldır (Veri şeridi -> Yinelenenleri Kaldır) Customerve Year. Bu, yoğunlaştırılmış tablo için çerçeve sağlayacaktır.
  3. B2'de (için ilk giriş Value A) aşağıdakileri girin:

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

    Ctrl+ Shift+ Tuşlarına basarak formülü dizi formülü olarak girin Enter.

  4. Formülü sütuna kadar doldurun. Ardından Value Bsütunu doldurmak için doldurun . Hepsi bu kadar!

Birkaç not:

  • Elbette adresleri verilerinize uyacak şekilde ayarlamanız gerekir. Başvuru için, Sayfa1 A ila D sütunlarındaki orijinal verilerdir.
  • Verilerinizin (veya başlıklarınızın) Satır 1'de başladığını varsayıyorum. Bu bir veri dökümü ise bu muhtemelen doğrudur. Aksi takdirde formülün ayarlanması gerekecektir.
  • Masanızda bir milyondan az satır olduğunu varsayıyorum. Bir şekilde bundan daha fazlasına sahipseniz 1000000, formüldeki s'yi satır sayınızdan daha büyük bir değere değiştirin.
  • Tablonuzda binlerce satır (100.000+) varsa, dizi formülleri büyük dizilerle dolup taşabileceğinden bunun yerine bir VBA çözümü kullanmayı düşünebilirsiniz.

0

Herkes bunun için çok sayıda VBA kodu veya karmaşık işlevler kullanıyor. Uygulamak için bir saniye süren bir yöntemim var, ancak diğer çeşitli olasılıklara bağlı olarak ayarlanması çok daha anlaşılır ve çok kolay.

Yukarıda verdiğiniz örnekte, bu (4) işlevleri sırasıyla E2, F2, G2 ve H2 hücrelerine yapıştırın (yukarıdaki F&G işlevleri referans hücrelerine):

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

Bu formülleri gerektiği kadar sürükleyin. Her 2 satır mevcut olduğunda tek bir veri satırı oluşturur ve tek satırları etkilenmez. EFGH sütunlarının değerlerini (formülleri kaldırmak için) özel bir yere yapıştırın ve tüm ekstra satırları kaldırmak için bunları müşteriye göre sıralayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.