لدي بيانات تشبه هذا:
Id | Loc1 | Loc2 | Loc3 | Loc4
---+------+------+------+-----
1 | NY | CA | TX | IL
2 | WA | OR | NH | RI
وأريد تحويله إلى هذا:
Id | LocNum | Loc
---+--------+----
1 | 1 | NY
1 | 2 | CA
1 | 3 | TX
1 | 4 | IL
2 | 1 | WA
2 | 2 | OR
2 | 3 | NH
2 | 4 | RI
ما هي أسهل طريقة للقيام بذلك في Excel 2007؟
يمكنك القيام بذلك باستخدام جدول محوري.
يجب أن ترى ورقة جديدة تحتوي على جميع البيانات الموجودة في الجدول المحوري ، ويتم نقلها بالطريقة التي تبحث عنها.
توفر تقنيات Datapig إرشادات خطوة بخطوة التي هي في الواقع أكثر تعقيدًا مما تحتاج - مثاله ينقل جزءًا فقط من مجموعة البيانات ويستخدم تقنية pivot مع TextToColumns . ولكن لديها الكثير من الصور.
لاحظ أن الجدول المحوري سيجمع البيانات. إذا كنت ترغب في فك تجميعها ، فإن الطريقة الوحيدة للقيام بذلك هي نسخ الجدول المحوري ، و "لصق خاص" كقيم. يمكنك بعد ذلك ملء الفراغات بتقنية مثل هذه: http://www.contextures.com/xlDataEntry02.html
إذا لم تكن بياناتك عبارة عن جدول محوري لـ Excel ولكنها مجرد بيانات ، فقد تحتاج إلى "إلغاء محوره" باستخدام بعض رموز VBA البسيطة. الرمز يعتمد على اثنين من النطاقات المسماة ، المصدر والهدف. المصدر هو البيانات التي تريد إلغاء محوريتها (باستثناء رؤوس الأعمدة/الصفوف ، على سبيل المثال NY-RI في العينة) والهدف هو الخلية الأولى التي تريد وضع النتيجة فيها.
Sub unPivot()
Dim oTarget As Range
Dim oSource As Range
Dim oCell As Range
Set oSource = Names("Source").RefersToRange
Set oTarget = Names("Target").RefersToRange
For Each oCell In oSource
If oCell.Value <> "" Then
oTarget.Activate
' get the column header
oTarget.Value = oCell.Offset(-(oCell.Row - oSource.Row + 1), 0).Text
' get the row header
oTarget.Offset(0, 1).Value = oCell.Offset(0, _
-(oCell.Column - oSource.Column + 1)).Text
' get the value
oTarget.Offset(0, 2).Value = oCell.Text
' move the target pointer to the next row
Set oTarget = oTarget.Offset(1, 0)
End If
Next
Beep
End Sub
لقد قمت بإنشاء وظيفة إضافية تتيح لك القيام بذلك ، مما يجعل من السهل التكيف مع المواقف المختلفة. التحقق من ذلك هنا: http://tduhameau.wordpress.com/2012/09/24/the-unpivot-add-in/
هناك حل لطيف تمامًا في Excel 2010 ، ما عليك سوى أن تلعب قليلاً مع الطاولة المحورية.
قم بإنشاء جدول محوري من بياناتك باستخدام هذه الإعدادات:
أفضل ما توصلت إليه حتى الآن هو هذا:
Id LocNum Loc
---------------------------------
1 1 =INDEX(Data,A6,B6)
1 2 =INDEX(Data,A7,B7)
1 3 =INDEX(Data,A8,B8)
1 4 =INDEX(Data,A9,B9)
2 1 =INDEX(Data,A10,B10)
2 2 =INDEX(Data,A11,B11)
2 3 =INDEX(Data,A12,B12)
2 4 =INDEX(Data,A13,B13)
يعمل هذا ، لكن يجب أن أقوم بإنشاء المعرفات و LocNum يدويًا. إذا كان هناك حل أكثر تلقائيًا (إلى جانب كتابة ماكرو) ، فيرجى إخبارنا في إجابة منفصلة.
إذا كانت أبعاد بياناتك كما هي في العينة المقدمة في سؤالك ، فإن مجموعة الصيغ التالية التي تستخدم OFFSET يجب أن تمنحك النتيجة المطلوبة:
على افتراض
1 | نيويورك | كاليفورنيا | TX | انا
2 | WA | OR | NH | RI
في النطاق A2: E3 ، ثم أدخل
= OFFSET ($ A $ 2، طابق ((ROW (A2) -ROW (2 $ A $))/4،1)، 0)
في F2 ، يقول ، و
= MOD (ROW (A2) -ROW ($ A $ 2)، 4) +1
في G2 ، قل ، و
= OFFSET ($ B $ 2، طابق ((ROW (B2) -ROW (2 $ B $))/4،1)، MOD (ROW (A2) -ROW (2 $ A $)، 4))
في H2 ، يقول.
ثم انسخ هذه الصيغ لأسفل بقدر ما هو مطلوب.
هذا هو الحل الأسهل والنقي والمضمّن الذي أستطيع التفكير فيه.
يبدو أنك حصلت على عمود "loc" (كما يتضح من إجابتك الأولى) ، والآن تحتاج إلى مساعدة في الحصول على العمودين الآخرين.
الخيار الأول هو ببساطة كتابة أول عدة صفوف (على سبيل المثال ، 12) في تلك الأعمدة والسحب لأسفل - أعتقد أن Excel يقوم بالشيء الصحيح في هذه الحالة (ليس لدي Excel على هذا الكمبيوتر لاختباره بالتأكيد).
إذا لم ينجح ذلك ، أو إذا كنت تريد شيئًا أكثر برمجًا ص ، فحاول استخدام دالة row (). شيء مثل "= Floor (row ()/4)" لعمود المعرف و "= mod (row () ، 4) +1" لعمود LocNum.
فيما يلي أداة لطيفة لإلغاء تحديد المحاكاة ، وتطبيع Pivot Table.
Normalisieren von Pivot Tabellen
اتمني ان يكون مفيدا.
هناك أداة تحويل حدودي VBA لتحويل البيانات المحورية أو العكسية إلى جدول قاعدة البيانات ، يرجى الاطلاع
DaveParillo الجواب هو أفضل إجابة لجدول علامة تبويب واحدة. أردت أن أضيف بعض الإضافات هنا.
للأعمدة المتعددة قبل الأعمدة غير المحورية
هذه الطريقة لا تعمل.
يوتيوب بيانات غير محورية بسيطة مثل السؤال
هذا فيديو يوتيوب يوضح كيفية القيام بذلك بطريقة بسيطة. لقد تخطيت الجزء حول إضافة الاختصار واستخدم اختصار @ devuxer الموجود في إجابة DaveParillo.