एक्सेल में एक पंक्ति में कई पंक्तियों से मूल्यों को कैसे मिलाएं?


10

मेरे पास एक्सेल में एक डेटा डंप है जिसमें दो अलग-अलग मूल्यों के लिए वार्षिक ग्राहक डेटा शामिल हैं। डेटा हर साल और ग्राहक के लिए मूल्य के लिए एक अलग पंक्ति के साथ प्रदान किया गया था। यानी यह इस तरह दिखता है:

यहाँ छवि विवरण दर्ज करें

मैं 2009 में मान 1 के लिए ग्राहक 1 के लिए एक पंक्ति और उसी वर्ष में एक ही ग्राहक के लिए मूल्य बी के लिए एक अलग पंक्ति के साथ फंस गया हूं ।

कुछ उदाहरणों में कोई मान A या मान B नहीं है। ऊपर दिए गए उदाहरण में, आप देख सकते हैं कि ग्राहक 1 का 2011 में कोई मान B नहीं है, इसलिए उसके लिए कोई पंक्ति नहीं बनाई गई थी। और, हालांकि उदाहरण में प्रतिनिधित्व नहीं किया गया है, कुछ ग्राहकों के पास एक वर्ष में या तो मूल्य के लिए कोई डेटा नहीं होगा (और इस तरह उस वर्ष में उस ग्राहक के लिए कोई पंक्ति नहीं)। उस स्थिति में, उस वर्ष उस ग्राहक के लिए एक पंक्ति का अभाव ठीक है।

मैं इसे वर्कशीट में लाना चाहता हूँ जहाँ हर साल और ग्राहक दोनों के लिए एक ही पंक्ति हो । यानी, मैं चाहता हूं कि डेटा इस तरह दिखे:

यहाँ छवि विवरण दर्ज करें

उस परिणाम को बनाने का सबसे प्रभावी तरीका क्या है?

जवाबों:


6

यह VBA या मैक्रो है जिसे आप अपनी शीट पर चला सकते हैं। आपको एप्लिकेशन प्रॉम्प्ट के लिए Visual Basic लाने के लिए alt+ हिट करना होगा F11, अपनी कार्यपुस्तिका पर जाएं और right click - insert - moduleवहां इस कोड को पेस्ट करना होगा। फिर आप VBA से मॉड्यूल को दबाकर चला सकते हैं F5। इस मैक्रो का नाम "परीक्षण" है

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

फिर से पूछा कि एक पंक्ति में कई पंक्तियों से मूल्यों को कैसे संयोजित किया जाए? एक मॉड्यूल है, लेकिन फिर से समझाने वाले चर की जरूरत है , यह बहुत खराब है।

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

एक अन्य विकल्प:

  1. कॉलम बी चुनें, प्रेस CTRL+G-> Special-> Blanks->OK
  2. =प्रेस टाइप करें , फिरCTRL+ENTER
  3. कॉलम C चुनें, CTRL+G-> Special-> Blanks-> दबाएंOK
  4. टाइप =IF(प्रेस प्रकार =प्रेस प्रेस प्रकार ,प्रेस प्रकार ,0)तोCTRL+ENTER
  5. सभी डेटा का चयन करें और CopyऔरPaste Special as Values
  6. डुप्लिकेट निकालें।

संपादित करें:

स्पष्टीकरण: मैं GoTo Blanks विकल्प का उपयोग करने की कोशिश कर रहा हूं । एक बार जब आपने रिक्त स्थान चुन लिया, तो आप सभी चयनित रिक्त कक्षों के लिए एक ही सूत्र दर्ज कर सकते हैं। ओपी के प्रश्न के संबंध में, डेटा ऐसा दिखता है जिसमें लगातार रिक्त स्थान होते हैं, अर्थात: Value Aकॉलम CustomerIDब्लैंक की संख्या नॉनब्लैंक पंक्ति से ऊपर होती है। इसी तरह से Value Bकॉलम ब्लैंक्स CustomerIDकी संख्या नॉनब्लैंक पंक्ति के समान होती है।


हैलो zx8754। क्या आप कृपया कुछ स्पष्टीकरण जोड़ सकते हैं कि आपके समाधान के पीछे क्या विचार है?
निकदा

@nixda स्पष्टीकरण में जोड़ा गया, क्षमा करें कि कदम पर्याप्त स्पष्ट थे।
zx8754

0

ऐसा करने का सबसे प्रभावी तरीका है सभी डेटा को पिवट टेबल में डंप करना और 'कस्टमर' को रॉ लेबल्स में छोड़ना और फिर अन्य कॉलम के साथ चलना। यदि आप वर्ष से ब्रेकडाउन देखना चाहते हैं, तो आप कॉलम हेडर में 'वर्ष' छोड़ सकते हैं

एक्सेल 2010 में इंसर्ट के तहत पिवट टेबल पाई जा सकती हैं


आप उन समस्याओं के साथ चलेंगे, जिनका स्तंभ B में कोई मूल्य नहीं है, क्योंकि Excel में यह जानने का कोई तरीका नहीं होगा कि B2 और B3 में मान किसी से संबंधित हैं।
xXPhenom22Xx

मुझे स्वीकार है कि पिवट टेबल्स के साथ बहुत कम अनुभव है, लेकिन मुझे नहीं लगता कि पिवट टेबल्स मेरे पास मौजूद समस्या को हल करते हैं। मैं प्रति वर्ष एक पंक्ति में एक ग्राहक के लिए सभी मूल्यों के लिए डेटा चाहता हूं, इसलिए मैं इसमें हेरफेर कर सकता हूं (जैसे मान ए + मान बी जोड़ते हुए एक स्तंभ बनाएं), न केवल यह बदलें कि मैं इसे पिवट टेबल के माध्यम से कैसे देख रहा हूं। मैं शाब्दिक रूप से कार्यपत्रक में अलग से संरचित डेटा चाहता हूं।
ग्रेग आर।

जब तक आप हमेशा उदाहरण में करते हैं जैसे कि आपके पास लापता डेटा के साथ बारी-बारी से कॉलम थे, तब तक मुश्किल होगा। यदि यह मामला नहीं है, तो एक्सेल के लिए तार्किक रूप से वही करने का एक तरीका है जो आप चाहते हैं।
xXPhenom22Xx

ग्रेग - आप समस्या को इस प्रकार हल कर सकते हैं: एक बार जब आप चाहते हैं कि प्रारूप तालिका में पिवट तालिका में है, तो इसे पिवट टेबल से दूसरे स्थान पर कॉपी करें (एक ही शीट या एक अन्य) - और फिर आप इसे किसी भी तरह से हेरफेर कर सकते हैं जैसे आप चाहते हैं , कॉलम, सूत्र, आदि जोड़ने सहित
yosh m

0

यहां कंडेंस्ड डेटा के साथ एक अलग टेबल बनाने के चरण दिए गए हैं।

  1. अपनी पूरी तालिका को कॉपी करें और एक नई शीट पर चिपकाएँ।
  2. अपनी नई तालिका चुनें और कॉलम पर डुप्लिकेट (डेटा रिबन -> डुप्लिकेट हटाएं) निकालें Customerऔर Year। यह कंडेंस्ड टेबल के लिए ढांचा प्रदान करेगा।
  3. B2 में (पहली प्रविष्टि के लिए Value A) निम्नलिखित दर्ज करें:

    =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+ दबाकर सूत्र दर्ज करें Enter

  4. कॉलम नीचे सूत्र भरें। फिर Value Bकॉलम को भरने के लिए भी भरें । देखा!

कुछ नोट:

  • आपको निश्चित रूप से अपने डेटा को फिट करने के लिए पतों को समायोजित करने की आवश्यकता होगी। संदर्भ के लिए, शीट 1 डी के माध्यम से कॉलम ए में मूल डेटा है।
  • मैं मान रहा हूं कि आपका डेटा (या हेडर) रो 1 से शुरू होता है। यह संभवतः सही है यदि यह डेटा डंप है। यदि ऐसा नहीं है तो सूत्र को समायोजित करना होगा।
  • मैं मान रहा हूं कि आपकी तालिका में एक लाख से कम पंक्तियां हैं। यदि आपके पास किसी तरह से अधिक है, 1000000तो सूत्र को अपनी पंक्तियों की संख्या से अधिक के लिए कुछ में बदलें ।
  • यदि आपकी तालिका में कई हज़ार पंक्तियाँ (100,000+) हैं, तो आप इसके बजाय VBA समाधान का उपयोग करने पर विचार कर सकते हैं क्योंकि सरणी सूत्र बड़े सरणियों से जुड़ सकते हैं।

0

हर कोई इसके लिए बहुत सारे VBA कोड या जटिल कार्यों का उपयोग कर रहा है। मेरे पास एक ऐसा तरीका है, जिसे लागू करने में एक सेकंड लगता है, लेकिन कहीं अधिक समझ में आता है और विभिन्न अन्य संभावनाओं के आधार पर समायोजित करना बहुत आसान है।

ऊपर दिए गए उदाहरण में, इन (4) फ़ंक्शंस को क्रमशः कोशिकाओं, E2, 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 पंक्तियों के मौजूद होने पर, एकल पंक्तियों को अप्रभावित छोड़कर डेटा की एक पंक्ति बनाता है। कॉलम EFGH के मानों को (सूत्रों को हटाने के लिए) विशेष रूप से पेस्ट करें और सभी अतिरिक्त पंक्तियों को हटाने के लिए ग्राहक द्वारा उन्हें सॉर्ट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.