كيف يمكنني استدعاء برنامج خارجي طويل الأمد من Excel/VBA؟

StackOverflow https://stackoverflow.com/questions/135158

سؤال

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

  1. مربع حوار نموذجي يتيح للمستخدم معرفة أن العملية قيد التنفيذ.
  2. إذا فشل الملف القابل للتنفيذ، يجب أن يتلقى المستخدم إشعارًا.
  3. ينبغي فرض مهلة.
  4. يجب أن يكون زر الإلغاء في مربع الحوار.

ولكن أي أفضل الممارسات هي موضع ترحيب.أنا مهتم بالحلول المتعلقة باستدعاء ملف .dll أو .exe.ويفضل أن يكون شيئًا يعمل مع Excel '03 أو إصدار سابق، ولكنني أرغب في سماع سبب للانتقال إلى إصدار أحدث أيضًا.

هل كانت مفيدة؟

المحلول

يجب عليك مراجعة هاتين المقالتين الخاصتين بـ Microsoft KB

كيفية تشغيل تطبيق Win32 من Visual Basicو

كيفية استخدام تطبيق 32 بت لتحديد متى تنتهي العملية المشمولة

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

تفترض مقالة قاعدة المعرفة الأخيرة أنك تريد الانتظار لفترة غير محدودة من الوقت حتى تنتهي عملية الصدفة الخاصة بك.

يمكنك تعديل استدعاء الدالة ret& = WaitForSingleObject(proc.hProcess, INFINITE) للعودة بعد مقدار محدود من الوقت بالمللي ثانية - استبدل INFINITE بقيمة موجبة تمثل المللي ثانية وقم بتغليف الأمر بالكامل في حلقة Do while.تخبرك القيمة المرجعة بما إذا كانت العملية قد اكتملت أو نفاد المؤقت.ستكون قيمة الإرجاع صفرًا إذا انتهت العملية.

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

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

يمكنك استخدام بنية العملية للحصول على قيمة إرجاع من العملية المطلوبة.تحتاج عمليتك إلى إرجاع قيمة حتى يكون ذلك مفيدًا.

نهجي العام تجاه هذا النوع من الحاجة هو:

  1. امنح المستخدم مربع حوار حالة غير مشروط في بداية العملية باستخدام زر الإلغاء، والذي عند النقر عليه سيضع علامة ليتم التحقق منها لاحقًا.من المستحيل على الأرجح تزويد المستخدم بأي حالة، لذا فإن منحه وقتًا منقضيًا أو إحدى صور GIF المتحركة هذه قد يكون مفيدًا في إدارة التوقعات.
  2. ابدأ العملية
  3. انتظر حتى تكتمل العملية، مع السماح بالتحقق من الإلغاء كل 500 مللي ثانية
  4. إذا اكتملت العملية، أغلق مربع الحوار واستمر.
  5. إذا لم تكتمل العملية، فتأكد مما إذا كان المستخدم قد ضغط على "إلغاء" وإذا كان الأمر كذلك، فأرسل رسالة قريبة إلى نافذة العملية.قد لا ينجح هذا وقد يكون إنهاء العملية مطلوبًا - كن حذرًا إذا قمت بذلك.قد يكون أفضل رهان هو التخلي عن العملية إذا لم يتم إغلاقها بشكل صحيح.يمكنك أيضًا التحقق من انتهاء المهلة عند هذه النقطة ومحاولة اتباع نفس المسار كما لو قام المستخدم بالضغط على "إلغاء الأمر".

أتمنى أن يساعد هذا بيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top