هل من الأفضل إظهار userbars userbar في VBA على أنه مشروط أم بلا تعديل؟

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

سؤال

هل من الأفضل إظهار userbars userbar في VBA على أنه مشروط أم بلا تعديل؟ ما هي أفضل الممارسات لتطوير مؤشرات التقدم في VBA؟

تتطلب أجهزة المستخدمين غير المعلمين استخدام Application.Interactive = False, ، في حين أن Userforms Modal بواسطة طبيعتهم يحظرون أي تفاعل مع التطبيق حتى ينتهي الإجراء الأساسي ، أو يتم إلغاؤه.

لو Application.Interactive = False ومع ذلك ، يتم استخدام تنفيذ رمز مفتاح ESC ، وبالتالي استخدام Application.EnableCancelKey = xlErrorHandler والتعامل مع الأخطاء (Err.Number = 18) مطلوب في كل من المستخدم وإجراء الاتصال.

يمكن أن تؤدي إجراءات الاتصال المكثفة للموارد أيضًا إلى CommandButton_Click و UserForm_Activate الأحداث التي أخطأت في userforms غير معدلة.

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

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

لذلك ، على الرغم من أنه من الممكن أن يكون لديك مؤشر تقدم واحد قابل لإعادة الاستخدام في شكل مستخدم غير معدّل ، إلا أنه سيكون أقل موثوقية من تنفيذ الكود من داخل مستخدمي مستخدمي متعدد.

أي طريقة أفضل؟

شكرًا!

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

المحلول 2

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

نصائح أخرى

هناك أيضًا طريقة ثالثة ، باستخدام Application.StatusBar. يمكنك حتى محاكاة شريط التقدم الحقيقي باستخدام سلسلة من أحرف U+25A0 و U+25A1.

بالتأكيد وسيط. إذا كنت ستفكر في مجلورة ، فيجب عليك تشغيله في خيط منفصل خارج العملية وليس على موضوع Excel.exe الرئيسي.

أعتقد أن الموضوع الأولي يستحق الرد منذ صياغة السؤال بشكل جيد لدرجة أن Google تجدها أولاً.

القسم 1 - النظرية

الشيء الأول القول هو أن نقل المتغيرات بين الوحدات ليست صعبة على الإطلاق.

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

الشيء الثاني هل يجب أن تكون النافذة مجهولة. لماذا ذلك؟ الجواب هو للحفاظ على تنقل الكود, ، بمعنى آخر

  1. الوظيفة التي يتم فيها تنفيذ العملية الأكثر روتينية لا يمكن العثور عليها في وحدة المستخدم
  2. يمكنك استدعاء النافذة مع شريط التقدم من كل مكان و
  3. العلاقة الوحيدة بين الوظيفة/الإجراء الروتينية هي المتغيرات العالمية

هذه ميزة رائعة لتكون متعددة هنا.

القسم 2 - الممارسة

1) إنشاء وحدة نمطية "تصريح" مع المتغيرات العالمية:

STOPFORCE العام حيث أن عدد صحيح "سيتم استخدام هذا المتغير كمؤشر على أن المستخدم يضغط على زر إلغاء

PCTDONE العامة كفرد 'هذا هو ٪ من العمل الذي تم بالفعل

Public Currentfile كسلسلة "أي معلمة أخرى نريد نقلها إلى النموذج.

2) إنشاء النموذج مع الزر. في حدث OnClick للزر ، يجب أن يكون هناك رمز حيث نشير إلى المتغير العالمي Stopforce في تصريح وحدة

 Private Sub CommandButton1_Click()

 Declaration.StopForce = 1
  End Sub

3) إضافة إجراء واحد حيث تقوم بتحديث شريط التقدم

Sub UpdateProgressBar(PCTDone_in As Single)
With UserForm1
    ' Update the Caption property of the Frame control.
    .FrameProgress.Caption = Format(PCTDone_in, "0%")
    ' Widen the Label control.
    .LabelProgress.Width = PCTDone_in * _
        (.FrameProgress.Width)
    ' Display the current file from global variable   
    .Label1.Caption = Declaration.CurrentFile
End With
End Sub

4) في أي وحدة أخرى يجب أن يكون لدينا الوظائف أو الإجراء/الفرعي حيث يتم إجراء الروتين:

 For i=1 to All_Files

 Declaration.CurrentFile = myFiles (i)

 FormFnc.UpdateProgressBar (i / .Range("C11").Value)


 DoEvents

 If Declaration.StopForce = 1 Then
    GoTo 3
 End If

 Next i

في الواقع لديك العقارات التالية ، مما يؤدي إلى إيجابيات/سلبيات اعتمادًا على حاجتك:

Type      | Impact on UI | Impact on caller execution
----------|--------------|-----------------------------
Modal     | Blocked      | Blocked until Form is closed
Modeless  | Not blocked  | Continues

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

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