الجزء الثاني في المتغيرات فى اكسيل vba
طرق الإعلان عن المتغيرات المتعددة يمكن ذلك بكتابة كل متغير في سطر مسبوقا بكلمة dim هكذا

او يمكن ذلك بكتابة dim اول السطر ثم الإعلان عن باقي المتغيرات وكتابة فاصلة بين كل متغير واخر هكذا إذا كان لدينا أكثر من متغير من نفس النو ع نستخدم نفس الطريقة كما في المثال التالي:
Dim FirstName As String, LasteName As String

ملحوظه المتغير (j)انا اريد الإعلان عنة انه من النوع variant فبدلا من كتابةالجملة كاملة as variant j كتبت حرف ( j) فقط لأننا ذكرنا سابقا ان المتغير الذى لايعلن عنة يعتبره البرنامج تلقائيا من النوع variant .
مع ملا حظة أن الصيغة التالية لا يمكن استخدامها لتحديد نو ع البيانات لأكثر من متغير من نفس النوع:
Dim FirstName, LastName As String
إذا استخدمت الجملة السابقة فإن المتغير الأخير فقط هو
الذي سيتم تعريفه كـ Stringبينما سيتم تعريف
باقي المتغيرات كـ .Varian
|
تستخدم هذه العلامات الخاصة للإعلان عن المتغيرات المذكورة في هذا الجدول وذلك بدلا من كتابة الجملة كاملة
أي بدلا من كتابة dim l as integer نكتب dim l% بدون مسافات بين الحرف والعلامة المذكورة ليتعرف عليها البرنامج ان المتغير L من النوع integer وهكذا مع باقي الرموز . واليكم رابط الجدول بموقع دعم مايكروسوفت

طريقة أخري للإعلان عن المتغيرات
ويمكن ان يتم الإعلان عن المتغير وذلك بكتابة ما تريد ثم كتابة علامة (=)
لمعرفة ما نتحدث عنه دعونا نوضح ذلك عمليا سنقوم بإدراج وحدة برمجية module ونقوم بفتح شاشة local لمعرفة قيم وأنواع المتغيرات نلاحظ اننا لم نستخدم كلمة dim هنا اى هذه المتغيرات من النوع الغير معلن عنهاواستخدمنا العلامة (=)للإعلان عن القيم و قمنا بكتابة كود برمجي بسيط يقوم بحساب قيمة حاصل ضرب القيمة (x)في القيمة ( y) وإعلان النتيجة في رسالة
ملاحظة هامة جدا ان البرنامج حدد نوع البيانات من النوع variant/integer .

سنقوم بكتابة الكود مرة أخرى ولكن هذه المرة سنعلن عنه باستخدام كلمة dim

لقد قمنا بتحديد نوع البيانات من النوع integer وهى من نوع البيات الرقمية ذات حجم حتى 2 bytes ويتم تخزين قيم بها من -32,768 to 32,767 كما هو موضح بالجدول السابق الخاص بانواع البيانات .وعلية قام البرنامج بحجز مساحة من النوع integer اى ان هذا المساحة المحجورزه لا تقبل قيمة موجبةاكثر من 32767 ولا قيمة سالبة اقل من 32768وفيما يلى لو قمنا بتغيير قيمة (x) الى 32888 مره والى قيمه سالبة مرة أخرى لظهرت في الحالتين رسالة خطا overflow اى ان قيمة (x)اكبر من المساحة المحجوزة لها حسب ما قمنا نحن بتعريفها انها من النوع integer مما نتج عنة هذا الخطا وتوقف الكود . لان القيمة 32888 اكبر من الحد الأقصى للنوع integer الذى هو 32767 وعلية ظهرت رسالة الخطا.


ماذا سيحدث اذا قمنا بتعريف (x)هذه المرة على انها من النوع long وابقينا على قيمة (x)32888 ولا ننسى أن نغير (z) على انها long لأنها المساحة المحجوزة في الذاكرة التي سيتم تخزين قيمة حاصل الضرب بها فلو ابقينا عليها انها من النوع integer لظهرت رسالة خطا أيضا من النوع overflow لان قيمة الناتج في هذه الحالة ستكون اكبر من القيمة المحجوزة بالذاكرة سنجد ان العملية تمت بنجاح وظهرت رسالة بالقيمة وهى 5097640 ولم تظهر رسالة الخطأ وذلك لسبب ان النوع long من البيانات ذات حجم 4 bytes وقيمة موجبة من 2,147,483,647 الى قيمة سالبة -2,147,483,648 وهى اكبر من المساحة المحجوزة للنوع integer

لنواصل هذه التغيرات في القيم حتى نفهم جيدا المتغيرات واهميتها في برمجة الاكسيل لأنها من اهم المواضيع الأساسية في vba excel.
الان سنقوم بتغير القيمة (y) الى 155.348 أي اننا سنستخدم العلامات العشرية هذه المرة.
سنلاحظ ظهور الناتج ولكن بدون علامات عشرية وهذا غير صحيح .
قيمة المتغير (x)و (z)من النوع الكبير long ولكنها من نوع الأرقام الصحيحة التي لا تقبل الكسور
قيمة المتغير (y)من النوع المتوسط integer ولكنها أيضا من نوع الأرقام الصحيحة التي لا تقبل الكسور

لحل هذه المشكلة يجب مراجعة جدول أنواع البيانات بالأعلى ونستخدم النوع الذى يقبل العلامات العشرية سنجد انه النوع double وعلية سنقوم بتغير (y)الى النوع double سنلاحظ ظهور الناتج بقيمة مختلفة عن السابق ومع ذلك لم تظهر ارقام عشرية مع الناتج ماذا يحدث ؟ اه

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

الان سنقوم بتفسير سبب اختلاف الناتج في كل حالة عندما قمنا يتغير قيمة (y)الى 155.348 ولم نغير نوع البيانات الى double قام البرنامج بتجاهل قيمة الكسور لانها اقل من 0.5 وتعامل معها على انه 155 فقط رقم صحيح ماذا كان سيحدث لو ان الرقم 155.548 لقام البرنامج بتقريبها الى الواحد الصحيح وتعامل معها على انها 156 بدلا من 155وفى المرة الثانية التي عدلنا فيها نوع البيانات (y)على انه double ظهرت النتيجة وتجاهل البرنامج الكسور لانها اقل من 0.5 ولم يقربها .
وعلية يجب الانتباه اثناء اعلان نوع البيانات الخاصة بكل متغير وإلا ستختلف النتائج

لنواصل . هذه المرة سنقوم بتغير قيمة المتغير (x) الى نص والنصوص من النوع string والتي يجب ان تكتب داخل علامات تنصيص “” وسنكمل عملية الضرب سنلاحظ توقف الكود وظهور رسالة خطا من النوع type mismatch وذلك بسبب انه لا يمكن ضرب القيمة (x) التي هي نص في القيمة (y)التي هي من نوع الأرقام العشرية


بالمناسبة هنا تنبيه هام لو اعلانا عن كل المتغيرات انها من النوع نصي string وكتبنا ارقام لظهرت النتيجه صحيحه لان النوع النصي string يقرا الأرقام لكن يتعامل معها على انها نص وتظهر بين علامات تنصيص “” في شاشة local .لكن لا يحدث العكس مع المتغيرات من النوع الرقمي .

النوع byte يستخدم للارقام الطبيعية أي ارقام موجبة فقط من 0 الى 255 فقط
لذا يفضل التعامل مع النوع integer لانه اكثر مرونة منه إلا إذا دعت الحاجة لذلك
النوع Boolean يستخدم للتعاملات المنطقية true/false كما سنتعرف لاحقا في التحكم في مسار الكود على سبيل المثال بعض الرسائل التي تحمل yes/no اذا اخترت yes/true يتحول الكود الى مسار واذا اخترت no/false يتحول الكود الى مسار اخر
النوع currency يستخدم للتعامل مع القيم النقدية .
النوع date للتعامل مع التواريخ #1/1/2015#
النوع variant وهى من المتغيرات ذات الحجم الكبير 16 byte لتخزين أي نوع من البيانات وقد سجلنا ملحوظة هامه في بداية الحديث عن إعلان المتغيرات عندما ضربنا مثل باستخدام متغيرات غير معلن عنها وتركنا البرنامج يقوم بتحديد نوعها حددها على انها من النوع variant ذات الحجم الكبير .

أهمية الإعلان عن المتغيرات
اذا لم تقم بالإعلان عن نو ع المتغير فسيعطيه VBAالنو ع الافتراضي للمتغيرات .Variant
البيانات التي تخزن كـ Variant تستطيع أن تستوعب أي نوع من البيانات حيث أن النوع يتغير طبقاً للبيانات المعينة للمتغير ِلما تريد أن تفعله بهذا المتغير. فمثلاً إذا كان لدينا متغيراً من نوع Variant
في حالة عدم الإعلان عن المتغير حدد البرنامج النوع variant وهو ذو حجم كبير تخيل لو انك تكتب كود مثلا به 10 متغيرات تخيل الحجم الهائل الذى سيستخدمه الكود في ذاكرة الحاسب مما ينتج عنه بطئ الكود
كما ان عملية تتبع الأخطاء تكون اكثر تعقيدا في حالة كثرة المتغيرات فيمكن ان تعلن عن متغير مرتين او تخلط بينهم وأيضا تفقد ميزة التصحيح التلقائي .كل هذه هي مزايا الإعلان عن المتغيرات ولإجبارك على الأعلان عن المتغيرات في حالة النسيان والاستفادة من الميزات السابقه يتم ذلك كما يلى
من قائمة tools نختار options فتظهر النافذه التالية .

ننشط الخيار require variable declaration أي مطلوب الإعلان عن المتغيرات ثم نغلق الملف والبرنامج ثم نعيد فتحهم مرة أخرى .

ونلاحظ ظهور كلمة Option Explicit بأعلى شاشة الكود على اليسار والتي تعنى خيار صريح لإجبار المستخدم علي الإعلان عن كل المتغيرات

لنفرض مثلا اننا نسينا الإعلان عن المتغير ()ثم قمنا بكتابته ماذا يحدث ستظهر هذه الرسالة فورا (” المتغير غير معرف “)
شاهد الصورة التالية حيث المتغير x هو المتغير الوحيد الذي لم يعرف فتوقف عنده الكود وظهرت رسالة خطأ

كما انها تجعل من السهل الحصول علي المساعدة التلقائية الا مع النوع varint فإن المساعدة التلقائية لا تستطيع معرفة نوع الكائن حتي وقت التشغيل .
مدى الاتاحة للمتغير(نطاق المتغير )

نطاق المتغير | |
نطاق | كيف يتم الإعلان عن المتغير |
الإجراء فقط | باستخدام a Dim or a Static بيان في الإجراء الذي يستخدم المتغير |
الوحدة فقط | By using a Dim or a Private قبل أول عبارة فرعية أو دالة في الوحدة النمطية |
جميع الإجراءات في جميع الوحدات | By using a Public بيان قبل أول عبارة فرعية أو دالة في وحدة نمطية |
سابقا كنا نعلن عن المتغير داخل الاجراء بين sub /end sub .
لكن في حالة لدينا اكثر من اجراء sub في الموديول بدلا من الإعلان عن المتغير في كل اجراء يمكن الإعلان عنه تحت كلمة Option Explicit فوق كل الإجراءات الموجودة في الموديول فى هذه الحالة سيعمل المتغير داخل اى sub إجراء في الموديول.

في حالة وجود مشروع كبير به اكثر من موديول ويوجد متغير يعمل داخل أي موديول يمكن الإعلان عنه بكلمة public بدلا من كلمة dim تحت Option Explicit أيضا

Static variables
عادة ، عند انتهاء الإجراء ، تتم إعادة تعيين جميع المتغيرات في الإجراء.أما المتغيرات Static هي حالة خاصة لأنها تحتفظ بقيمتها حتى عند انتهاء الإجراء. ولا يتم اعادة تعينها من جديد إلا عند اغلاق المصنف وأعادة فتحة من جديد . يمكنك تعريف متغير من هذا النوع على مستوى الإجراء. قد يكون المتغير Static مفيدا إذا كنت بحاجة إلى تتبع عدد المرات التي تقوم فيها بتنفيذ إجراء. يمكنك الإعلان عن متغير Static وزيادته في كل مرة تقوم فيها بتشغيل الإجراء.
كما هو موضح في المثال التالي، يمكنك الإعلان عن متغيرات Static باستخدام الكلمة
Sub MySub()
Static Counter As Integer
Dim Msg As String
Counter = Counter + 1
Msg = “Number of executions: “ & Counter
MsgBox Msg
End Sub
سيتم تهيئة المتغير إلى 0 في المرة الأولى التي يتم فيها تنفيذ الإجراء. ومع ذلك ، بعد انتهاء تنفيذ الإجراء ، سيحتفظ المتغير بقيمته. هذا يعني أنه في المرة التالية التي يتم فيها تنفيذ الإجراء ، سيبدأ بقيمته السابقة.
يتتبع الكود عدد المرات التي تم فيها تنفيذ الإجراء ويعرض الرقم في مربع رسالة. لا تتم إعادة تعيين قيمة متغير العداد عند انتهاء الإجراء، ولكن تتم إعادة تعيينه عند إغلاق المصنف وإعادة فتحه.
على الرغم من أن قيمة المتغير الذي تم الإعلان عنه على أنه ثابت يتم الاحتفاظ به بعد انتهاء متغير ، إلا أن هذا المتغير غير غير متاح للإجراءات الأخرى. في مثال إجراء MySub السابق، يتوفر متغير العداد وقيمته فقط ضمن إجراء MySub. بمعنى آخر ، إنه متغير على مستوى الإجراء.
يمكن أيضا استخدام المتغيرات الثابتة لتخزين قيمة تحتاج إلى مشاركتها بين الإجراءات المختلفة. على سبيل المثال، تعلن التعليمة البرمجية التالية عن متغير ثابت اسمه settings لتخزين الإعدادات الحالية لتطبيق معين:
Static settings As Object
يمكن بعد ذلك استخدام المتغير settings بواسطة أي إجراء في التطبيق للوصول إلى الإعدادات الحالية أو تعديلها.
يمكن أن تكون المتغيرات الثابتة أداة قوية لكتابة كود Excel VBA أكثر كفاءة وقابلية لإعادة الاستخدام. ومع ذلك ، من المهم استخدامها بعناية ، لأنها يمكن أن تؤدي أيضا إلى أخطاء إذا لم يتم استخدامها بشكل صحيح.
حياة المتغيرات
لا شيء يعيش إلى الأبد ، بما في ذلك المتغيرات. لا يحدد نطاق المتغير المكان الذي يمكن فيه استخدام هذا المتغير فحسب ، بل يؤثر أيضا على أي جزء يتم إزالة المتغير من الذاكرة.
يمكنك إزالة كافة المتغيرات من الذاكرة باستخدام ثلاث طرق:
1. انقر فوق الزر إعادة تعيين شريط الأدوات (زر المربع الأزرق الصغير على شريط الأدوات القياسي في VBE).
2. انقر فوق “إنهاء” عندما يظهر مربع حوار رسالة خطأ وقت التشغيل.
3. قم بتضمين عبارة إنهاء في أي مكان في التعليمات البرمجية الخاصة بك. هذا ليس هو نفسه عبارة End Sub أو End Function.
وإلا، ستتم إزالة المتغيرات على مستوى الإجراء فقط من الذاكرة عند اكتمال تشغيل التعليمات البرمجية للماكرو. تحتفظ المتغيرات الثابتة ومتغيرات مستوى الوحدة النمطية والمتغيرات العامة (العامة) بقيمها بين عمليات تشغيل التعليمات البرمجية الخاصة بك.
إذا كنت تستخدم متغيرات على مستوى الوحدة النمطية أو على المستوى العام ، فتأكد من أن لها القيمة التي تتوقعها. أنت لا تعرف أبدا ما إذا كان أحد المواقف التي ذكرتها للتو قد تسبب في فقدان متغيراتك لمحتواها!
Working with constants
قد تتغير قيمة المتغير (وعادة ما تتغير) أثناء تنفيذ الإجراء الخاص بك. لهذا السبب يسمونه متغيرا. في بعض الأحيان تحتاج إلى الرجوع إلى قيمة أو نص لا تتغير أبدا. في مثل هذه الحالة ، تحتاج إلى ثابت constants – عنصر مسمى لا تتغير قيمته.
كما هو موضح في الأمثلة التالية، يمكنك تعريف الثوابت باستخدام عبارة Const

يعد استخدام الثوابت بدلا من القيم أو النصوص ممارسة ممتازة للبرمجة. على سبيل المثال ، إذا كان الإجراء الخاص بك يحتاج إلى الإشارة إلى قيمة معينة (مثل سعر الفائدة) عدة مرات ، فمن الأفضل إعلان القيمة كثابت والإشارة إلى اسمها بدلا من القيمة. هذا يجعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة وأسهل في التغيير. وإذا تغير سعر الفائدة ، فيجب عليك تغيير بيان واحد فقط بدلا من عدة بيانات.
مثل المتغيرات ، الثوابت لها نطاق. ضع هذه النقاط في الاعتبار:
1. لجعل ثابت متاح ضمن إجراء واحد فقط، أعلن الثابت بعد عبارة الإجراء الفرعية أو الدالة.
2. لجعل ثابت متاح لجميع الإجراءات في وحدة نمطية، أعلن الثابت في قسم الإعلانات للوحدة.
✓ لتوفير ثابت لجميع الوحدات النمطية في المصنف، استخدم الكلمة الأساسية ” Public ” وأعلن الثابت في قسم “الإعلانات” في أي وحدة نمطية.
على عكس المتغير ، لا تختلف قيمة الثابت. إذا حاولت تغيير قيمة ثابت في روتين VBA ، فستحصل على خطأ. وهذا ليس مفاجئا؛ لأن قيمة الثابت يجب أن تظل ثابتة. إذا كنت بحاجة إلى تغيير قيمة ثابت أثناء تشغيل التعليمات البرمجية الخاصة بك ، فإن ما تحتاجه حقا هو متغير.
Working with strings
يعمل Excel مع كل من الأرقام والنصوص ، لذلك لا ينبغي أن يكون مفاجئا أن VBA لديه نفس القوة. غالبا ما يشار إلى النص على أنه سلسلة. strings يمكنك العمل مع نوعين من السلاسل في VBA:
1. Fixed-length strings يتم الإعلان عنها بعدد محدد من الأحرف. الحد الأقصى للطول هو 65,526 حرفا.
Variable-length يمكن أن تحتوي السلاسل النصية نظريا على ما يصل إلى ملياري حرف.
عند الإعلان عن متغير سلسلة نصية باستخدام عبارة dim، يمكنك تحديد الحد الأقصى للطول إذا كنت تعرفه (إنها سلسلة ثابتة الطول) أو السماح ل VBA بالتعامل معها ديناميكيا (إنها سلسلة متغيرة الطول). المثال التالي يعلن
متغير MyString كسلسلة بحد أقصى 50 حرفا. (استخدم علامة النجمة لتحديد عدد الأحرف، حتى 65,526 حرفا.) يتم أيضا الإعلان عن YourString كسلسلة نصية ، لكن طولها غير محدد:
working with dates
نوع بيانات آخر قد تجده مفيدا هو التاريخ. يمكنك استخدام متغير سلسلة نصية لتخزين التواريخ، ولكن بعد ذلك لا يمكنك إجراء حسابات التاريخ. يمنح استخدام نوع بيانات التاريخ إجراءاتك الروتينية مرونة أكبر. على سبيل المثال، قد تحتاج إلى حساب عدد الأيام بين تاريخين. سيكون هذا مستحيلا (أو على الأقل صعبا للغاية) إذا استخدمت متغير من نوع سلاسل نصية للاحتفاظ بتواريخك.
يمكن أن يحتفظ المتغير المعرف كتاريخ بتواريخ تتراوح من 1 يناير 0100 إلى 31 ديسمبر 9999. هذا هو ما يقرب من 10000 سنة وأكثر من
(يفتقر VBA إلى نوع بيانات الخاصة بالوقت).
تحدد هذه الأمثلة المتغيرات والثوابت كنوع بيانات التاريخ:
Dim Today As Date
Dim StartTime As Date
Const FirstDay As Date = #1/1/2013#
Const Noon = #12:00:00#
في VBA ، ضع التواريخ والأوقات بين علامتي تجزئة # التاريخ او الوقت #، كما هو موضح في الأمثلة السابقة.
تعرض متغيرات التاريخ التواريخ وفقا لتنسيق التاريخ القصير لنظامك، وتعرض الأوقات وفقا لتنسيق الوقت الخاص بنظامك (إما تنسيق 12 ساعة أو 24 ساعة). يقوم سجل Windows بتخزين هذه الإعدادات ، ويمكنك تعديلها عبر مربع الحوار الخيارات الإقليمية وخيارات اللغة في لوحة تحكم Windows. لذلك، قد يختلف تنسيق التاريخ أو الوقت المعروض VBA، استنادا إلى إعدادات النظام الذي يتم تشغيل التطبيق علية .
ومع ذلك ، عند كتابة التعليمات البرمجية ل VBA ، يجب عليك استخدام تنسيق التاريخ للولايات المتحدة. تنسيقات التاريخ (مثل mm/dd/yyyy). لذا فإن العبارة التالية تعين يوما في أكتوبر (وليس نوفمبر) لمتغير MyDate (حتى إذا تم تعيين نظامك على استخدام dd / mm / yyyy للتواريخ):
MyDate = #10/11/2013#
عند عرض المتغير (مع الدالة MsgBox ، على سبيل المثال) ، يعرض VBA MyDate باستخدام إعدادات النظام. لذلك إذا كان نظامك يستخدم تنسيق التاريخ dd / mm / yyyy ، عرض MyDate ك 11/10/2013.
Dim versus Private versus Public
يمكننا الإعلان عن المتغيرات باستخدام مايلي
ومع ذلك ، فإن ما يلي هو الاصطلاح الذي نستخدمه لكل كلمة من الكلمات الرئيسية للإعلان:
dim – يستخدم للإعلان عن المتغيرات المحلية ، أي متاح فقط في الإجراء الحالي.
private– يستخدم للإعلان عن متغيرات وإجراءات الوحدة. هذه متوفرة داخل الوحدة الحالية فقط.
public– يستخدم للإعلان عن المتغيرات والإجراءات العالمية. هذه متوفرة في جميع أنحاء المشروع.
Global(obsolete) – نسخة قديمة وعفا عليها الزمن. يمكن استخدامها فقط في الوحدات القياسية. إنه موجود فقط للتوافق مع الإصدارات السابقة.
fantastic points altogether, you simply received a new reader.
What would you recommend in regards to your submit that you made some
days in the past? Any positive?
whoah this blog is magnificent i like studying your
posts. Stay up the great work! You understand, many
individuals are searching around for this info, you can aid them greatly.
Your method of describing all in this paragraph is truly good,
every one be able to effortlessly know it, Thanks a lot.