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

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

قام بنشر

السلام عليكم

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

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

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

المصفوفات 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


دروس المصفوفة 1.rar

==================================================================
==================================================================
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)

حمل الملف الموجود في هذا الموضوع تطبيق عملي لما ذكر اعلاه
http://www.officena....showtopic=42346

http://www.officena.net/ib/index.php?showtopic=42584

دروس المصفوفة 1.rar
kh_SumProduct.rar
دروس المصفوفة ( دالة لتوليد ارقام عشوائية).rar

 

((الشرح العلمي منقول من هنا وهناك))
تم بحمد الله وشكره

  • Like 9
  • Thanks 1
قام بنشر

أستاذنا / عبد الله باقشير

ما هذه الدرر الباقشيرية التي تنثرها علينا

بارك الله فيك وزادك علماً ورفعةً

جزاك الله خير على ما تقدمه من هذه الدرر الثمينة

و إلى المزيد إن شاء الله

تليمذكم / الشهابي

  • Like 1
قام بنشر

الأخ الفاضل والأستاذ الكبير / عبد الله باقشير

بارك الله فيك

هذا الموضوع هام جدا ومفيد جدا

كلنا شوقا ولهفة الى تكملة هذه الدروس

قام بنشر

السلام عليكم

الاستاذ القدير عبدالله باقشير ( خبور خير ) حفظك الله

زادك الله علما ورفعه

كلنا شوق مثل هكذا دروس

تلميذك أبو نصار

تقبل تحياتي وفائق شكري

قام بنشر

أستاذى الحبيب / عبد الله باقشير

بارك الله فيك

وزادك من العلم حتى ترضى

وجعل هذا الشرح فى ميزان حسناتك ان شاء الله

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

بعد اذن أستاذى الحبيب / عبد الله باقشير

أسمح لتلميذك المحب لك أن يعرض معلومة صغيرة حتى يسعد بالحوار مع معلمه المبدع / عبد الله باقشير

بالنسبة للمصفوفة ذات الحجم الثابت وثنائية البعد والتى تتكون من ثلاثة صفوف وعمودين يمكن التعبير عنها كلأتى


Dim ay(2, 1) As String

وفى هذه الحالة تكون الصفوف هى 0 و 1 و 2 والأعمدة هى 0 و 1 بدلا من

Dim ay(1 To 3, 1 To 2) As String

وبالتالى يكون المثال كلآتى

Sub kh_Array1()

Dim ay(2, 1) As String

ay(0, 0) = "A"

ay(1, 0) = "B"

ay(2, 0) = "C"

ay(0, 1) = "D"

ay(1, 1) = "E"

ay(2, 1) = "F"

Range("A1").Resize(3, 2).Value = ay

End Sub

  • Like 1
قام بنشر

بعد اذن أستاذى ومعلمى الفاضل / عبد الله باقشير

وبعد شرح أستاذى لموضوع المصفوفات

قمت بعمل كود يعتبر تطبيق لموضوع المصفوفات

وقد شرفنى أستاذى بالموافقة على وضعه فى موضوع المصفوفات

وهو كود يقوم بقلب البيانات الموجودة فى صف معين

وهذا هو الكود


Sub ragab()

Dim Arr() As Integer

Range("B8:iv8").ClearContents

LC = [iv5].End(xlToLeft).Column

ReDim Arr(1 To LC - 1) As Integer

T = 1

For i = LC To 2 Step -1

Arr(T) = Cells(5, i)

T = T + 1

Next

Range("B8").Resize(1, LC - 1) = Arr

Erase Arr

End Sub

Book111.rar

قام بنشر

موضوع دسم

ومميز

ومميز

ومميز

اتمنى ان تمهلنا لنفهم الموجود فزيادة المعلومات يقلل الاستيعاب

اكرمك الله اخي المجرب

ما شاء الله عليك انت تفهمها وهي طائرة

حفظك الله

تقبل تحياتي وشكري

قام بنشر

اخي العزيز " ابو علي " خبور خير ..... استاذنا الكبير

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

حقا..... حضرتك فارس لايشق له غبار ........... في العطاء .. في الخبرة ... في الاخلاق

وفقك الله

ابو الحارث

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.

×
×
  • اضف...

Important Information