اذهب الي المحتوي
أوفيسنا

المصفوفات في الإكسيل (نتعلم سوياً لنرتقي) - الحلقة الثانية


الردود الموصى بها

السلام عليكم ورحمة الله وبركاته

آثرت أن أفرد كل حقة في موضوع وكل حلقة ستكون ثلاثة أجزاء إن شاء الله حتى لا يطول الموضوع ويتوه الأعضاء بين طيات السطور

نستكمل  الحديث عن المصفوفات ...ونتحدث اليوم عن المصفوفة ثنائية الأبعاد ..

عشان نفهم شكل المصفوفة الثنائية ..تخيل ورقة عمل يكون اتجاهها من الشمال لليمين ..طبق عملي عشان تفهم شكل المصفوفة كويس .. افتح ملف إكسيل وخلي ورقة العمل اتجاهها من الشمال لليمين من خلال التبويب Page Layout ثم الأيقونة Sheet Right-to-Left وضع بعض البيانات في الخلايا بالشكل التالي :

A1= 10       B1=20     A2=30    B2=40      A3=50      B3=60

أنا تعمدت إنك  تكتب القيم بالترتيب ده لأن هو ده اللي المصفوفة بتشوفه .. يعني نفس الترتيب ده هيكون داخل المصفوفة ، بمعنى آخر المصفوفة بتبدأ تشوف القيم الموجودة ابتداءً من اليسار أول خلية A1 وبعدين تمشي في الصف ولما الصف يخلص تروح للصف التالي يعني على شكل زجزاج ..ارسم الاتجاهات هتلاقي المصفوفة بتمشي على زجزاج ..

نشوف الكود عشان نتأكد أكتر من صحة الكلام ده

Sub TwoDimensionalArray()
    Dim Arr
    Arr = Range("A1:B3")
    
End Sub

نكتب السطرين دول .. نظهر نافذة Locals عشان نشوف عناصر المصفوفة ونشوف القيم لكل عنصر

ضع مؤشر الماوس في أي مكان داخل الماكرو ادعس F8 3 مرات ، وشوف النافذة .. اضغط على علامة الزائد عشان تشوف شكل المصفوفة الثنائية (ذات البعدين)

هنلاقي 3 أبعاد (دا البعد الأول ..اللي هو بعد الصفوف)

Arr(1)
Arr(2)
Arr(3)

بجانب كل بعد من أبعاد الصفوف علامة زائد ..لو فتحنا علامة الزائد الأولى هنلاقي الشكل ده

Arr(1,1)
Arr(1,2)

ركز في شكل العنصر ...دلوقتي المحرر بيشوف البعد الأول بشكل مستقل (بعد الصفوف يعني بيتعامل مع الصفوف أولاً ...الصف في المقام الأول) ..بعد ما سيادته يشوف الصفوف يبدأ في عملية تشريح الصف عمود عمود ويجلب كل قيمة في العمود ..

فلما فتحنا الجزء الخاص بالصف الأول لقينا

Arr(1,1)

يعني الصف الأول العمود الأول يعني A1 ... وقيمته تساوي 10

وفي نفس الصف انتقل للعمود الثاني

Arr(1,2)

يعني الصف الأول العمود الثاني ..يعني B1 وقيمته تساوي 20 ...

بعد  الانتهاء من جميع الأعمدة في الصف الأول يبدأ ينتقل للصف الثاني .. ومن الصف الثاني يبدأ يتعامل مع كل عمود وهكذا وهكذا وهكذا

أرجو أن تكون وصلت المعلومة بشكل جيد لأن فهمك لطبيعة المصفوفة هيسهل عليك فهم أي معلومة أخرى

**************

ننتقل لجزئية جديدة ألا وهي أول رقم في الفهرس وآخر رقم ..أعتقد ممكن تعرفوها بسهولة أول رقم في الفهرس وآخر رقم من خلال كلمة LBound وكلمة Ubound زي ما اتعملنا قبل كدا

أضف السطرين للكود السابق

Sub TwoDimensionalArray()
    Dim Arr
    Arr = Range("A1:B3")
    MsgBox LBound(Arr)
    MsgBox UBound(Arr)
End Sub

نفذ الماكرو هتلاقي أول رقم 1 وآخر رقم 3 (دا أول صف وآخر صف )) صحيح ... نعم صحيح

معنى الكلام ده إن هو بيجيب أول وآخر رقم للبعد الأول بعد الصفوف ...طيب إحنا  عندنا دلوقتي بعد ثاني اللي هو بعد الأعمدة .. دا ملوش لازمة ولا مهم ؟!

أكيد مهم  ...وعشان نعرفه يبقا لازم هنا في التعامل مع المصفوفات ثنائية الأبعاد نكون محددين أكتر ونحدد البعد اللي إحنا عايزينه

في المثال السابق ممكن نعدل تعديل بسيط عشان  نفهم النقطة دي

Sub TwoDimensionalArray()
    Dim Arr
    Arr = Range("A1:B3")
    MsgBox LBound(Arr, 1)
    MsgBox UBound(Arr, 1)
End Sub

عملنا ايه أضفنا رقم 1 ودا بيمثل البعد الأول ..وبالتالي نحصل على نفس النتائج أول رقم 1 وآخر رقم 3

نفهم من كدا إن محرر الاكواد بيفهم إنك لو تركت الرقم 1 من غير ما تكتبه يبقا نفس الكلام لو كتبته (يبقا الافتراضي إنه بيتعامل مع البعد الأول ..معلش اعذروه إنه بيفضل البعد الأول ..وتقريباً بيفضل البعد الأول بعد الصفوف لأن الصفوف فيها كتير من حروف المصفوفة (الحر عمل عمايله مع دماغي)) :cool:

أظن كدا فهمنا إننا لو عايزين نعرف أول رقم وآخر رقم في البعد الثاني هنستبدل رقم 1 برقم 2

Sub TwoDimensionalArray()
    Dim Arr
    Arr = Range("A1:B3")
    MsgBox LBound(Arr, 2)
    MsgBox UBound(Arr, 2)
End Sub

هتلاقي النتائج 1 و 2 يعني أول رقم في البعد الثاني بعد الأعمدة هو 1 (العمود الأول) ، وآخر رقم في البعد الثاني هو 2 (العمود الثاني)

مما سبق : يمكن معرفة طول المصفوفة وعرضها

جرب الكود التالي

Sub TwoDimensionalArray()
    Dim Arr
    Arr = Range("A1:B3")
    
    MsgBox "طول المصفوفة أي عدد الأسطر أو الصفوف بها " & UBound(Arr, 1)
    MsgBox "عرض  المصفوفة أي عدد الأعمدة بها " & UBound(Arr, 2)
    
End Sub

اعتمدنا هنا على كلمة UBound لأنها بتجيب من الآخر ..فبتجيب في السطر الأول عدد أسطر أو صفوف المصفوفة ، وفي السطر الثاني بتجيب عدد الأعمدة ..

طيب : لونظرنا نظرة تفحص لشكل النطاق (اللي هو شبه شكل المصفوفة ) هنلاقيه على شكل مربع أو مستطيل .. وعشان نعرف عدد عناصر أو عدد خلايا النطاق نعمل ايه يا ترى ..بنضرب الطول × العرض عشان يديني المساحة (فين بتوع الرياضيات !!)

طيب الطول في المثال السابق 3 (عدد الصفوف) ، والعرض يساوي 2 (عدد الأعمدة) يبقا معنى الكلام ده إن عدد عناصر المصفوفة يساوي = 3 × 2 = 6 عناصر

أضف السطر التالي في نهاية الكود السابق

MsgBox "عدد عناصر المصفوفة أي حجمها يساوي " & UBound(Arr, 1) * UBound(Arr, 2)

آخر نقطة هنتكلم فيها .. استبدل هذا السطر في الكود

Arr = Range("A1:B3")

إلى هذا السطر

Arr = Range(Cells(1, 1), Cells(3, 2))

ركز في الجزء ده :

Cells(3, 2)

طبعاً دي طريقة تانية لتحديد النطاق إننا بنستخدم كلمة Cells يليها رقم الصف ورقم العمود ، ولما نستخدمها بالشكل ده مع كلمة Range معناها نقطة البداية للنطاق (اللي هو A1) ، والجزء التاني نقطة النهاية (اللي هو (B3)

ركز مع آخر خلية في النطاق هتلاقي رقم 3 يمثل آخر صف ، ورقم 2 يمثل رقم آخرعمود (أظن كدا وضحت)

يعني طول المصفوفة وعرضها بنقدر نحدده من خلال آخر عنصر أو آخر خلية

 

نكتفي بهذا القدر حتى لا يفقد الموضوع أهميته

وإلى لقاء آخر متجدد بإذن الله

تم تعديل بواسطه ياسر خليل أبو البراء
  • Like 1
رابط هذا التعليق
شارك

السلام عليكم أخي الحبيب أبو البراء:

أدعو الله لك بالتوفيق في بحثك هذا 

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

أعلم مقدرتك على تبسيط وتنسيق وتسلسل مراحل عملك ...أهنئك على ذلك ..لأنه كما أسلف أخي بكار دليل على فكر منظم ...تقبل تحياتي..

بــــــــــــــــــــــــــــــــارك الله

  • Like 1
رابط هذا التعليق
شارك

وعليكم السلام ورحمة الله وبركاته أخي وحبيبي في الله أبو يوسف

جزيت خيراً على دعائك الطيب  ومرورك العطر

وإن كنت أفضل ألا يكون مروراً وفقط وأن يكون  تفاعلاً ومشاركةً ومساهمةً .. أقدر ضغوط عملك وأتمنى تواجدك بيننا إن شاء الله

تقبل وافر تقديري واحترامي

  • Like 1
رابط هذا التعليق
شارك

اخى ياسر

اعتقد انك مجبتش جديد

يعنى المعلومات دى معظمنا بيعرفها

ولكن انا شخصيا كنت اجهل

معرفة الكثير من المحتوى الذى تفضلت بشرحه

ولذلك فانا مصر على متابعة هذا الموضوع

لانك بصراحه تبجر المتابع انه يستفيد

والله مش عارف اشكرك ازاى

بس كل الى ققدر اعمله انى اققولك

زادك الله من فضله وعلمه

وجعلك نافعا بعلمك

تقبل تحياتى

 

تم تعديل بواسطه إبراهيم ابوليله
  • Like 1
رابط هذا التعليق
شارك

السلام عليكم ورحمة الله و بركاته

وفّقك الله أستاذنا العزيز ياسر خليل أبو البراء وسدّد خطاك لكل مافيه خير لك و لنا و للمؤمنين أجمعين

بارك الله فيك و جزاك الله خيرًا وزادك من علمه و فضله ..مواضيعك مميّزة تستحق المتابعة ..فإنّا متابعون

 

رابط هذا التعليق
شارك

إخواني وأحبابي

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

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

لا أريد متابعين  فقط بل مشاركين ومساهمين ولو بقدر قليل

فكل يجود بما عنده

تقبلوا تحياتي

رابط هذا التعليق
شارك

السلام عليكم إخوتي الكرام ما شاء الله بارك خلية نحل بموضوع مهم ..ولكي أحصل على قسط كبير لأدرسه دراسة متأنية ..بعد الدوام الشاق ..سأقوم بعون الله تعالى بنسخه إلى ملفات Word لأحصل على رشفة من فيض عطائكم إخوتي الكرام فكل منكم بذل جهودا مشكورة تسجل لكم على مر اﻷيام...ما أحلى العلم !!.وما أجمل التكامل!!.

خلايا سداسية تنتج عسلا سائغا للشاربين..هلمو للنهل من علم نافع نحن أجدر به من أولئك الذين أخذوا اللب وأعطونا القشور.

نحن موعودون بتسهيل طريق إلى جنة عرضها السموات واﻷرض لسلوكنا طريق العلم الناصع 

وفوق كل ذي علم عليم

والسلام عليكم ورحمة الله وبركاته...

  • Like 1
رابط هذا التعليق
شارك

وعليكم السلام ورحمة الله وبركاته

بارك الله فيك أخي الحبيب أبو يوسف على مرورك العطر وكلماتك الرقيقة والمشجعة

خلية نحل آه وبتدي عسل آه لكن بردو النحل بيلسع ... اللي مش هيعمل الواجب هيتلسع ...

جمعنا الله وإياكم في الفردوس الأعلى من الجنة .. اللهم آمين

  • Like 1
رابط هذا التعليق
شارك

استفسار آخى وأستاذى ياسر :

هل نقدر نقول على المصفوفة الثنائية إنها  هى التى يكون عدد الأعمدة فيها 2

                             و نقول على المصفوفة المتعددة إنها  هى التى يكون عدد الأعمدة فيها 3 أو أكثر  بغض النظر عن عدد الصفوف

رابط هذا التعليق
شارك

أخي الحبيب مختار

عادةً لا يتم استخدام المصفوفات الأكثر من الأبعاد الثنائية ..

بصرف النظر عن عدد الصفوف أو الأعمدة المصفوفة الثنائية مرتبطة ببعدين فقط ..بعد الصفوف مهما كما عددها وبعد الأعمدة مهما كان عددها ..

أما بالنسبة للمصفوفة ثلاثية الأبعاد جرب الكود التالي اضغط F8 وشوف نافذة الـ Locals

Sub Test()
    Dim arr(1 To 3, 1 To 5, 1 To 4)
    
End Sub

هتلاقي البعد الأول مكون من 3 عناصر وتحت كل عنصر يقع البعد الثاني المكون من 5 عناصر وتحت كل عنصر من العناصر الخمسة يوجد عناصر البعد الثالث والمكون من 4 عناصر

لا تهتم بالمصفوفات ذات الأبعاد الأكثر من اثنين

الأكثر استخداماً هي المصفوفات الأحادية والثنائية فقط

رابط هذا التعليق
شارك

أشكرك أستاذى الفاضل 

اضافة : دالة لتحديد عدد أبعاد أى مصفوفة  UDF

 Function ElementCount(B As Variant) As Long
    Dim V As Variant, Z As Long
    For Each V In B
        Z = Z + 1
    Next V
    Do
        ElementCount = ElementCount + 1
        Z = Z / (UBound(B, ElementCount) - LBound(B, ElementCount) + 1)
    Loop Until Z = 1
 End Function
 
 Function fDummy(B As Variant) As Long
    fDummy = ElementCount(B)
 End Function

Sub testArray()

    Dim Arr(1 To 5, 4 To 7, 10, 1 To 9)
    
    Dim B As Variant
    Dim ND As Long
    B = Arr
    ND = fDummy(B)
    MsgBox "the number of dimensions for The array " & ND
     
 End Sub

تحياتى لكم

رابط هذا التعليق
شارك

تسلم أخي الحبيب مختار على هذا الكود الجميل والرائع

ممكن نختصره شوية (معلش رخم أنا ولازم أضع لمساتي اللي ملهاش لازمة في معظم الأحيان)

Sub TestArray()
    Dim Arr(1 To 5, 4 To 7, 10, 1 To 9)
    MsgBox "The Number Of Dimensions For The Array " & ElementCount(Arr)
End Sub

Function ElementCount(B As Variant) As Long
    Dim V As Variant, Z As Long
    For Each V In B
        Z = Z + 1
    Next V
    Do
        ElementCount = ElementCount + 1
        Z = Z / (UBound(B, ElementCount) - LBound(B, ElementCount) + 1)
    Loop Until Z = 1
End Function

 

  • Like 1
رابط هذا التعليق
شارك

أستاذي العزيز القدير / ياسر خليل

جزاك الله خير 

ماشاء الله

عطاء مستمر

ونهر لا ينضب

وخفة دم

وروح وأخلاق عالية  

تقبل إحترامي وتقديري وحبي لكم 

الله يحفظكم ويزيدكم علما ورفعة  

  • Like 1
رابط هذا التعليق
شارك

أخي الغالي الشهابي

الغائب عن العين الحاضر في القلب

إنه ليحزنني عدم تواجدك معنا بشكل دائم فأنت مدرسة كبيرة وأحب أن نستفيد منها

وإن شاء الله تكون معنا في موضوع المصفوفات وتدلي بدلوك فيه

تقبل وافر تقديري واحترامي

رابط هذا التعليق
شارك

السلام عليكم إخوتي الكرام ..أخي الحبيب أبو البراء:

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

رابط هذا التعليق
شارك

وعليكم السلام أخي الغالي ابو يوسف

يشرفني ويسعدني دائماً مرروك العطر بالموضوع وأتمنى متابعتك الدائمة له إن شاء المولى

بالنسبة للتحديث فهو أمر وارد وضروري ولكن لن يكون هناك فورمات للهاردوير (ربنا يخليك ويديك الصحة والعافية) .. فقط بعض التحديثات في السوفت وير والجهاز يشتغل طلقة ولا أحسنها جهاز من الأجهزة الحديثة (الأصلي أصلي)

تقبل تحياتي ومداعبتي لك

  • Like 1
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information