كيفية تنسيق الوقت في VBA (مع أمثلة)

دليل أكاديمي شامل يشرح كيفية استخدام دالة Format في VBA لتنسيق الوقت في Excel باحترافية، متضمناً الرموز المخصصة، الصيغ الجاهزة، وأمثلة برمجية عملية.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 23 أكتوبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 23 أكتوبر، 2026
د. مروة عبد العظيم دكتوراه في علم النفس
عضو هيئة التدريس • جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

تحظى إدارة البيانات الزمنية بمكانة محورية في تطوير التطبيقات وأتمتة العمليات المكتبية المتقدمة باستخدام لغة فيجوال بيسك للتطبيقات (Visual Basic for Applications – VBA). منذ أن أطلقت شركة مايكروسوفت هذه اللغة عام 1993 لتكون بديلاً مرناً للغات الماكرو التقليدية، أصبحت العمود الفقري لأتمتة نماذج الأعمال في برنامج مايكروسوفت إكسيل (Microsoft Excel) والعديد من برامج حزمة أوفيس الأخرى. لا تقتصر معالجة الوقت على تسجيل اللحظات الزمنية فحسب، بل تمتد لتشمل مصفوفة متكاملة من التحليلات الإحصائية، وحساب فترات التشغيل، وضبط سلاسل الإمداد، وتدقيق العمليات المالية الحرجة التي تتطلب دقة متناهية واتساقاً شكلياً صارماً.

تكمن التحديات البرمجية الكبرى عند التعامل مع الوقت في الفجوة الدلالية بين البنية التخزينية الرياضية الداخلية للنظام، والشكل البصري الذي يتوقعه المستخدم البشري أو تتطلبه قواعد البيانات المستهدفة. فالأنظمة الحاسوبية لا تنظر إلى الوقت كعقارب تدور أو أرقام مفصولة بنقطتين، بل تختزله في صورة أرقام كسرية تخضع لحسابات الفاصلة العائمة (Floating-point arithmetic). من هنا تنبع أهمية التنسيق؛ إذ يمثل الجسر الرابط بين القيمة الرياضية المجردة والسياق المعرفي المفهوم، مما يحول السجلات الخام إلى معلومات ذات دلالة عملية قابلة للتحليل والمقارنة دون أي غموض أو تشويه معرفي.

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

1. مقدمة إلى التعامل مع الوقت وتنسيقه في VBA

1.1 مفهوم القيم الزمنية في بيئة Excel VBA

تعتمد بيئة مايكروسوفت إكسيل ولغة VBA نموذجاً حسابياً فريداً لتمثيل الوقت والتاريخ يُعرف بنظام الأرقام التسلسلية (Serial Numbers). يستند هذا النظام إلى تخزين كل نقطة زمنية في هيئة عدد حقيقي ذي فاصلة عائمة مزدوجة الدقة (Double-precision floating-point number) يتبع مواصفات معيار IEEE 754. في هذا التمثيل، يمثل الجزء الصحيح من الرقم عدد الأيام المنقضية منذ نقطة الأصل الزمنية (Epoch Base Date) المحددة في النظام، وهي تاريخ 30 ديسمبر 1899 في حسابات VBA الداخلية (بينما تُعرض افتراضياً في واجهة إكسيل كأول يوم من يناير 1900 بسبب توافقية تاريخية مع برمجية Lotus 1-2-3 القديمة).

يمثل الجزء الكسري العشري المحصور بين الصفر والواحد الصحيح الوقت المنقضي من اليوم؛ فالقيمة الرياضية 0.0 ترمز بدقة إلى منتصف الليل تماماً (00:00:00)، بينما تعبر القيمة 0.25 عن الربع الأول من اليوم، أي الساعة السادسة صباحاً (06:00:00). أما منتصف النهار (12:00:00 مساءً) فيقابله الكسر 0.50، في حين تتطابق القيمة 0.75 مع الساعة السادسة مساءً (18:00:00). ويمكن حساب الثانية الواحدة بوصفها أصغر وحدة قياس زمنية قياسية بالمعادلة الكسرية التالية: 1 مقسوماً على 86,400 (وهو إجمالي عدد الثواني في اليوم الواحد)، أي ما يعادل تقريباً 0.000011574074.

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

1.2 أهمية تنسيق الوقت في أتمتة العمليات وتحليل البيانات

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

إلى جانب الجانب الجمالي والتنظيمي، يكتسب التنسيق الصارم أهمية وظيفية عند تصدير البيانات إلى أنظمة خارجية، مثل أنظمة تخطيط موارد المؤسسات (ERP) أو محركات قواعد البيانات العلائقية كـ SQL Server وOracle. تتطلب هذه الأنظمة عادةً تدفق البيانات بتنسيقات قياسية دولية محددة مثل معيار ISO 8601 (على سبيل المثال: hh:nn:ss). وإن أي إخفاق في صياغة الوقت وفق هذه المعايير أثناء توليد ملفات التصدير النصية (كـ CSV أو XML) يؤدي حتماً إلى فشل عمليات الاستيراد أو تحريف البيانات المدخلة.

علاوة على ذلك، يبرز دور التنسيق الدقيق في تجنب الخلط المربك بين الفترات الصباحية والمسائية في القطاعات الحساسة كالمستشفيات، وخطوط الطيران، والتداولات المالية. فالاعتماد على عرض الوقت بصيغة اثنتي عشرة ساعة دون بيان حاسم لمؤشر (AM/PM)، أو التراخي في اعتماد التوقيت العسكري (نظام 24 ساعة)، قد يفضي إلى قرارات تشغيلية خاطئة ذات كلفة مالية وبشرية باهظة، وهو ما يمكن تلافيه جذرياً بتطبيق بروتوكولات تنسيق صارمة عبر الشيفرات البرمجية في VBA.

1.3 نظرة عامة على دالة Format ودورها في إدارة البيانات الزمنية

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

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

كذلك تمنح الدالة مطوري البرمجيات خيارين رئيسين لبناء النسق الزمني: إما استخدام الصيغ الجاهزة مسبقة التعريف (Named Formats) التي توفرها بيئة التشغيل تلقائياً، أو صياغة قوالب مخصصة بالكامل (User-Defined Formats) باستخدام مجموعة من الرموز الحرفية المحددة. هذه الازدواجية تمنح بيئة VBA قدرة فائقة على المواءمة بين بساطة التنفيذ البرمجي وسرعته من جهة، والتحكم المطلق في أدق تفاصيل المخرجات من جهة أخرى.

2. البنية الأساسية لدالة Format الزمنية في VBA

2.1 الصياغة النحوية (Syntax) لدالة Format ومعاملاتها الأساسية

تتبع دالة Format في لغة VBA تركيباً نحوياً صارماً يحدد كيفية تدفق المعطيات إليها ومعالجتها داخلياً. تُعرف الصياغة القياسية للدالة في مراجع مايكروسوفت الرسمية على النحو التالي:

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

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

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

يختص المعاملان الأخيران، FirstDayOfWeek وFirstWeekOfYear، بضبط التقويم الأسبوعي والسنوي؛ حيث يحددان اليوم الذي يُعتبر بداية للأسبوع (مثل يوم الأحد أو الاثنين) والأسبوع الذي يُعد أول أسبوع في السنة التقويمية. ورغم أهميتهما القصوى في العمليات التي تعتمد على التواريخ وأرقام الأسابيع المالية، إلا أن تأثيرهما يظل هامشياً ومعدوماً عند الاقتصار على تنسيق المكونات الزمنية البحتة كالساعات، والدقائق، والثواني.

2.2 نوع البيانات الناتج عن دالة Format

من الحقائق البرمجية الأساسية التي يجب ترسيخها لدى كل مطور يتعامل مع لغة VBA، أن المخرجات الصادرة عن دالة Format تنتمي حصرياً ودائماً إلى نوع البيانات النصي (String Data Type). بصرف النظر عن كون المدخل الأصلي رقماً تسلسلياً عائماً أو متغيراً زمنياً نقياً، فإن النتيجة النهائية تُعامل برمجياً بوصفها سلسلة من الحروف والمحارف الأبجدية التي لا يمكن تطبيق العمليات الحسابية المباشرة عليها دون تحويل لاحق.

يترتب على هذا التمايز النوعي تداعيات جوهرية في منطق البرمجة؛ فإذا حاول المطور جمع ناتجين صدرا عن دالة Format باستخدام المعامل الحسابي الجمع (+)، فإن محرك VBA سيميل إلى إجراء عملية دمج نصي (Concatenation) بدلاً من الجمع الحسابي، ما لم يتم التحويل القسري للأنواع. كذلك، عند فرز مخرجات الدالة، سيتم الفرز وفق الترتيب الأبجدي للمحارف (Alphabetical Sort) وليس الترتيب العددي، مما قد يؤدي إلى ظهور أوقات مثل “10:00:00” قبل “2:00:00” إذا لم يُستخدم الصفر البادئ في التنسيق.

لضمان التعامل الآمن مع هذه المخرجات، ينبغي توظيف دالة Format في المراحل النهائية من دورة معالجة البيانات، أي عند إعداد النصوص المعدة للعرض على واجهات المستخدم (UserForms)، أو صياغة نصوص مربعات الحوار (MsgBox)، أو أثناء بناء جمل الاستعلام وكتابة الملفات النصية المسطحة. أما في حال إعادة إدراج القيمة المنسقة إلى خلايا ورقة العمل مع الرغبة في استخدامها لاحقاً في معادلات إكسيل الحسابية، فيجب الانتباه إلى أن إسناد النص المنسق مباشرة قد يحول الخلية إلى نوع نصي يعطل تفاعلها مع الدوال الرياضية التراكمية كدالة SUM وAVERAGE.

2.3 آلية معالجة الأرقام التسلسلية والتواريخ الزمنية

تمتلك دالة Format قدرة ذاتية متقدمة على قراءة البنية الداخلية للأرقام والتواريخ وتفكيكها إلى عناصرها الأولية. عند تمرير رقم تسلسلي عائم، تعزل الدالة الجزء العشري وتضربه في 24 لحساب الساعات الإجمالية، ثم تستخلص الكسر المتبقي وتضربه في 60 للوصول إلى الدقائق، وتكرر العملية ذاتها مع الكسر الأخير للوصول إلى أجزاء الثواني بدقة متناهية متوافقة مع حسابات التوقيت القياسي.

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

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

3. الرموز المخصصة لتنسيق الساعات في VBA

3.1 استخدام الرمز “h” لتمثيل الساعات الفردية

يمثل الحرف الأبجدي “h” في لغة تنسيق VBA الرمز البرمجي المخصص للتعبير عن الساعات بصيغتها المجردة الفردية دون إلزام النظام بإضافة أصفار تزيينية في خانة العشرات للأرقام التي تقل عن العشرة. عند تطبيق هذا القالب، تظهر القيم الزمنية الممتدة من منتصف الليل وحتى الساعة الحادية عشرة صباحاً كأرقام مفردة تبدأ من 0 وحتى 9، ثم تنتقل تلقائياً إلى خانتين للأرقام من 10 إلى 23 عند تطبيق نظام التوقيت الممتد على مدار اليوم كاملاً.

يبرز الاستخدام الأمثل لهذا النمط في واجهات المستخدم المدمجة ولوحات القيادة الرقمية (Dashboards) التي تتطلب ترشيداً صارماً للمساحات البصرية وتخفيف الازدحام الرقمي غير الضروري. فالكثير من المستخدمين يفضلون قراءة التوقيت مثل “8:30” بدلاً من “08:30″، لما يمنحه ذلك من مظهر طبيعي يحاكي لغة التخاطب اليومية ويعزز انسيابية القراءة في النصوص الممتدة والسردية.

مع ذلك، يجب أن يدرك المطور أن استخدام “h” منفرداً دون دمج واعٍ قد يؤدي إلى تفاوت في أطوال السلاسل النصية الناتجة عبر صفوف الجداول المتتالية. هذا التباين في عدد المحارف قد يخل بالمحاذاة الرأسية للأعمدة الزمنية، ويجعل الفرز البصري السريع أكثر إرهاقاً للعين المجردة مقارنة بالأنماط التي تفرض ثباتاً شكلياً لعدد الخانات الرقمية في كل سطر من سطور التقرير المالي أو الإحصائي.

3.2 استخدام الرمز “hh” لتمثيل الساعات الثنائية

يعد الرمز المزدوج “hh” المعيار الاحترافي الأكثر استخداماً واعتماداً في بيئات تطوير المؤسسات وقواعد البيانات المتقدمة. يكمن الاختلاف الهيكلي بينه وبين الرمز الأحادي في أن “hh” يفرض حضوراً ثنائياً إجبارياً للخانة الرقمية عبر إقحام صفر بادئ (Leading Zero) بصورة تلقائية لكافة الأرقام الزمنية التي تنحصر بين الصفر والتسعة؛ وبذلك يتم التعبير عن ساعات الصباح الأولى بالصيغ المترية: “00”، و”01″، و”02″، وصولاً إلى “09”، ثم يستمر النمط الثنائي طبيعياً حتى القيمة “23”.

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

علاوة على المزايا الجمالية، يعد نمط “hh” متطلباً غير قابل للتفاوض في الأنظمة البرمجية الملتزمة بالمعايير القياسية لمنظمة المعايير الدولية (ISO) المتعلقة بتبادل البيانات وتخزينها، لا سيما معيار ISO 8601. تتطلب هذه المعايير صرامة مطلقة في عدد الحقول النصية لتمكين خوارزميات المعالجة الآلية والمحللات اللغوية (Parsers) من قراءة الحقول بالاعتماد على الفهارس الثابتة للمحارف دون الحاجة إلى معالجة استثناءات الأطوال المتغيرة.

3.3 نظام التوقيت العسكري (24 ساعة) مقابل نظام 12 ساعة

يعتمد محرك VBA آلية تحويل ذكية وسياقية لتحديد ما إذا كان المطلوب هو عرض الوقت وفق نظام التوقيت العسكري (نظام الأربع والعشرين ساعة) أو وفق نظام الاثنتي عشرة ساعة الكلاسيكي. تكمن القاعدة التشغيلية في وجود أو غياب محددات الصباح والمساء الصريحة داخل سلسلة التنسيق؛ فإذا خلت السلسلة النصية للقالب من أي إشارة لمعاملات (AM/PM)، فإن الدالة تفترض تلقائياً رغبة المطور في استخدام نظام 24 ساعة، محولةً القيمة “2:00 PM” على سبيل المثال إلى “14:00”.

بالمقابل، بمجرد إدراج أي شكل من أشكال رموز الفترات الزمنية (مثل “AM/PM” أو “a/p”) داخل سلسلة التنسيق، يعيد المحرك مواءمة مخرجات الرمزين “h” و”hh” لينحصرا في النطاق الرقمي من 1 إلى 12. في هذه الحالة، تتحول القيمة الرقمية للساعة 00:00 إلى 12:00 AM، وتتحول الساعة 13:00 إلى 01:00 PM، مما يضمن توافق النظام البصري بالكامل مع الإدراك الزمني المعتاد للمستخدم النهائي دون أي خلل رياضي في المفهوم المرجعي.

تفرض البيئات المؤسسية الحساسة كالمستشفيات، والمؤسسات العسكرية، وشركات الطيران والنقل الجماعي، وشبكات البنوك المركزية اعتماداً حصرياً على نظام 24 ساعة عبر استخدام القالب “hh:nn:ss” دون أي معاملات صباحية أو مسائية. يهدف هذا الإلزام الصارم إلى القضاء نهائياً على أي احتمالية للبس البشري أو التقني في تفسير المهام المجدولة، وضمان عدم تداخل دوريات العمل، وتأمين عمليات التدقيق والمساءلة القانونية المرتبطة بالطوابع الزمنية للسجلات المعقدة.

4. التحكم في الدقائق وتفادي الخلط البرمجي مع الأشهر

4.1 استخدام الرمز “n” لتمثيل الدقائق دون أصفار بادئة

خُصص الحرف الأبجدي “n” في أبجدية تنسيق لغة VBA لتمثيل الدقائق الزمنية بصيغتها الرقمية الصرفة الخالية من الأصفار البادئة. عند استخدام هذا الرمز داخل قالب التنسيق، تُعرض الدقائق المحصورة بين الدقيقة صفر والدقيقة التاسعة كأرقام مفردة (0، 1، 2، …، 9)، بينما تظهر الدقائق من العاشرة وحتى التاسعة والخمسين في صورتها الثنائية الطبيعية المعتادة، مما يمنح السلسلة الناتجة طابعاً مقتضباً ومركزاً.

يجد هذا النمط التنسيقي تطبيقاته العملية المتخصصة في حساب وعرض الفترات الزمنية القصيرة وحساب أزمنة الاستجابة ومدد المكالمات في مراكز الاتصال؛ حيث يكون الهدف الأساسي هو التركيز على الأرقام الحقيقية المعبّرة عن المدة المنقضية دون التقيد بالأطر الهندسية الصارمة لساعات الحائط. كما يفيد استخدامه في بناء الجمل الحوارية الإشعارية الموجهة للمستخدم، مثل إظهار رسالة توضح: “استغرقت العملية 4 دقائق و12 ثانية” بصياغة لغوية عفوية ومريحة للقارئ.

مع ذلك، يتطلب استخدام الرمز “n” حذراً برمجياً من المطور؛ إذ إن استخدامه ضمن تنسيق الوقت الشامل (ساعات ودقائق وثوانٍ) قد ينتج عنه تشوهات شكلية غير مريحة للمستخدم المعتاد على النمط القياسي للساعات الرقمية. فظهور توقيت مثل “10:5:30” بدلاً من “10:05:30” قد يوحي بوجود خطأ مطبعي في النظام، وقد يؤدي إلى تفسير خاطئ للدقائق المفردة باعتبارها خانات عشرية متقدمة في بعض البيئات الفنية غير المتخصصة.

4.2 استخدام الرمز “nn” لتمثيل الدقائق بخانتين متطابقتين

يمثل الرمز “nn” الركيزة الأساسية والقاعدة الذهبية لتنسيق الدقائق في بيئة VBA البرمجية بلا منازع. يفرض هذا الرمز ظهور الخانة العشرية الأولى بصفر دائم للمدد الزمنية التي تقل عن عشر دقائق، محققاً بذلك تمثيلاً موحداً يمتد من القيمة “00” وحتى القيمة “59”. هذا التوحيد هو النواة الجوهرية التي تبنى عليها كافة الساعات الرقمية والأنظمة الإلكترونية الحديثة لعرض الوقت دون استثناء.

يوفر الرمز “nn” مستوى عالياً من التناسق الهيكلي والمحاذاة التيبوغرافية التي لا غنى عنها في جداول الحسابات وسجلات الأنشطة التزامنية (Logs). فعندما تتتابع الصفوف الحاملة لأوقات العمليات في عمود محدد، يضمن استخدام “nn” بقاء الفاصل الزمني (عادة النقطتان الرأسيتان) في الموقع العمودي ذاته بدقة، مما يسهل عمليات المسح البصري ويوفر على المستخدم الجهد الذهني اللازم لإعادة تفسير مواقع الخانات الرقمية المتقلبة في كل سطر.

بالإضافة إلى ذلك، فإن الرمز “nn” هو الرمز المعتمد في بناء السلاسل الزمنية المتوافقة مع محركات الفهرسة والبحث النصي وقواعد البيانات الخارجية. يضمن هذا التنسيق المتسق عدم حدوث أي انحرافات أثناء عمليات مطابقة النصوص البرمجية، ويمنع نشوء التكرارات الزائفة الناتجة عن تباين التمثيلات النصية للقيمة الزمنية الواحدة، مثل الخلاف البرمجي الدقيق بين مقارنة السلسلة “08:05” بالسلسلة “08:5”.

4.3 الفصل الدلالي الحاسم بين الرمز “m” والرمز “n” في VBA

يعد التمييز بين الحرف “m” والحرف “n” أحد أهم المفترقات البرمجية التي تبرز عمق المعرفة المعمارية للغة VBA. في العديد من لغات البرمجة الشائعة كـ C#، وجافا، ومحركات تنسيق الخلايا المباشرة في واجهة إكسيل التفاعلية، يُستخدم الحرف “m” لتمثيل الشهر إذا ورد منفرداً، بينما يُفسر كدقيقة إذا ورد ملاصقاً لرموز الساعات أو الثواني. لكن VBA يتبع نهجاً دلالياً مختلفاً ومستقلاً لتفادي أي التباس محتمل للمترجم أثناء معالجة النصوص البرمجية.

في لغة VBA، يُخصص الحرف “m” (وسواء كان مفرداً “m” أو مكرراً “mm” أو ثلاثياً “mmm”) لتمثيل الأشهر الميلادية وأسمائها حصراً. ومن أجل استئصال أي غموض تركيبي قد ينشأ عند كتابة قوالب التنسيق المعقدة، خصصت مايكروسوفت الحرف “n” ليكون الممثل الصريح والمحدد للدقائق الزمنية في دالة Format. وبناءً عليه، فإن الصياغة الأكثر موثوقية وأماناً لكتابة الوقت في VBA هي استخدام الحرف “n” للدقائق دائماً وأبداً دون تردد.

ورغم أن محرك دالة Format يحتوي على منطق داخلي استدلالي (Context-sensitive heuristic) يحاول التغاضي عن أخطاء المطورين؛ حيث قد يترجم التعبير Format(Now, "hh:mm:ss") بنجاح إلى ساعات ودقائق وثوانٍ استناداً إلى وقوع “mm” بين الساعات والثواني، إلا أن هذا التسامح البرمجي يعد خطيئة منهجية ومخاطرة برمجية كبرى. فالاعتماد على السياق قد يفشل بصورة مفاجئة وكارثية عند كتابة قوالب غير تقليدية أو مجتزأة مثل Format(myTime, "hh:mm") أو عند معالجة التواريخ المركبة، حيث قد تترجم الدالة الرمز “mm” كرقم الشهر بدلاً من رقم الدقيقة، وهو ما ينتج عنه كوارث حسابية خفية في الأنظمة التشغيلية.

5. دقة الثواني ومؤشرات الصباح والمساء (AM/PM)

5.1 تمثيل الثواني باستخدام “s” و”ss”

تكتسب الثواني في معالجة البيانات أهمية محورية كلما اقتربت المنظومة البرمجية من تسجيل الأحداث اللحظية وسجلات التدقيق التزامني (Audit Trails). تتيح لغة VBA التحكم الدقيق في إظهار الثواني عبر مستويين رمزيين: الرمز المفرد “s” والرمز المزدوج “ss”. يقوم الرمز “s” بعرض الثواني كقيم عددية مجردة من 0 إلى 59 دون أي أصفار بادئة، مما يجعله مناسباً لحساب الفوارق الزمنية البسيطة والعدادات التي تكتفي بالأرقام المجردة في واجهاتها التفاعلية.

على الطرف المقابل، يمثل الرمز “ss” المعيار الاحترافي الإلزامي لكافة السجلات الزمنية الموثقة والتطبيقات التي تتطلب دقة وتوازناً شكلياً تاماً. يفرض هذا الرمز إظهار الثواني بخانتين دائماً (من 00 إلى 59) عبر إضافة صفر بادئ لكافة الأرقام التي تقل عن عشر ثوانٍ. يلعب هذا التنسيق دوراً حاسماً في منظومات مراقبة الأخطاء وتوثيق العمليات الاستثنائية (Error Logging)؛ إذ إن توثيق حدوث خطأ برمجي عند “14:20:05” يحمل معنى دقيقاً وموثوقاً مقارنة بالصيغة الناقصة “14:20:5”.

تستخدم الثواني المنسقة بانتظام لمراقبة فترات تنفيذ الإجراءات البرمجية ذاتها وقياس زمن استجابة الاستعلامات وقواعد البيانات. فمن خلال قراءة الدالة الزمنية النظامية Timer أو المتغير Now وتطبيق التنسيق “hh:nn:ss” في نقاط البداية والنهاية، يستطيع المطور بناء ملفات تتبع تفصيلية تتيح له إجراء عمليات استكشاف الأداء وحل اختناقات المعالجة (Bottlenecks) في برمجيات المؤسسة بكفاءة وموضوعية.

5.2 التحكم في محددات الفترات (AM/PM وA/P)

عند الرغبة في تمثيل الوقت وفق نظام الاثنتي عشرة ساعة المألوف في الأوساط التجارية والمكتبية، يتعين على المطور إدراج الرموز المخصصة لتحديد الفترات الزمنية النهارية والليلية. توفر VBA مجموعة متنوعة من الأنماط الرمزية التي تتكيف مع مختلف المتطلبات الجمالية والوظيفية للمشروع، ويعد الرمز “AM/PM” بصيغته الكبيرة هو الأكثر انتشاراً وشيوعاً؛ إذ يلحق بالوقت الكلمة “AM” للفترة الصباحية (من منتصف الليل حتى 11:59 صباحاً) والكلمة “PM” للفترة المسائية (من الظهر حتى 11:59 ليلاً).

للمطورين حرية اختيار بدائل رمزية أخرى تتناسب مع تصميم واجهاتهم البرمجية؛ فاستخدام الرمز الصغير “am/pm” يؤدي إلى إظهار المؤشر بأحرف لاتينية صغيرة متطابقة مع المدخل (“am” أو “pm”). كذلك يوفر النظام النمط المقتضب “A/P” الذي يكتفي بعرض الحرف الأول فقط بحجم كبير (“A” أو “P”)، ونمط “a/p” الذي يعرضه بحرف صغير، مما يمنح مرونة كبرى لمصممي الجداول ذات الأعمدة الضيقة التي لا تتسع للمحارف المزدوجة.

من الأهمية بمكان الإشارة إلى أن هذه الرموز الحرفية تتأثر تأثراً عميقاً بالإعدادات الإقليمية (Regional Settings) الخاصة بنظام تشغيل ويندوز في بيئة العمل المستضيفة. فإذا كان نظام التشغيل معداً ليعمل وفق اللغة العربية مع تعيين مؤشرات الفترات للغة العربية، فإن استخدام الرمز “AM/PM” في دالة Format قد ينتج عنه بصرياً الحرفان “ص” للصباح و”م” للمساء بدلاً من المقابل الإنجليزي، وهو أمر بالغ الحساسية يجب مراعاته وتثبيته برمجياً عند بناء برامج موجهة للعمل عبر بيئات جغرافية متعددة.

5.3 بناء سلاسل زمنية مركبة وشاملة

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

لإدراج نصوص ثابتة داخل سلسلة التنسيق في لغة VBA دون أن يفسرها محرك الدالة كرموز برمجية محجوزة، يجب تغليف هذه النصوص بعلامات تنصيص مفردة أو علامات تنصيص مزدوجة مكررة (Escaped Quotes). على سبيل المثال، إذا أراد المطور كتابة صيغة تظهر النص التالي: “الساعة 04:30 مسجلة”، فإن القالب البرمجي يجب أن يُصاغ بعناية برمجية تفصل بين الرموز الوظيفية “hh” و”nn” والمحارف النصية العادية، لتلافي محاولة النظام تفسير الحرف “h” في الكلمة كنواة لتنسيق الساعات.

يوضح المثال العملي التالي كيفية استثمار هذه المرونة لبناء جمل زمنية مخصصة وتقارير نصية ذات صياغة احترافية:

Dim formattedString As String
formattedString = Format(Now, "hh:nn:ss AM/PM")
Dim customLogText As String
customLogText = Format(Now, "'التوقيت الحالي:' hh 'ساعة و' nn 'دقيقة'")

تفتح هذه التقنية آفاقاً واسعة أمام المطور لأتمتة المخاطبات الرسمية، وتوليد إشعارات البريد الإلكتروني المؤتمتة عبر كائنات Outlook، وبناء رسائل تنبيهية متكاملة تدمج الوقت بالسياق اللغوي دون الحاجة لإجراء عمليات دمج نصي متشابكة ومربكة للشيفرة البرمجية.

6. الصيغ الزمنية المسبقة التعريف (Named Time Formats)

6.1 استخدام الصيغة الجاهزة “Short Time”

تحتوي لغة VBA على مجموعة من الصيغ الزمنية الجاهزة مسبقة التعريف (Named Formats) التي صممتها مايكروسوفت لتسهيل العمل البرمجي وتوحيد القياسات النمطية الشائعة. تأتي صيغة “Short Time” في مقدمة هذه الأنماط المقتضبة؛ حيث صُممت خصيصاً لتوفير عرض سريع، وعملي، ومختزل للمعلومات الزمنية بحجب كافة التفاصيل الثانوية غير الضرورية في سياق العرض اليومي المعتاد للمستخدمين.

تعتمد صيغة “Short Time” بنيوياً على إظهار الساعات والدقائق فقط وفق نظام التوقيت الممتد على 24 ساعة، مع إسقاط الثواني ومؤشرات الفترات الصباحية والمسائية تلقائياً من المخرجات النصية. يتم كتابة الساعات بخانتين ملزمتين والدقائق بخانتين متطابقتين، مما يجعل الناتج مطابقاً للنسق القياسي “hh:nn”، فتظهر الساعة الثامنة والربع مساءً في الصورة المقتضبة “20:15”.

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

6.2 استخدام الصيغة الجاهزة “Medium Time”

تمثل صيغة “Medium Time” حلاً وسطاً يجمع بين إيجاز الصيغ المقتضبة والوضوح الكلاسيكي المألوف لنظام الاثنتي عشرة ساعة. تركز هذه الصيغة الجاهزة على تقديم الوقت في قالب جمالي يتناسب بصورة مثالية مع التقارير الإدارية، وعروض لوحات المؤشرات (Dashboards)، والملخصات التنفيذية الموجهة للمديرين والمستخدمين النهائيين الذين يفضلون القراءة السلسة على الأنظمة الرقمية الجافة.

تعرض هذه الصيغة الساعات والدقائق متبوعة بمؤشر الفترة الزمنية (“AM” أو “PM”)، مع استبعاد تام لخانة الثواني لتقليل الضوضاء البصرية. وبناءً على ذلك، يتم التعبير عن الوقت في هذا النمط بالشكل القياسي المرجعي التالي: “08:15 PM” أو “08:15 ص” اعتماداً على التوطين الجغرافي للجهاز المضيف، مما يوفر تمثيلاً متوازناً يسهل استيعابه فوراً دون الحاجة لحساب المقابل في نظام 24 ساعة ذهكياً.

تكمن قوة صيغة “Medium Time” في استقرارها وتجانسها مع الوظائف المكتبية الروتينية ومحاضر الاجتماعات وسجلات الحضور والانصراف، حيث تكون الدقيقة هي المعيار الزمني الكافي والملزم، في حين يعد إدراج الثواني عبئاً طباعياً وشكلياً لا يخدم أهداف التحليل الإداري المباشر.

6.3 استخدام الصيغة الجاهزة “Long Time”

تعد صيغة “Long Time” النسق الأكثر شمولاً وتفصيلاً بين كافة الصيغ الجاهزة المضمنة في بيئة تطوير فيجوال بيسك للتطبيقات. تقدم هذه الصيغة قراءة متكاملة ومطلقة للزمن، مستعرضةً كافة أجزائه الهيكلية في حزمة نصية واحدة تشمل: خانة الساعات، وخانة الدقائق، وخانة الثواني المتزامنة، متبوعةً بمحدد الفترة الصباحية أو المسائية وفق نظام الـ 12 ساعة المعتمد في معظم البيئات المكتبية.

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

ورغم الفوائد التوافقية لهذه الميزة، إلا أنها تمثل في الوقت ذاته الخطر الأكبر على استقرار الأنظمة المشتركة ومشاريع الفرق المتعددة جغرافياً؛ إذ إن اعتماد المطور على الصيغ المسماة كـ “Long Time” و”Short Time” قد يؤدي إلى ظهور نواتج نصية متباينة اختلافاً جذرياً عند تشغيل الماكرو ذاته على أجهزة تعمل بإعدادات لغوية مختلفة (كنظام عربي وآخر إنجليزي أو أوروبي). لذلك، يُجمع خبراء هندسة البرمجيات في VBA على ضرورة تجنب الصيغ المسماة وتفضيل الأقنعة المخصصة الصريحة (مثل “hh:nn:ss AM/PM”) في كافة التطبيقات الحساسة لضمان ثبات المخرجات بغض النظر عن بيئة التشغيل المستضيفة.

7. أمثلة برمجية متقدمة: معالجة بيانات الوقت في أوراق العمل

7.1 بناء ماكرو لمعالجة عمود زمني باستخدام حلقة تكرارية

يتطلب السيناريو العملي الأكثر شيوعاً في بيئات الأعمال معالجة آلاف الصفوف المتتالية التي تحتوي على بيانات زمنية خام أو غير متسقة وتحويلها إلى قوالب منسقة موحدة. لبناء حل برمجي رصين وفعال، ينشئ المطور إجراءً فرعياً (Sub Procedure) يرتكز على تحديد النطاق الحيوي للبيانات واستخدام حلقات التكرار القياسية مثل حلقة For...Next أو حلقة For Each...Next للتحكم في تدفق المعالجة خلية تلو الأخرى.

يبدأ الإجراء النموذجي بالإعلان عن المتغيرات اللازمة لتفادي الاستهلاك العشوائي للذاكرة وتفعيل التوجيه الإلزامي Option Explicit. يتم تحديد رقم السطر الأخير الذي يحتوي على بيانات فعلية في العمود المستهدف برمجياً باستخدام خاصية End(xlUp)، مما يمنح الماكرو ديناميكية فائقة في التكيف مع تزايد أعداد السجلات دون الحاجة لتعديل الأبعاد الرقمية في الشيفرة عند كل تشغيل.

يوضح النموذج البرمجي التالي كيفية استقراء قيم عمود زمني أولي يقع في العمود الأول (Column A)، والتحقق من صحة المدخلات، ثم تطبيق التنسيق القياسي وإيداع المخرجات المنسقة نصياً في العمود المجاور (Column B):

Sub ProcessTimeColumn()
    Dim targetSheet As Worksheet
    Set targetSheet = ThisWorkbook.Sheets(1)
    Dim lastRow As Long
    lastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
    Dim currentRow As Long
    For currentRow = 2 To lastRow
        Dim cellValue As Variant
        cellValue = targetSheet.Cells(currentRow, 1).Value
        If IsDate(cellValue) And Not IsEmpty(cellValue) Then
            targetSheet.Cells(currentRow, 2).Value = Format(cellValue, "hh:nn:ss")
        Else
            targetSheet.Cells(currentRow, 2).Value = "بيانات غير صالحة"
        End If
    Next currentRow
End Sub

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

7.2 توليد تنسيقات متعددة متزامنة عبر أعمدة متباينة

في العديد من سيناريوهات بناء تقارير الأعمال المعقدة، تقتضي متطلبات التحليل استخراج أكثر من منظور زمني من القيمة المصدرية ذاتها؛ كأن يحتاج المحلل المالي إلى عمود يعرض ساعات الذروة فقط لإجراء تجميع إحصائي (Aggregation)، وعمود ثانٍ يعرض الوقت المقتضب لجدولة المهام، وعمود ثالث يوثق الوقت بالثواني الدقيقة لأغراض المراجعة والتدقيق الإداري.

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

يستعرض الكود المتقدم التالي كيفية تنفيذ هذا التوزيع المتوازي للتنسيقات الزمنية المختلفة انطلاقاً من عمود مصدر واحد:

Sub GenerateMultipleTimeFormats()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim endRow As Long
    endRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Dim i As Long
    For i = 2 To endRow
        Dim rawTime As Variant
        rawTime = ws.Cells(i, 1).Value
        If IsDate(rawTime) Then
            ws.Cells(i, 2).Value = Format(rawTime, "hh") ' الساعات المزدوجة فقط
            ws.Cells(i, 3).Value = Format(rawTime, "hh:nn") ' الوقت المقتضب بنظام 24 ساعة
            ws.Cells(i, 4).Value = Format(rawTime, "hh:nn:ss") ' الوقت الكامل بالثواني
            ws.Cells(i, 5).Value = Format(rawTime, "hh:nn:ss AM/PM") ' الوقت بنظام 12 ساعة ومؤشر الفترة
        End If
    Next i
End Sub

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

7.3 استخراج وتنسيق أجزاء الوقت من قيم التاريخ والوقت المركبة

غالباً ما تتضمن حقول قواعد البيانات وسجلات الخوادم طوابع زمنية مركبة تجمع التاريخ الميلادي والوقت الدقيق معاً ضمن خلية واحدة (مثل: “2026-03-30 15:45:10”). عند بناء تقارير تحليلية تركز على الأداء اليومي وتوزيع المعاملات عبر ساعات النهار، يصبح لزاماً على المطور استخلاص الشق الزمني بدقة، وفصله تماماً عن الجذور التقويمية التاريخية دون إتلاف سلامة البيانات أو الوقوع في فخاخ تحويل الأنواع.

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

لتوضيح ذلك، يقدم الإجراء التالي حلاً نموذجياً لاستخلاص الشق الزمني من طابع زمني كامل وتنسيقه في هيئة سلسلة زمنية آمنة ومستقلة:

Sub ExtractTimeFromDateTime()
    Dim fullStamp As Date
    fullStamp = Now ' يتضمن التاريخ الحالي والوقت بالثواني
    Dim extractedTime As String
    ' استخلاص الوقت فقط بصيغة 24 ساعة دقيقة
    extractedTime = Format(fullStamp, "hh:nn:ss")
    ' استخلاص الوقت بنظام 12 ساعة مع مؤشر الفترة
    Dim friendlyTime As String
    friendlyTime = Format(fullStamp, "h:nn AM/PM")
    Debug.Print "الوقت المستخلص (24 ساعة): " & extractedTime
    Debug.Print "الوقت المستخلص (12 ساعة): " & friendlyTime
End Sub

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

8. المقارنة بين دالة Format وخاصية NumberFormat في كائنات Range

8.1 التحويل النصي (Format) مقابل التنسيق البصري (NumberFormat)

تشكل المقارنة بين دالة Format في VBA وخاصية NumberFormat التابعة لكائن النطاق Range في إكسيل محوراً فلسفياً وتقنياً بالغ الأهمية لكل مطور برمجيات متقدم. إن إدراك الفوارق الجوهرية الدقيقة بين هذين الأسلوبين هو الفيصل الأساسي بين الكود الاحترافي المصمم بكفاءة معمارية عالية، والكود الهش الذي يؤدي إلى مشكلات وظيفية خفية أثناء الاستخدام الميداني للبرمجية.

تعتبر دالة Format دالة تحويلية نصية صريحة؛ فعند كتابة Cells(1, 1).Value = Format(Time, "hh:nn:ss")، يتم تحويل القيمة الزمنية إلى سلسلة محارف جامدة وتخزينها في الخلية كقيمة نصية (String Literal). هذا يعني أن الخلية فقدت طبيعتها الرقمية الكامنة، وتحولت إلى نص يشبه أي كلمة مكتوبة، مما يعطل إمكانية إشراكها المباشر في العمليات الحسابية أو استخدامها كوسيط رياضي ضمن دوال الجمع والإحصاء داخل ورقة العمل.

في المقابل، تعمل خاصية Range.NumberFormat كقناع بصري أو طبقة إظهار رسومية (Presentation Layer) بحتة. عند تطبيق هذه الخاصية، تظل القيمة الرقمية الكسرية الأصلية للوقت (الرقم التسلسلي العائم) مخزنة في الخلية كما هي دون أدنى تغيير في بنيتها الرياضية، بينما يتولى محرك إكسيل تعديل طريقة عرضها للعين المجردة فقط. هذا الفصل بين القيمة وطريقة العرض يحافظ على مرونة الخلية وقدرتها على التفاعل الفوري مع كافة المعادلات الرياضية ومخططات البيانات التفاعلية دون أي تعقيد.

8.2 معايير الاختيار بين الأسلوبين البرمجيين

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

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

على الجانب الآخر، تبرز ضرورة استخدام دالة Format في الحالات التي يكون فيها الهدف هو إعداد نصوص نهائية ثابتة غير موجهة للحسابات داخل إكسيل. يشمل ذلك: توليد نصوص رسائل التنبيه ومربعات الحوار (MsgBox)، وبناء أسماء ملفات ديناميكية تتضمن الطابع الزمني للنسخ الاحتياطي (كأن يسمى الملف “Backup_14_30_00.xlsx”)، وصياغة وتصدير ملفات النصوص والتقارير المصمتة (Text/CSV Files) الموجهة للمصارف أو خوادم البيانات المركزية، فضلاً عن تعبئة كائنات الواجهات التفاعلية (UserForms) كالقوائم المنسدلة وصناديق النصوص التي تقبل بطبيعتها السلاسل النصية فقط.

8.3 أمثلة تطبيقية لاستخدام Range.NumberFormat برمجياً

تتميز خاصية Range.NumberFormat بقدرتها الفائقة على معالجة كتل ضخمة من الخلايا بخطوة برمجية واحدة دون الحاجة إلى تشغيل حلقات تكرارية تستهلك موارد المعالج. تعتمد هذه الخاصية رموزاً شديدة الشبه بالرموز المستخدمة في دالة Format، ولكن مع بعض التباينات الدلالية الطفيفة التي يفرضها محرك إكسيل؛ حيث يقبل الأخير الحرف “m” للدقائق بأمان أكبر عندما يقع مجاوراً للساعات أو الثواني.

لتطبيق التنسيق البصري على عمود كامل أو نطاق محدد من الخلايا بأسلوب احترافي وسريع، يمكن استخدام النماذج البرمجية المباشرة الآتية:

Sub ApplyTimeFormattingToRange()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)
    ' تطبيق تنسيق التوقيت العسكري الكامل على النطاق B2:B1000 دفعة واحدة
    ws.Range("B2:B1000").NumberFormat = "hh:mm:ss"
    ' تطبيق تنسيق 12 ساعة مع مؤشر الفترة على العمود C بأكمله
    ws.Columns("C").NumberFormat = "hh:mm AM/PM"
    ' إسناد القيمة الزمنية الرقمية الحالية مع بقاء التنسيق بصرياً بحتاً
    ws.Range("B2").Value = Time
End Sub

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

9. معالجة الأخطاء والقيود البرمجية في تنسيق الوقت

9.1 التعامل مع القيم الزمنية غير الصالحة والبيانات الفارغة

تمثل جودة البيانات المدخلة التحدي الأكبر الذي يهدد استقرار الماكرو أثناء تنفيذ عمليات التنسيق الزمني الواسعة. تتضمن جداول الواقع العملي في كثير من الأحيان خلايا فارغة، أو نصوصاً عشوائية ناجمة عن أخطاء الإدخال البشري، أو قيماً رقمية تخرج عن المنطق الزمني المألوف، مما قد يسبب انهيار البرنامج وظهور رسائل الخطأ التشغيلية مثل خطأ عدم تطابق الأنواع (Run-time error 13: Type Mismatch).

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

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

Sub RobustTimeFormatting()
    On Error GoTo ErrorHandler
    Dim targetCell As Range
    For Each targetCell In Range("A1:A500")
        If Not IsEmpty(targetCell.Value) Then
            If IsDate(targetCell.Value) Then
                targetCell.Offset(0, 1).Value = Format(targetCell.Value, "hh:nn:ss")
            Else
                targetCell.Offset(0, 1).Value = "تنسيق غير صالح"
            End If
        Else
            targetCell.Offset(0, 1).Value = "خلية فارغة"
        End If
    Next targetCell
    Exit Sub
ErrorHandler:
    MsgBox "حدث خطأ غير متوقع: " & Err.Description, vbCritical, "خطأ في المعالجة"
End Sub

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

9.2 معضلة الأوقات المتراكمة التي تتجاوز 24 ساعة

يواجه المطورون في بيئة VBA قصوراً بنيوياً وتصميمياً بارزاً في دالة Format عند محاولة عرض الساعات المتراكمة أو الفترات الزمنية الإجمالية التي يتجاوز مجموعها حاجز الـ 24 ساعة (كما هو شائع عند حساب إجمالي ساعات العمل الإضافي، أو أزمنة تشغيل الآلات الصناعية، أو الفترات الإجمالية للمشاريع الهندسية). يكمن جذر المشكلة في أن دالة Format تعيد تدوير عداد الساعات تلقائياً إلى الصفر في كل مرة يكتمل فيها اليوم (24 ساعة)، تماماً كما تفعل عقارب الساعة العادية.

في واجهة خلايا إكسيل العادية، يمكن حل هذه المعضلة بسهولة عبر استخدام الأقواس المربعة حول رمز الساعات، مثل التنسيق [h]:mm:ss؛ حيث تأمر هذه الأقواس المحرك بالاستمرار في تراكم الساعات بدلاً من تصفيرها. لكن دالة Format في لغة VBA لا تدعم هذا النمط الحسابي المخصص إطلاقاً، وتعامله كنص غير مفهوم أو تعيد ناتجاً مشوهاً يعكس الساعات المتبقية من اليوم الأخير فقط بعد إسقاط الأيام الكاملة دون تنبيه المطور.

للتغلب على هذا القصور البرمجي الحرج، يجب على المطور تجاوز دالة Format وبناء دالة رياضية مخصصة تتولى تفكيك الرقم التسلسلي الكلي وحساب إجمالي الساعات المطلقة يدوياً، كما هو موضح في الدالة المتخصصة التالية:

Function FormatElapsedTime(ByVal totalTimeSerial As Double) As String
    Dim totalHours As Long
    Dim remainingMinutes As Long
    Dim remainingSeconds As Long
    ' حساب إجمالي الساعات بضرب الأيام التسلسلية في 24
    totalHours = Fix(totalTimeSerial * 24)
    ' حساب الدقائق المتبقية من الكسر الزمني
    remainingMinutes = Fix((totalTimeSerial * 24 - totalHours) * 60)
    ' حساب الثواني المتبقية وتدويرها بدقة
    remainingSeconds = Round((((totalTimeSerial * 24 - totalHours) * 60) - remainingMinutes) * 60)
    ' معالجة حالات التقريب الحرج للثواني
    If remainingSeconds = 60 Then
        remainingSeconds = 0
        remainingMinutes = remainingMinutes + 1
    End If
    If remainingMinutes = 60 Then
        remainingMinutes = 0
        totalHours = totalHours + 1
    End If
    FormatElapsedTime = CStr(totalHours) & ":" & Right("0" & remainingMinutes, 2) & ":" & Right("0" & remainingSeconds, 2)
End Function

تضمن هذه الدالة الرياضية الحساب الدقيق للمدد الزمنية المفتوحة، وتتيح للمؤسسات الصناعية وشركات المقاولات استخراج تقارير إجمالية واقعية لساعات العمل تتطابق مع الحقيقة الرياضية للبيانات دون أي فقدان ناجم عن حدود دورات اليوم الـ 24 ساعة.

9.3 تأثير التوطين والإعدادات الإقليمية (Regional Settings)

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

في العديد من الدول والثقافات، تُستخدم النقطة المفردة (.) أو الفاصلة المقلوبة كفاصل قياسي بين الساعات والدقائق بدلاً من النقطتين الرأسيتين (:) المألوفتين في الثقافة الإنجليزية والأمريكية. عند استخدام دالة Format(Time, "hh:nn:ss") على حاسوب معد بإعدادات إقليمية إيطالية أو بعض البيئات الأوروبية، قد يستبدل النظام محرف النقطتين بالفاصل المحلي لنظام التشغيل بصورة قسرية، مما ينتج عنه سلسلة مثل “14.30.00” بدلاً من “14:30:00”.

إذا كانت هذه المخرجات موجهة للتصدير إلى خوادم خارجية تتطلب النقطتين الرأسيتين كشرط بنيوي صارم، فإن هذا الاستبدال الإقليمي التلقائي سيؤدي إلى فشل فوري في تبادل البيانات. لتجاوز هذه المعضلة وتثبيت فاصل زمني دولي محايد لا يخضع لتقلبات لغة نظام التشغيل، ينبغي للمطور استخدام أسلوب الهروب النصي للمحارف (Escaped Characters) عبر إحاطة النقطتين بشرطة مائلة عكسية (Backslash) أو وضعهما بين علامات تنصيص صريحة داخل القالب، مثل: Format(Time, "hh:nn:ss").

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

10. أفضل الممارسات لتحسين الأداء البرمجي وتوثيق الكود

10.1 تحسين سرعة معالجة الأوقات في مجموعات البيانات الضخمة

عند التعامل مع مجموعات بيانات ضخمة (Big Datasets) تضم مئات الآلاف من السجلات الزمنية، تصبح كفاءة استهلاك الموارد وسرعة التنفيذ المعيار الحقيقي لنجاح الحل البرمجي. إن الاعتماد على الحلقات التكرارية التقليدية التي تقرأ وتكتب في خلايا ورقة العمل بصورة فردية ومباشرة يعد كارثة أدائية؛ نظراً لأن كل عملية تبادل بين محرك VBA وطبقة خلايا إكسيل (COM Interop Calls) تفرض حملاً زمنياً ثقيلاً يؤدي إلى تجميد الواجهة وبطء المعالجة.

تتمثل الممارسة المعمارية الفضلى لتجاوز هذا البطء في نقل نطاق البيانات بأكمله دفعة واحدة إلى مصفوفة داخلية في الذاكرة العشوائية (Memory Array)، وإجراء كافة عمليات تنسيق الأوقات عبر دالة Format في فضاء الذاكرة المجردة، ثم إعادة تفريغ المصفوفة المنسقة بالكامل إلى ورقة العمل في عملية كتابة أحادية لا تستغرق سوى جزء من الثانية. بالإضافة إلى ذلك، يجب تعطيل أدوات التحديث البصري والحساب التلقائي أثناء تنفيذ المعالجة لضمان استغلال كامل طاقة المعالج، كما يظهر في الكود عالي الكفاءة التالي:

Sub FastTimeProcessing()
    Dim startTime As Single
    startTime = Timer
    ' تسريع الأداء بتعطيل تحديث الشاشة والحسابات اللحظية
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow < 2 Then Exit Sub
    ' قراءة البيانات بالكامل إلى مصفوفة في الذاكرة
    Dim dataRange As Variant
    dataRange = ws.Range("A2:A" & lastRow).Value
    Dim outputArray() As Variant
    ReDim outputArray(1 To UBound(dataRange, 1), 1 To 1)
    Dim r As Long
    For r = 1 To UBound(dataRange, 1)
        If IsDate(dataRange(r, 1)) And Not IsEmpty(dataRange(r, 1)) Then
            outputArray(r, 1) = Format(dataRange(r, 1), "hh:nn:ss")
        Else
            outputArray(r, 1) = ""
        End If
    Next r
    ' إعادة كتابة النتائج دفعة واحدة بخطوة واحدة
    ws.Range("B2:B" & lastRow).Value = outputArray
    ' استعادة إعدادات التطبيق الأصلية
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Debug.Print "زمن المعالجة الإجمالي: " & (Timer - startTime) & " ثانية"
End Sub

يحقق هذا الأسلوب المتقدم قفزات هائلة في الأداء؛ حيث يقلص زمن معالجة مئات الآلاف من السجلات من عدة دقائق مرهقة إلى ثوانٍ معدودة، مما يعزز استقرار التطبيق ويمنح المستخدم النهائي تجربة استخدام سلسة واحترافية للغاية.

10.2 بناء دوال مخصصة قابلة لإعادة الاستخدام (User-Defined Functions – UDFs)

تمثل الدوال المعرفة من قبل المستخدم (User-Defined Functions – UDFs) إحدى أقوى ميزات بيئة VBA؛ حيث تتيح تغليف المنطق البرمجي المعقد لتنسيق الوقت داخل وحدات برمجية مستقلة وقابلة لإعادة الاستخدام في أي مكان داخل المشروع، فضلاً عن إمكانية استدعائها كمعادلات مخصصة داخل خلايا ورقة العمل ذاتها مثل أي دالة رياضية قياسية في إكسيل.

يسهم بناء دالة مخصصة لتنسيق الوقت في تطبيق مبدأ “عدم تكرار الشيفرة” (Don’t Repeat Yourself – DRY) الذي يعد من ركائز هندسة البرمجيات الحديثة. فبدلاً من إعادة كتابة قوالب التنسيق وسلاسل الفحص في كل إجراء فرعي، يتم الرجوع إلى الدالة المركزية التي تتولى التحقق من صحة المعطيات، ومعالجة القيم الفارغة، وإرجاع الوقت بالهيئة المؤسسية الموحدة.

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

Public Function FormatTimeStandard(ByVal inputTime As Variant, Optional ByVal isMilitary As Boolean = True) As String
    If IsMissing(inputTime) Or IsEmpty(inputTime) Or Not IsDate(inputTime) Then
        FormatTimeStandard = ""
        Exit Function
    End If
    If isMilitary Then
        FormatTimeStandard = Format(inputTime, "hh:nn:ss")
    Else
        FormatTimeStandard = Format(inputTime, "hh:nn:ss AM/PM")
    End If
End Function

يتيح هذا التغليف الهندسي المتقن لأي مستخدم عادي في ورقة العمل كتابة الصيغة =FormatTimeStandard(A2, FALSE) داخل الخلية مباشرة للحصول على توقيت منسق بدقة واحترافية متناهية دون الحاجة لمعرفة التفاصيل والتعقيدات البرمجية الكامنة وراء الكواليس في محرر الشيفرة.

10.3 قواعد التوثيق ونظافة الكود في مشاريع VBA الزمنية

تحتاج المشاريع البرمجية المكتوبة بلغة VBA، لا سيما تلك التي تدير العمليات الزمنية والمالية المعقدة، إلى عناية خاصة بجوانب التوثيق ونظافة الشيفرة (Clean Code) لضمان قابليتها للصيانة المستقبلية وسهولة تطويرها من قبل فرق العمل المشتركة. تتطلب الأنماط الزمنية تحديداً تفسيراً دقيقاً؛ نظراً لأن تشابه الرموز (كالخلط بين “m” و”n”) قد يربك المطورين اللاحقين إذا لم تكن الأهداف واضحة ومبررة في التعليقات.

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

يوضح النموذج التالي التنسيق الهيكلي الأمثل لتوثيق وتوزيع الثوابت الزمنية داخل وحدة نمطية قياسية:

Option Explicit

' ==========================================================================
' تعريف الثوابت الزمنية الموحدة للمشروع لضمان الاتساق البرمجي وتسهيل الصيانة
' ==========================================================================
Public Const TIME_FORMAT_MILITARY As String = "hh:nn:ss"      ' توقيت قياسي 24 ساعة
Public Const TIME_FORMAT_STANDARD As String = "hh:nn:ss AM/PM"  ' توقيت مدني 12 ساعة
Public Const TIME_FORMAT_SHORT As String = "hh:nn"            ' توقيت مقتضب بدون ثوانٍ

''' <summary>
''' إجراء مخصص لتوثيق طابع زمني دقيق في ملف المراقبة وسجل الأحداث
''' </summary>
''' <param name="eventDescription">نص وصفي للحدث المراد تسجيله</param>
Public Sub LogSystemEvent(ByVal eventDescription As String)
    Dim timeStamp As String
    ' استخدام الثابت المعرف مسبقاً وتوضيح سبب استخدامه لتوثيق الثواني بدقة
    timeStamp = Format(Now, TIME_FORMAT_MILITARY)
    Debug.Print "[" & timeStamp & "] " & eventDescription
End Sub

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

خاتمة

تناول هذا المقال الموسع مصفوفة التقنيات والاستراتيجيات الهندسية المرتبطة بتنسيق الوقت في لغة فيجوال بيسك للتطبيقات (VBA)، بدءاً من تفكيك النماذج الرياضية التي تختزل الزمن كأرقام تسلسلية عائمة، وصولاً إلى استعراض الفوارق الجوهرية بين التنسيق النصي الصارم باستخدام دالة Format والتنسيق المظهري الرسومي المعتمد على خاصية Range.NumberFormat.

لقد تبين بوضوح أن النجاح في إدارة الوقت برمجياً لا يتوقف عند مجرد استدعاء الأوامر الجاهزة، بل يتطلب فهماً عميقاً للفصل الدلالي بين الرموز (كالتمييز القطعي بين الرمز “n” للدقائق والرمز “m” للأشهر)، والتحوط الدائم للقيود البنيوية المتعلقة بالأوقات المتراكمة التي تتجاوز 24 ساعة، فضلاً عن بناء استراتيجيات دفاعية صارمة للتحقق من صحة البيانات وعزل تقلبات الإعدادات الإقليمية لنظم التشغيل المضيفة.

إن الالتزام بأفضل الممارسات البرمجية عبر معالجة البيانات الضخمة داخل مصفوفات الذاكرة السريعة، وتغليف الإجراءات المتكررة في دوال مخصصة (UDFs)، وبناء كود نظيف وموثق بالثوابت، يضمن للمؤسسات والمطورين بناء حلول أتمتة فائقة الأداء، تتسم بالموثوقية والاستقرار، وتوفر تجربة قراءة وتحليل خالية من الغموض في كافة مراحل دورة حياة البيانات.

المراجع

  • Microsoft Corporation. (2023). Format function (Visual Basic for Applications). Microsoft Learn. https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/format-function-visual-basic-for-applications
  • Microsoft Corporation. (2023). Range.NumberFormat property (Excel). Microsoft Learn. https://learn.microsoft.com/en-us/office/vba/api/excel.range.numberformat
  • Microsoft Corporation. (2021). [MS-VBAL]: VBA Language Specification. Microsoft Open Specifications. https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-vbal/
  • Walkenbach, J. (2015). Excel 2016 Power Programming with VBA. John Wiley & Sons.
  • Alexander, M., & Kusleika, R. (2019). Access 2019 Bible. John Wiley & Sons.
★

تقييم هذا المحتوى

5.0 / 5 • 7 تقييمات

اقتباس هذا المقال

looti, M. (2026, أكتوبر 23). كيفية تنسيق الوقت في VBA (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-format-time-in-vba-with-examples/
looti, Mohammed. “كيفية تنسيق الوقت في VBA (مع أمثلة).” عرب سايكلوجي, 23 أكتوبر 2026, https://arabpsychology.com/statistics/how-to-format-time-in-vba-with-examples/.
looti, Mohammed. “كيفية تنسيق الوقت في VBA (مع أمثلة).” عرب سايكلوجي. أكتوبر 23, 2026. https://arabpsychology.com/statistics/how-to-format-time-in-vba-with-examples/.