تعلم واقرأ وارتقِ
[img]المصفوفات الجداول Uoou910[/img]
تعلم واقرأ وارتقِ
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

تعلم واقرأ وارتقِ


 
الرئيسيةالبوابةالتسجيلدخول
غفرانك ربنا واليك المصير
رب زدني علما
سجل بالمنتدى ليظهر لك باقى المواضيع المهمه
سبحانك لا علم لنا إلا ما علمتنا أنك أنت العليم
علم اولادك برياض الأطفال والصفوف الأولى من التعليم الابتدائى
مجدى يونس ببورسعيد
أهلا بك من جديد يا زائر آخر زيارة لك كانت في
آخر عضو مسجل arabicnet فمرحبا به

عزيزى زائر المنتدى مرحبا بك نرجو التسجيل حتى تشاهد باقى الصفحات المختفية بها المواضيع المهمة

 

 المصفوفات الجداول

اذهب الى الأسفل 
كاتب الموضوعرسالة
مجدى يونس
Admin
مجدى يونس

عدد المساهمات : 1428
تاريخ التسجيل : 17/05/2012
الموقع : محافظة بورسعيد

المصفوفات الجداول Empty
مُساهمةموضوع: المصفوفات الجداول   المصفوفات الجداول Icon_minitimeالخميس يوليو 05, 2012 6:25 am


المصفوفات
الجداول

تعريف مبسط : التعامل مع اكثر من قيمة واحدة

تطبيقات عملية
الدرس الاول :

المصفوفات Arrays

rArr = Array("A", "B", "C")

اذا اردنا ان نضع الصفيف هذا
على صف واحد وثلائة اعمدة


Sub kh_1()
Dim rArr
rArr = Array("A", "B", "C")
Range("A1").Resize(1, 3).Value = rArr
End Sub


اذا اردنا ان نضع الصفيف هذا
على ثلاثة صفوف وعمود واحد

تعرفون الدالة
TRANSPOSE

إرجاع نطاق خلايا عمودى كنطاق أفقي، أو بالعكس. يجب إدخال TRANSPOSE كصيغة صفيف في نطاق به نفس عدد الصفوف والأعمدة، على الترتيب، مثل صفيف الأعمدة والصفوف الخاصة به. استخدم TRANSPOSE لتبديل الاتجاه العمودي والأفقي لصفيف في ورقة عمل.
بناء الجملة
TRANSPOSE(array)
Array (الصفيف) هو الصفيف أو نطاق الخلايا في ورقة العمل التي ترغب في تحويلها. يتم إنشاء تحويل الصفيف باستخدام الصف الأول للصفيف على أنه العمود الأول للصفيف الجديد، والصف الثاني للصفيف على أنه العمود الثاني للصفيف الجديد، وهكذا.
============================================================

Sub kh_2()
Dim rArr
rArr = Array("A", "B", "C")
rArr = WorksheetFunction.Transpose(rArr)
Range("A1").Resize(3, 1).Value = rArr
End Sub

يتبع

لمتابعة الموضوع افضل ان تضعوا هذه الاكواد في ملف
الان نقوم باضافة فورم
ونضيف التالي
ListBox1
CommandButton1
CommandButton2

اضف هذه الاكواد للفورم


Private Sub CommandButton1_Click()
Dim rArr
rArr = Array("A", "B", "C")
Me.ListBox1.List = rArr
End Sub

Private Sub CommandButton2_Click()
Dim rArr
rArr = Array("A", "B", "C")
Me.ListBox1.Column = rArr
End Sub

Private Sub UserForm_Initialize()
Me.ListBox1.ColumnCount = 3
End Sub


بعد فتح الفورم

اضغط على الازرار

CommandButton1
CommandButton2

ما هي النتيجة

يتبع
=============================================================
المصفوفة
Array("A", "B", "C")
من النوع Variant
وذو البعد الواحد
واول دليل لعناصرها LBound
صفر
وآخر دليل لعناصرها UBound
عدد عناصرها ناقص واحد
ونضيف عناصرها دفعة واحدة
=============================================================

بعض الدالات للسلاسل النصية تعطي نتائج صفيف
مثل SPLIT
FILTER

ناخذ مثال عن SPLIT


Sub kh_Split()
Dim MyAr
MyAr = Split("عبدالله علي احمد باقشير")
Range("A1").Resize(1, UBound(MyAr) + 1).Value = MyAr
End Sub

===========================================================
===========================================================
===========================================================
الدرس الثاني :

الجداول المفهرسة


عبارة عن متغيرات مفهرسة Indexed Variables تحتوي على بيانات عديدة من نفس النوع Data Type .
كل مصفوفة لها اسم واحد يمكن استخدامه للرجوع إلى أي عنصر فيها وذلك باقتران هذا الاسم بدليل يمثل مكان العنصر فيها ، ويمكن انشاء مصفوفة لإحتواء أي نوع من أنواع البيانات مثل : النصوص والأعداد الحقيقية و الصحيحة وغيرها ، فأنواع البيانات المتوفرة في الفيجيوال بيسك هي :

Data Type in VB: {Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object, String, Variant, User-defined }.


واستخدام المصفوفات في البرمجة يساعد في صناعة أكواد قصيرة وبسيطة ذات قوة كبيرة لأنه يمكن بناء Loops تتعامل بكفاءة مع المصفوفات مهما كان عدد عناصرها وذلك باستخدام دليل العنصر Index Number .

=================================================

الخصائص الأساسية للمصفوفة في الفيجيوال بيسك :

اسم المصفوفة يمثل عنوان Address في الذاكرة ؛ ولا يمكن تغييره أثناء تنفيذ البرنامج .
يمكن الإعلان عن مصفوفة لأي نوع من أنواع البيانات بما في ذلك الأنواع المعرفة من قبل المستخدم User-defined type والـ Object Variables .
كل وحدة بيانات منفردة في المصفوفة تسمى عنصر Element .
جميع العناصر تكون من نفس النوع إلا في حالة الإعلان عن المصفوفة كـ Variant Data Type .
جميع العناصر تكون مخزنة على التتابع في ذاكرة الحاسوب ودليل أول عنصر هو الصفر كـ Default
ويمكن جعله 1
باستخدام جملة في بداية الوحدة النمطية
Option Base 1


لكل مصفوفة حداً أعلى Upper bound ، وحداً أدنى Lower bound ؛ وعناصر المصفوفة تكون محصورة بين هذين الحدين .
من الممكن أن تكون المصفوفة ذات بعد واحد أو متعددة الأبعاد .


تحديد الحدين الأعلى والأدنى للمصفوفة Upper bound & Lower bound:
عند الإعلان عن مصفوفة، يكتب الحد الأعلى بعد الاسم وبين الأقواس.
لا يمكن أن يزيد الحد الأعلى عن نطاق نوع المتغير Long Data Type.
الحد الأدنى الإفتراضي Default هو الصفر.

اذا عرفت عن هذا المتحول بـــــ
Limiteinf To LimiteSup
في مكان الوسيط Indexs
تكون قد عرفت جدولا بعدد عناصر محدد وبارقام دليل محددة

وهذه الطريقة افضل للاستخدام للفهم السريع للوسيط Indexs
Dim ay(1 To 3, 1 To 2) As String

-----------------------------------------------------------------------------
ay(1 To 3, 1 To 2)

لمعرفة الدليل الاول والاخير لليعد الملون بالاحمر للمتحول

LBound(ay, 1)
UBound(ay, 1)


لمعرفة الدليل الاول والاخير للبعد الملون بالازرق للمتحول

LBound(ay, 2)
UBound(ay, 2)

==================================================================
==================================================================
ملحوظة
عند إضافة أبعاد المصفوفة فإن مساحة التخزين المطلوبة سوف تزيد زيادة كبيرة ولذلك ينبغي الاحتراس
وتفادي استخدام النوع Variant قدر الإمكان لما يتطلبه من مساحة تخزينية كبيرة!

==================================================================
==================================================================

المصفوفة ذات الحجم الثابت
نعلن عنها بأحد أوامر الإعلان (Public or Private or Dim or Static)
مع تحديد عدد العناصر في الأقواس

Dim ay(1 To 3, 1 To 2) As String
مثال 1:



Sub kh_Array1()
Dim ay(1 To 3, 1 To 2) As String
ay(1, 1) = "A"
ay(2, 1) = "B"
ay(3, 1) = "C"
ay(1, 2) = "D"
ay(2, 2) = "E"
ay(3, 2) = "F"
Range("A1").Resize(3, 2).Value = ay
End Sub

مثال 2
جدول ضرب


Sub KH_5()
Dim sArr(1 To 12, 1 To 10) As Integer
Dim ContRow As Integer, ContColmn As Integer
Dim c As Integer, r As Integer

ContRow = UBound(sArr, 1)
ContColmn = UBound(sArr, 2)

For r = 1 To ContRow
For c = 1 To ContColmn
sArr(r, c) = r * c
Next
Next
Range("A1").Resize(ContRow, ContColmn).Value = sArr
End Sub


المصفوفات متغيرة الحجم Dynamic Array:


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


ولصناعة Dynamic Array نتبع التالي:

نعلن عنها بأحد أوامر الإعلان (Public or Private or Dim or Static) ونجعلها ديناميكية بعدم كتابة أي رقم في الأقواس كما يوضح المثال التالي:

Dim sArr() As String

نعيد الإعلان عنها مع تحديد عدد العناصر باستخدام جملة ReDim كما في المثال التالي:

ReDim sArr(1 To ContRow, 1 To ContColmn)

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

في حالة الــــ Variant Array --------- الى ----- Empty Value
في حالة الــــ Numeric Array ------- الى ----- Zero
في حالة الــــ String Array ----------- الى ----- Zero-Length String
في حالة الــــ Array of objects ------ الى ----- Nothing

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

==================================================================
==================================================================
مثال 1:



Sub KH_6()
Dim sArr() As String
Dim iName As String
Dim ContRow As Integer, ContColmn As Integer
Dim c As Integer, r As Integer, i As Integer

Range("H7").Resize(14, 5).ClearContents
iName = CStr([H4])
ContColmn = 5
With Range("B7").Resize(14, 1)
ContRow = WorksheetFunction.CountIf(.Cells, iName)
ReDim sArr(1 To ContRow, 1 To ContColmn)
For r = 1 To .Rows.Count
If CStr(.Cells(r, 1)) = iName Then
i = i + 1
For c = 1 To ContColmn
sArr(i, c) = CStr(.Cells(r, c))
Next
End If
Next
End With
Range("H7").Resize(ContRow, ContColmn).Value = sArr
Erase sArr
End Sub


تعريف مبسط : التعامل مع اكثر من قيمة واحدة
Erase

تستخدم لتحرير الذاكرة المعينة للجداول الديناميكية واعادة تعيين عناصر الجدول الى قيمتها البدائية بطول ثابت
مثال:
Erase sArr
==================================================================
==================================================================


تغيير حجم المصفوفة دون فقد بياناتها
يمكننا فعل ذلك باستخدام جملة ReDim مع كلمة Preserve
وتعني الحفظ


الجملة التالية تغير حجم المصفوفة ولكنها لا تمحو العناصر الموجودة بها:

ReDim Preserve MyArray( 10 )

والآن يمكننا كتابة ملخص متكامل لجملة ReDim.

جملة ReDim:

تستخدم في مستوى الـProcedure لإعادة تخصيص allocates مساحة تخزينية storage space لمصفوفة متغيرة الحجم Dynamic array.

صيغتها Syntax:

ReDim [Preserve] varname(subscripts) [As type] [, varname (subscripts) [As type]]

==================================================================
==================================================================

ملاحظات هامة:

جميع ما ذكر في الصيغة داخل قوسين مربعين [] يعتبر اختياري يمكن الاستغناء عنه حين عدم الحاجة إليه.
تستخدم جملة ReDim لتحجيم أو إعادة تحجيم مصفوفة متغيرة الحجم Dynamic Array والتي بالفعل قد أعلن عنها مسبقاً باستخدام أي من الجمل Dim, Private, Public مع أقواس فارغة (أي بدون ذكر الأبعاد).
يمكن تكرار استخدام جملة ReDim لتغيير عدد العناصر والأبعاد لمصفوفة، ومع ذلك لا يمكن الإعلان عن مصفوفة بنوع معين من البيانات ثم إعادة تعريفها لاحقاً مع تغيير نوع البيان لنوع آخر إلا إذا كانت المصفوفة محتواه في variant.
إذا كانت المصفوفة محتواه في variant فإن نوع بيان العناصر يمكن أن يتغير باستخدام المقطع As Type إلا إذا استخدمنا كلمة Preserve ففي هذه الحالة لا يسمح بتغييرات.
إذا استخدمنا كلمة Preserve يمكن فقط تحجيم البعد الأخير للمصفوفة ولا يمكن تغيير عدد الأبعاد على الإطلاق.
إذا كان للمصفوفة بعد واحد فيمكن إعادة تحجيم هذا البعد لأنه البعد الأخير والوحيد بالمصفوفة.
وإذا كان للمصفوفة بعدين أو أكثر فيمكن فقط تغيير حجم البعد الأخير مع الاحتفاظ بمحتويات المصفوفة.
عندما نستخدم Preserve يمكن تغيير حجم المصفوفة بتغيير الحد الأعلى بينما ينتج لدينا خطأ حين تغيير الحد الأدنى.
إذا صنعنا مصفوفة أصغر مما كانت فإن بيانات العناصر المخزنة سوف تفقد.


تحذير:

جملة ReDim ستعمل وكأنها جملة إعلان إذا كان المتغير (المصفوفة) التي تعلن عنه غير موجود على مستوى الـProcedure أو الـModule. وإذا كان هناك متغير آخر بنفس الاسم قد أنشئ بعد ذلك وحتى لو كان في النطاق ككل Scope؛ فإن ReDim سوف ترجع للمتغير الأخير ولن يتسبب عن ذلك خطأ في الترجمة Compilation error حتى ولو كانت جملة Option Explicit فعّالة. وبذلك لن يدرك المبرمج أنه هناك خطأ بالشيفرة code.
ولتفادي هذا التعارض لا ينبغي استخدام جملة ReDim كجملة إعلان بدلاً من Dim مثلاً، ولكن نستخدمها فقط لإعادة تعريف حجم المصفوفة.

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

امثلة : للبعد الاخير ( الملون بالاحمر)

هنا ثلاثة ابعاد
البعد الاخير هو 15
ReDim Preserve X(10,12,15)
ReDim Preserve X(10,12,15)
هنا بعدين
البعد الاخير هو 12
ReDim Preserve X(10,12)
ReDim Preserve X(10,12)
هنا بعد واحد
إذا كان للمصفوفة بعد واحد فيمكن إعادة تحجيم هذا البعد لأنه البعد الأخير والوحيد بالمصفوفة
ReDim Preserve X(10)
ReDim Preserve X(10)

حمل الملف الموجود في هذا الموضوع تطبيق عملي لما ذكر اعلاه





_________________
لا تعطيني سمكة ... و لكن علمني كيف أصطاد السمك
من أحب الله رأى كل شئ جميلا
مع تحياتى مجدى يونس
الرجوع الى أعلى الصفحة اذهب الى الأسفل
https://magdiyonis1.forumegypt.net
 
المصفوفات الجداول
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
تعلم واقرأ وارتقِ :: تعلم الاكسل-
انتقل الى: