تحويل الصف مع أعمدة البيانات في عمود مع صفوف متعددة في Excel 2007

StackOverflow https://stackoverflow.com/questions/1784407

سؤال

لدي صف واحد من البيانات على النحو التالي:

            header1      header2      header3      header4      header5
row key     datavalue1   datavalue2   datavalue3   datavalue4   datavalue5....

وذلك أساسا لدي denormalized مجموعة البيانات حيث datavalues قد تكون أو لا تكون فارغة في صف واحد على حدة الصف أساس.أنا بحاجة إلى تطبيع لهم.

أي

12345678    NULL         10           3            NULL         14

سوف تصبح:

12345678   header2   10
12345678   header3   3
12345678   header5   14

أنا يمكن أن تفعل هذا باستخدام لصق خاص تحويل, ولكن لدي الآلاف من الصفوف وكنت بحاجة للتأكد من أن كنت الحصول على الحق في الصف الرئيسية لكل منها.وعلاوة على ذلك, كل صف يحتوي على مجموعة من descriptives المرتبطة به التي اريد نسخها على كل datavalue.

ما هي أسهل طريقة لتحويل كل صف من الأعمدة مثل أن لدي عدة صفوف من عمود واحد مع جميع غير فارغة datavalues زائد المرتبطة datavalue مرجع ؟ أنا بحاجة إلى أن تكون قادرة على محور dataset.

هل كانت مفيدة؟

المحلول

إذا كان لديك خمسة "رأس" الأعمدة ، أدخل هذه الصيغ

H1: =OFFSET($A$1,INT((ROW()-1)/5)+1,0)
I1: =OFFSET($A$1,0,IF(MOD(ROW(),5)=0,5,MOD(ROW(),5)))
J1: =INDEX($A$1:$F$9,MATCH(H1,$A$1:$A$9,FALSE),MATCH(I1,$A$1:$F$1,FALSE))

نسخ H1:ي??و "لصق خاص" القيم على القمة.فرز عمود ي و حذف أي شيء من الصفر.إذا كان لديك legitmate الأصفار في البيانات ، ثم تحتاج إلى استبدال الخلايا الفارغة مع بعض سلسلة فريدة من نوعها التي يمكنك ثم حذف في وقت لاحق.

إذا كان لديك أكثر من الأعمدة ، ثم استبدال '5' في جميع الصيغ أعلاه مع أي رقم لديك.

نصائح أخرى

يبدو لي أن جزء من ما كنت تحاول القيام به هو "دي-محور" الجدول المحوري.لقد وجدت هذا تلميح إلى أن يكون عونا كبيرا عندما كان لدي للقيام بمهام مماثلة: http://spreadsheetpage.com/index.php/tip/creating_a_database_table_from_a_summary_table/

علما أنه في Excel 2007 ، يمكنك الحصول على القديم 2003 Excel pivot table المعالج باستخدام المفاتيح Alt+D, P .

Excel يحتوي على تبديل ميزة التي يمكن تلبية الاحتياجات الخاصة بك.انها جميلة مخفي قليلا الخرقاء ولكن على الأرجح أسهل من الخوض في VBA.وهنا مقتطفات من Excel 2007 Help:

Blockquote التبديل (تبديل) الأعمدة والصفوف عرض كل AllHide إذا أدخلت البيانات في أعمدة أو صفوف ، ولكن كنت ترغب في إعادة ترتيب البيانات في الصفوف أو الأعمدة بدلا من ذلك ، يمكنك بسرعة نقل البيانات من واحدة إلى أخرى.

على سبيل المثال المبيعات الإقليمي البيانات التي يتم تنظيمها في الأعمدة يظهر في الصفوف بعد نقل البيانات ، كما هو موضح في الرسومات التالية.

1.في ورقة العمل, قم بما يلي:إلى إعادة ترتيب البيانات من أعمدة إلى صفوف حدد الخلايا في الأعمدة التي تحتوي على البيانات.إلى إعادة ترتيب البيانات من الصفوف والأعمدة ، حدد الخلايا في الصفوف التي تحتوي على البيانات.2.على علامة التبويب الصفحة الرئيسية ، في مجموعة الحافظة ، انقر فوق نسخ .

اختصار لوحة المفاتيح لنسخ البيانات المحددة ، يمكنك أيضا الضغط على CTRL+C.

ملاحظة يمكنك فقط استخدام الأمر نسخ لإعادة ترتيب البيانات.لإكمال هذا الإجراء بنجاح ، وعدم استخدام الأمر قص.

3.في ورقة العمل, حدد الخلية الأولى من الوجهة الصفوف أو الأعمدة التي تريد إعادة ترتيب البيانات التي تم نسخها.ملاحظة نسخ المناطق (نسخ المنطقة:الخلايا التي قمت بنسخ عندما تريد لصق البيانات في موقع آخر.بعد نسخ الخلايا تتحرك الحدود يظهر من حولهم للإشارة إلى أنهم قد تم نسخها.) ولصق المناطق (لصق المنطقة:الوجهة الهدف للبيانات التي تم قصها أو نسخها باستخدام "حافظة Office".) لا يمكن أن تتداخل.تأكد من أن قمت بتحديد خلية في عجينة المنطقة التي تقع خارج المنطقة التي قمت بنسخ البيانات.

4.على علامة التبويب الصفحة الرئيسية ، في مجموعة الحافظة ، انقر فوق السهم الموجود أسفل لصق ثم انقر فوق تبديل.5.بعد أن البيانات يتم نقلها بنجاح ، يمكنك حذف البيانات في نسخة المجال.تلميح إذا كانت الخلايا التي يمكنك تبديل تحتوي على الصيغ الصيغ يتم نقلها الخلية إشارات إلى البيانات في نقل الخلايا يتم تعديلها تلقائيا.للتأكد من أن الصيغ التي تشير بشكل صحيح إلى بيانات في nontransposed خلايا استخدام المراجع المطلقة في الصيغ قبل تبديل لها.

للحصول على مزيد من المعلومات ، راجع التبديل بين النسبية المطلقة ، مختلطة المراجع.

Blockquote

دعونا ننظر في حل ممكن في VBA.أعتقد أن هذا سوف يساعد حقا.هنا هي عدد قليل من الأشياء التي يجب أن تعرف عن قانون بلدي.

  • سوف تحتاج إلى وضع هذه التعليمة البرمجية في الوحدة النمطية للتعليمات البرمجية في VBA (نفس المكان وحدات الماكرو الذهاب)
  • انظروا إلى ما يدعى الأوراق:الأصلي و تطبيع.عليك إما ترغب في تغيير أسماء ورقة أو رمز
  • أنا التحقق من القيم مع سلسلة مجال NULL.إذا كانت الخلية فارغة, أنت تريد أن تحقق If IsEmpty(rngCurrent.Value) Then بدلا من ذلك.

'

Sub NormalizeSheet()
Dim wsOriginal As Worksheet
Dim wsNormalized As Worksheet
Dim strKey As String
Dim clnHeader As Collection
Dim lngColumnCounter As Long
Dim lngRowCounterOriginal As Long
Dim lngRowCounterNormalized As Long
Dim rngCurrent As Range
Dim varColumn As Variant

Set wsOriginal = ThisWorkbook.Worksheets("Original")     'This is the name of your original worksheet'
Set wsNormalized = ThisWorkbook.Worksheets("Normalized") 'This is the name of the new worksheet'
Set clnHeader = New Collection

wsNormalized.Cells.ClearContents        'This deletes the contents of the destination worksheet'

lngColumnCounter = 2
lngRowCounterOriginal = 1
Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)

' We'll loop through just the headers to get a collection of header names'
Do Until IsEmpty(rngCurrent.Value)
    clnHeader.Add rngCurrent.Value, CStr(lngColumnCounter)
    lngColumnCounter = lngColumnCounter + 1
    Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)
Loop

'Here we'll reset our Row Counter and loop through the entire data set'
lngRowCounterOriginal = 2
lngRowCounterNormalized = 1
lngColumnCounter = 1

Do While Not IsEmpty(wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter))

    Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)
    strKey = rngCurrent.Value ' Get the key value from the current cell'
    lngColumnCounter = 2

    'This next loop parses the denormalized values for each row'
    Do While Not IsEmpty(wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter))
        Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)

        'We're going to check to see if the current value'
        'is equal to NULL. If it is, we won't add it to'
        'the Normalized Table.'
        If rngCurrent.Value = "NULL" Then
            'Skip it'
        Else
            'Add this item to the normalized sheet'
            wsNormalized.Range("A" & lngRowCounterNormalized).Value = strKey
            wsNormalized.Range("B" & lngRowCounterNormalized).Value = clnHeader(CStr(lngColumnCounter))
            wsNormalized.Range("C" & lngRowCounterNormalized).Value = rngCurrent.Value
            lngRowCounterNormalized = lngRowCounterNormalized + 1
        End If

        lngColumnCounter = lngColumnCounter + 1
    Loop
    lngRowCounterOriginal = lngRowCounterOriginal + 1
    lngColumnCounter = 1    'We reset the column counter here because we're on a new row'
Loop



End Sub

وأود أن إنشاء ماكرو VBA حلقات عبر كل صف و إخراج البيانات إلى صفحة أخرى.هذا سوف تتيح لك إنشاء الخاصة بك الجدول المحوري في الصفحة الجديدة كانت outputed.

لست متأكدا كيف كنت على دراية مع VBA ، ولكن هذا يمكن بسهولة جدا أن يتم ذلك عن طريق تحميل البيانات إلى مجموعة (أو مجموعة من الكائنات إذا كنت تريد حقا أن تفعل ذلك بشكل صحيح) و الكتابة مرة أخرى.

هنا هو ارتباط إلى VBA الوثيقة.

http://social.msdn.microsoft.com/Forums/en/isvvba/thread/d712dbdd-c876-4fe2-86d2-7d6323b4262c

تحرير

يرجى ملاحظة أن هذا لا يعني أن يكون العمل بشكل كامل الحل ولكن في الحقيقة عامة الإطار لمساعدتك في الاتجاه الصحيح.

عام سبيل المثال أن يفعل الكثير من ما كنت بحاجة إلى القيام به (ليست أفضل طريقة ، ولكن ربما أسهل ل beginer) ، شيء من هذا القبيل ينبغي أن تبدأ, على الرغم من أنه من الصعب القول دون رؤية أكثر من ورقة العمل.

Sub RowsToColumns ()
  Application.ScreenUpdating = False
  Dim srcWrkSheet As Worksheet
  Dim destWrkSheet As Worksheet
  Dim excelData as pExcelData
  Dim srcRowNumber As Long
  Dim srcRolNumber As Long
  Dim destRowNumber As Long
  Dim destColNumber As Long

  SET srcWrkSheet = Sheets("YourSourceWorkSheetName")
  SET destWrkSheet = Sheets("YourDestinationWorkSheetName")

  srcRowNumber = 1
  srcColNumber = 1
  destRowNumber = 1
  destColNumber = 1

  'Loop until blank row is encountered in column 1
  Do
    destWrkSheet.Cells(destRowNumber ,1).Value = "Header 1 " & srcWrkSheet.Cells(srcRowNumber,srcColNumber )
    destWrkSheet.Cells(destRowNumber ,1).Value = "Header 2 " & srcWrkSheet.Cells(srcRowNumber ,srcColNumber)

    srcRowNumber = srcRowNumber + 1
    srcColNumber = srcColNumber + 1
    destRowNumber = destRowNumber  + 1
  Loop Until srcWrkSheet .Cells(rowNumber, 1).value = ""

End Sub
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top