الدرس الثالث
فى شرح VBA اكسيل
المتغيرات والثوابت
معكم فيها
م/عبدالجيد محمد
مقدمة
•
المتغيرات والثوابت هي أساس أي لغة برمجة . إن استيعاب أنواع المتغيرات من المسائل الضرورية التي تمكنك من اختيار الأنواع المناسبة للمتغيرات سواء لإرسالها إلى الدوال أو لإجراء العمليات الحسابية عليه.
المتغيرات
•
نستطيع أن نعرف المتغيرات بمنظورين، بالمنظور الرياضي يعرف المتغير على انه مجهول س يحتوي على قيمة معينة، اما بالمنظور البرمجي –وهو الأهم – يعرف المتغير على انه قيمة تحفظ في ذاكرة الجهاز . وتختلف المساحة المحجوزة لحفظ هذه القيمة باختلاف نوع المتغير، فمتغير من النوع Byte لا يستهلك سوى بايت واحد من ذاكرة الحاسب، في حين أن متغير من نوع String قد يحجز مساحة تصل إلى 2 جيجابايت.
أنواع المتغيرات المدعومة من قبل :Visual Basic
•
المتغيرات من النوع :Byte
•
يستطيع هذا النوع الاحتفاظ باي قيمة صحيحة ضمن المجال العدد يد ] 0255 – [هو اصغر انواع المتغيرات اذ لا يحتجز سوى 1 بايت
•
. بداية المتغيرات من نوع Byte كانت منذ الإصدار VB4 وكانت معظم استخداماتها في نسخة 16bit من الإصدار VB4
•
مع الإصدارات الأحدث فلن تتمكن من الاستفادة وتطبيق الطرق القديمة على المتغيرات من النوع Byte فلا تضع في ذهنك أي قضايا حرفية Strings عند استخدامك للمتغيرات من النوع Byte ، فيمكن قصر استخدامك لها على
•
الأعداد الصغيرة او البيانات الثنائية مع المتغيرات من نوع .Byte
•
Byte:هووحدة خزن يتكون من 8 bit والبت هو اصغر وحدة خزن في ذاكرة الحاسوب
•
المتغيرات من النوع :Integer
•
اسند أي قيمة عددية صحيحة في المجال [- 32,768 ، 32,767 ] للمتغيرات من النوعInteger فهي تحجز مساحة 2 بايت ، تفيد المتغيرات من هذا النوع عند التعامل مع الأعداد الصحيحة
•
المتغيرات من النوع :Long
•
المتغيرات من نوع Long تستطيع حمل قيم عددية صحيحة في المجال [-2,147,483,648 ، 2,147,483,647 ] فهي تحجز مساحة قدرها 4 بايت للمتغير الواحد، فهي تحمل قيم كبيرة جدا مقللة الخوف من ظهور خطأ وقت التنفيذ Overflow ، فلو كتبت كود يقرأ حجم ملف معين وكنت من المدمنين للنوع Integer ، فستصاب بخيبة امل كبيرة عندما تتعامل مع الملفات التي تزيد أحجامها عن 32,767 :
Dim iFileSize As Integer
•
سيظهر خطأ اذا زاد حجم الملف عن 32,676 بايت ‘
iFileSize = FileLen (“C:MyFile.DAT”)
•
المتغيرات من النوع :Boolean
•
المتغيرات من النوع Boolean هي نفس المتغيرات من النوع Integer ولكن القيم التي تمكنك من إسنادها اليها تكون أما False 0 أو - True 1 ، حجم المتغيرات من النوع Boolean مثل حجم المتغيرات من الأنواع Integer أي 2 بايت، إلا أنها لا تستخدم سوى 1 بت متجاهلة أل 15 بت الأخرى . صحيح إن الحجم 2 بايت يعتبر زيادة غير مستخدمة، إلا أن المتغيرات من النوع Boolean تسهل عليك عملية قراءة وفهم الاكواد.
•
المتغيرات من النوع :Single
•
مجال القيم التي يمكن للمتغيرات من النوع Single احتوائها هو الأعداد الموجبة
•
من 1.401298e-45 إلى 3.402823e38 أو الأعداد السالبة من -3.402823e38 إلى
•
-1.401298e-45 وتستهلك مساحة 4 بايت.
•
السرعة متقاربة جدا بين النوعين Single و Double ، لذلك ينصح باستخدام النوع Double عوضا عن النوع Single حتى تتقي شر الخطأ OverFlow ودقة اعلى للأعداد لكبر مجال القيم الممكنة به. من ناحية أخرى، قد تكون المتغيرات من النوع Single اسرع بكثير من المتغيرات من النوع Double عند التعامل مع الخصائص أو الطرق التي تَحْتَكْ مع الإحداثيات بشكل ملحوظ آ CurrentX ،Circle ،Line ،ScaleWidth ،ScaleHeight.... الخ فهذه الإحداثيات تستخدم النوع Single ، واستخدام النوع Double معها أبطأ لان Visual Basic يضطر إلى تحويل متغيرات النوع السابق إلى .Single
•
المتغيرات من النوع :Double
•
مجال القيم التي يمكن للمتغيرات من النوع Double احتوائها هو الأعداد الموجبة
•
من 4.9406564581247e-324 إلى 1.79769313486232e308 أو الأعداد السالبة
•
من -4.9406564581247e-324 إلى -1.79769313486232e308 وتستهلك مساحة 8 بايت.
•
معظم دوال Visual Basic الخاصة بالأعداد تعود بقيمة من النوع Double لذ لك هو النوع المفضل دائما، إلا أن عيبه الوحيد هو في المساحة الكبيرة التي يحتجزها، وقد يظهر هذا العيب جليا في المصفوفات الكبيرة من النوع .Double
•
المتغيرات من النوع :Currency
•
يمكن للمتغيرات من النوع Currency الاحتفاظ بقيم عشرية للفاصلة الثابتة - FixedPoint شريطة أن تكون محصورة في داخل المجال [- 922,337,203,685,477.5808 ،922,337,203,685,477.5808 ] وحجمها 8 بايت أيضا. يوفر هذا النوع من المتغيرات عناء التقريب باستخدام دوال التقريب Round ،Fix .... الخ والتي تستخدمها بكثرة مع المتغيرات من النوع Double و Single مما يبطئ العمليات الحسابية، مع ذلك الاستخدام المجرد للمتغيرات من النوع Currency أبطأ خمس أو اربع مرات من المتغيرات Double و Single فلا تستخدمها بكثرة في حالة تطبيق آلاف العمليات الحسابية عليها.
•
المتغيرات من النوع :Decimal
•
الأعداد التي يمكنك إسنادها إلى المتغيرات من النوع Decimal كبيرة جدا لن تستطيع تصريح المتغيرات من النوع Decimal مباشرة بالطريقة التقليدية Dim X As Decimal ، وإنما تستخدم النوع Variant -الذي يستهلك 16 بايت- ومن ثم تسند قيمة له:
•
Dim X As Variant
•
X = CDec (Text1.Text) * CDec (Text2.Text)
•
ولا تنسى أن المتغيرات من النوع Variant هي أبطأ أنواع المتغيرات عندما ستقرأ في فقرة "المتغيرات من النوع Varaint " قريبا.
•
المتغيرات من النوع :String
•
لماذا لغة أل BASIC سهلة؟ والجواب بسبب المتغيرات الحرفية من نوع String ! يوجد نوعان من أنواع المتغيرات الحرفية يوفرهما Visual Basic لك هما المتغيرات ثابتة الطول Fixed-length والمتغيرة الطول .Variable-Length
•
المتغيرات ثابتة الطول هي متغيرات حرفية عدد حروفها محدد في أثناء تصريحها ولا يمكن أن يتغير:
•
Dim FixedStr As String * 12
•
”مرحله ثانيه “ = sFixedStr
•
فالعدد الأقصى من الحروف التي يمكن للمتغير FixedStr أن يحمله هو 12 مما يؤدي إلى استهلاك مساحة قدرها 24 بايت –لا تنسى أن UNICODE يستهلك 2بايت للحرف الواحد . من عيوب المتغيرات ثابتة الطول هو عدم توافقها مع تقينهCOM ومعظم دوال مكتبات VB و VBA الداخلية وإجراءات API لا تدعم هذا النوع من المتغيرات، وحتى لو أن عدد حروف القيمة المسندة اقل من عدد الحروف المصرحة، فان المسافات " " ستحل محل الخانات الفارغة، ولا يمكن لهذا النوع من المتغيرات أن تكون مرئية على مستوى الوحدة من النوع Public ، كما لا يمكنه حمل عدد من الحروف اكبر من 64 كيلوبايت، إلا أن الميزة التي تظهر بها عند إسناد القيم الحرفية لهذا المتغيرات فنتائجها تكون دائما اسرع من المتغيرات من النوع المتغيرة الطول، وذلك لان Visual Basic لا يقوم باي عمليات احتجاز في الذاكرة والتحقق من المساحة المتوفرة .... الخ.
•
ملاحظة: COM أو برمجة الكائنات المكونة Component Object Model من التقنيات المبنية على OLE والتي تمكن تطبيقات Windows من الاتصال وتبادل البيانات فيما بينها.
•
بالنسبة للمتغيرات المتغيرة الطول Variable-Length فهي باختصار تغطي على جميع عيوب النوع السابق، إلا أنها تحتجز مساحة تعادل ضعف عدد الحروف + 10 بايتات إضافية تحوي معلومات عن المتغير الحرفي كحجمه وغيرها من التفاصيل التي يخفيها Visual Basic عنك، والعدد الأقصى من الحروف التي يمكن حفظها في هذا النوع يصل إلى 2 جيجا بايت.
•
المتغيرات من النوع :Object
•
معظم المتغيرات التي تمثل الكائنات سواء صرحت بالنوع Object أو بنوع فئات هي متغيرات من النوع :Object
•
Dim X As Object
•
Dim Y As Form
•
Dim Z As Text
•
لا تسند كائن إلى كائن إلا باستخدام العبارة :Set
•
Set X = New MyClass
•
Set Y = Form1
•
Set Z = Text1
•
”إسناد قيمة خاصية وليس كائن“ = Z
•
”إسناد قيمة خاصية وليس كائن“ = Z.Text
•
المتغيرات من النوع :Variant
•
ظهرت المتغيرات من النوع Variant في الإصدار VB3 وتعدلت بنيته التحتية منذ الإصدار VB4 حتى تتوافق مع تقنية COM ، ويستطيع حمل جميع أنواع البيانات السابق ذكرها مثل: Long ،Date ،String .... الخ.
•
الحجم الذي يستهلكه المتغير Variant هو 16 بايت البايت الأول يحدد نوع القيمة الموجودة في المتغير، والبايتات من 2 إلى 7 لا تستخدم إلا في حالة كون القيمة من النوع Decimal ، أما البايتات من 8 إلى 15 فهي تمثل القيمة التي يحملها المتغير.
•
الميزة التي تتميز بها المتغيرات من نوع Variant ليس فقط في إمكانية اشتمالها على أنواع مختلفة من البيانات بل وإجراء العمليات الحسابية أو المنطقية عليها، حيث يقوم Visual Basic باختبار نوع المتغيرات ومن ثم إجراء العملية الحسابية أو المنطقية المناسبة لها:
•
Dim X As Variant
•
Dim Y As Variant
•
Dim Z As Variant
•
قيمة من النوع X = 2000 ‘ Integer
•
قيمة من النوع Y = CLng(2000) ‘ Long
•
قيمة من النوع Z = X + Y ‘ Long
•
قيمة من النوع X = CDbl(2.5) ‘ Double
•
قيمة من النوع Z = X + Y ‘ Double
•
تابع المتغيرات من النوع :Variant
•
اذا فأنت في المتغيرات من النوع Variant وأعجبت بها كثيرا، فتذكر أنها أبطأ أنواع المتغيرات، فلا تحاول الاعتماد عليها إلا عند الضرورة القصوى أو عند الحاجة للاستخدام المتغيرات من النوع Decimalوالمتغيرات من النوع Variant يمكن لها أن تحتوي كائنات Objects ، لكن لا تنسى استخدام الكلمة المحجوزة Set عند إسناد قيمة كائن إلى متغير، واذا أردت الاستعلام عن نوع المتغير، فلا تستخدم VarType فهي تعطي نوع قيمة الخاصية الافتراضية للكائن، أما الدالة IsObject فهي تفي بالغرض المطلوب:
•
Dim X As Variant
•
Set X = Text1
•
Print IsObject(X) ‘ True
Text1.Text ‘ "النص" = X.Text
•
المتغيرات من النوع :Date
•
هذا النوع من المتغيرات يحمل قيم تاريخية تبدأ من التاريخ 1 ين اير 100 إلى 31 ديسمبر 9999 ويشمل نفس المتغير وقت يبدأ من الساعة 00:00:00 ص حتى الساعة 23:59:59 م وتستهلك مساحة 8 بايت "أداة الوقت أداة غير مرئية" حيث أن المقصود بذلك هي أداة لتوقيت أحداث معينة لا ي ا رد للمستخدم معرفة في أي مكان في النموذج. Timer الوقت ويمكن أدرج أداة الوقت
الثوابت
•
ابسط أنواع الثوابت هي الثوابت العددية والتي يمكنك كتابتها مباشرة بالنظام العشري Decimal أو بإضافة البادئة H& للنظام الست عشري Hexadecimal أو البادئة O& للنظام الثماني:
•
جميع الأعداد التالية تساوي 15 ‘
•
Print 15
•
Print &HF
•
Print &O17
•
من الضروري أن انبه هنا بان جميع الأعداد المستخدمة في النظام ا لعشريHexadecimal آ 0، 1، F ،E ،.... 2 والنظام الثماني Octal والتي تكتبها في اكوادك تعتبر في نظر Visual Basic أعداد من النوع Integer مالم تضيف الرمز & بعد نهاية العدد فسيكون من النوع Long بهذا المثال:
•
بعد الثوابت العددية تأتي الثوابت الحرفية Strings ، والتي يشترط كتابتها بين علامتي التنصيص المزدوجة " و "، ولاستخدام علامة التنصيص " في نفس الثابت الحرفي، كررها مرتين:
•
مخرجات الكود التالي هي:
•
‘ثابت حرفي ‘
•
‘ 123”456
•
‘ “
•
Print"ثابت حرفي"
•
Print "123""456"
•
Print """"
•
فكرة الثوابت المسماة شبيهه بفكرة المتغيرات، ويكمن الفرق بينهما في أن قيم الثوابت لا يمكنك تعديلها وقت التنفيذ لأنها قيم ليست موجودة بالذاكرة كقيم المتغيرات، وإنما يتم استبدال هذه الأسماء بقيمتها الفعلية في الكود أثناء عملية الترجمة Compiling ، فالثوابت تحفظ مباشرة في الملف التنفيذيEXE للبرنامج.
•
تستطيع تعريف ثابت جديد باستخدام العبارة :Const
•
Const PI = 3.14
•
Print PI
المصفوفات
•
يمكنك Visual Basic من إنشاء والتعامل مع المصفوفات Arrays سواء كانت أحادية البعد أو متعددة الأبعاد –قد تصل إلى 60 بعدا:
•
100 عنصر’ Dim OneDim (99) As Intger
•
ثنائية الأبعاد’ Dim TwoDim (4, 9) As Integer
•
ثلاثية ‘ Dim ThreeDim (2, 2, 2) As Integer
•
Dim OneDArray(0 To 10) As String
•
Dim TwoDArray(0 To 10, 0 To 10) As Long
•
Dim OneDArray(15 To 22) As String
•
تستطيع البدء في عملية إسناد القيم بمجرد تصريح المصفوفة مع العلم أن فهرس المصفوفة Array Index يبدأ من صفر مالم تستخدم الكلمة المحجوزة OptionBase 1 في منطقة الإعلانات العامة للوحدة البرمجية فانه سيبدأ بواحد:
•
OneDim (0) = 100
•
OneDim (1) = 200
•
TwoDim (0, 0) = (100, OneDim (0) + OneDim (1))
•
ملاحظة: رغم أن بدء ترقيم فهرس المصفوفة يمكن أن يبدأ بواحد، إلا إنني لا أحبذ لمبرمجي Visual Basic فعل ذلك، فعند نقل الاكواد بين المشاريع المختلفة أو الوحدات البرمجية المختلفة قد لا يتم تفعيل الكلمة المحجوزة Option Base 1 مما يترتب عنه ظهور عشرات الأخطاء البرمجية.
•
ولمعرفة رقم العنصر الأول استخدم الدالة LBound بينما الدالة UBound تعود برقم العنصر الأخير:
•
Dim lCounter As Long
•
For lCounter = LBound (OneDim) To UBound (OneDim)
•
Print OneDim (lCounter)
Next
•
counter:يمثل عداد لعناصر المصفوفة
•
لنأخذ المصفوفة الأحادية البعدA( ( 5
•
. A(5)=40……….. A(0)=15
•
فإذا عرّفنا هذه المصفوفة داخل البرنامج، فإنها تحجز ستة عناصر، وهذا يدل على أن المصفوفة عبارة عن متغير مركب ( مكون من عدة عناصر ) ولكل عنصر دليل خاص به ، فإذا أخذنا العنصر الثالث مثلاً فإن له الدليل 2 ، كما أن جميع العناصر يجب أن تكون من نوع واحد وفي حالتنا هذه جميع العناصر من النوع الصحيح.
•
المصفوفات السابقة TwoDim ،OneDim و ThreeDim هي مصفوفات ستاتيكية أي
•
ثابتة الحجم لا تتغير في وقت التنفيذ، لذلك فالمرونة الحقيقة ستكون مع المصفوفات الديناميكية Dynamic Arrays التي تتيح لك التحكم في حجم المصفوفات آلما دعت الحاجة، وتصريحها يكون بدون ذكر حجمها:
•
Dim DynamicArray () As String
•
قبل أن تبدأ في عملية إسناد القيم، عليك استخدام الكلمة المحجوزة ReDim أولا مع ذكر الحجم:
•
ReDim DynamicArray (2)
•
”علي“ = ( DynamicArray (0
•
” احمد“ = ( DynamicArray (1
•
” حسن“ = ( DynamicArray (2
•
لو أردت زيادة أو تقليص حجم المصفوفة، استخدم ReDim مرة أخرى وعليك معرفة أن جميع محتويات المصفوفة سوف تلغى:
•
ReDim DynamicArray (4)
•
”جنان“ = ( DynamicArray (3
•
”نور!“ = ( DynamicArray (4
•
تطبع "نور!" ‘ ( Print DynamicArray (4
•
لا تطبع شيء ‘ ( Print DynamicArray (2
•
واذا رغبت بتغيير حجم المصفوفة دون المخاطرة بفقد البيانات الموجودة فيه فالكلمة المحجوزة Preserve جاهزة للاستخدام
•
ReDim Preserve DynamicArray (4)
•
”جنان“ = ( DynamicArray (3
•
”نور!“ = ( DynamicArray (4
•
تطبع "نور!" ‘ ( Print DynamicArray (4
•
تطبع "حسن" ‘ ( Print DynamicArray (2
•
الحديث عن Preserve يقودني لإخبارك انك لن تستطيع تغيير التالية لا تستطيع تغيير أبعاد المصفوفة في الديناميكية:
•
Dim OneDim () As Integer
•
Dim TwoDim () As Integer
•
ReDim OneDim (4)
•
ReDim TwoDim (2, 2)
•
لن تستطيع تغيير أبعادها باستخدام :Preserve
•
اختيار اسم المتغير
•
يمكن استخدام أي اسم للمتغير بشرط تحقق ما يلي:
•
•يجب أن يبدأ اسم المتغير بحرف ولا يجوز أن يبدأ برقم .
•
• يجب ألا يزيد اسم المتغير عن 40 حرفاً .
•
•ألا يحتوى اسم المتغير على فرا غات (لأكن يمكن إن يحتوي على الرمز _ ) .
•
. •ألا يحتوى اسم المتغير على الرموز( - + ÷ / * )
•
• ألا يحتوى اسم المتغير على كلمة من الكلمات المحجوزة لأوامر لغة الفيجوال بيسك مثل print ,copy cls.
•
طريقة الإعلان عن المتغيرات
•
• تعريف المتغيرات باستخدام الأمر Dim
•
الصيغة العامة :
•
Dim اسم المتغير as نوع المتغير
•
: مثال 1
•
Dim name as string
•
Dim a as integer
•
Dim num as long
•
تعريف المتغيرات العامة باستخدام الأمر Global
•
المتغير العام هو المتغير الذي يمكن استخدامه من أي مكان في البرنامج ، أي أن مداه يشمل جميع ملفات
•
ونوافذ البرنامج . ويبقى في الذاكرة طوال فترة عمل البرنامج ولا يحذف من الذاكرة إلا بعد انتهاء البرنامج.
•
طريقة إدخال المتغيرات التي ترغب في جعلها متغيرات عامة هي نوع المتغير as اسم المتغير Global
•
بعد هذا الإعلان ستتمكن من استخدام المتغيرات في كل أجزاء البرنامج
تم بحمد الله
والى درس جديد إن شاء الله
كان معكم م/عبدالجيد محمد
الملف المرفق