تحويل الصف مع أعمدة البيانات في عمود مع صفوف متعددة في Excel 2007
-
21-09-2019 - |
سؤال
لدي صف واحد من البيانات على النحو التالي:
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