2010-01-30 8 views
8

क्या प्रगतिबार उपयोगकर्ताफॉर्म को वीबीए में मोडल या मॉडेलिस के रूप में दिखाना बेहतर है? वीबीए में प्रगति संकेतकों के विकास के लिए सर्वोत्तम प्रथाएं क्या हैं?क्या प्रगतिबार उपयोगकर्ताफॉर्म को वीबीए में मोडल या मॉडेलिस के रूप में दिखाना बेहतर है?

मोडलेस उपयोगकर्ताफॉर्म को Application.Interactive = False के उपयोग की आवश्यकता होती है, जबकि मॉडल उपयोगकर्ताफॉर्म अपनी प्रकृति से ब्लॉक प्रक्रिया तक समाप्त होने तक आवेदन के साथ किसी भी बातचीत को अवरुद्ध करते हैं, या रद्द कर दिया जाता है।

तो Application.Interactive = False प्रयोग किया जाता है, हालांकि, Esc कुंजी कोड निष्पादन, तो Application.EnableCancelKey = xlErrorHandler के उपयोग और त्रुटि हैंडलिंग (Err.Number = 18) दोनों UserForm और बुला प्रक्रिया में आवश्यक है व्यवधान।

संसाधन गहन कॉलिंग प्रक्रियाओं के परिणामस्वरूप CommandButton_Click और UserForm_Activate मॉडल मॉड्यूल उपयोगकर्ताफॉर्म में मिस्फीयरिंग के परिणामस्वरूप हो सकते हैं।

सामान्य रूप से, प्रगति संकेतक जो मोडल उपयोगकर्ताफॉर्म का उपयोग करते हैं, सरल लगते हैं, क्योंकि निष्पादित किया जा रहा कोड पूरी तरह से उपयोगकर्ताफॉर्म मॉड्यूल में निहित है, और चर के पारित होने की आवश्यकता कम है।

समस्या, हालांकि, प्रगति संकेतकों के लिए मोडल उपयोगकर्ताफॉर्म का उपयोग करने के साथ समस्या यह है कि प्रत्येक प्रक्रिया के लिए एक अलग उपयोगकर्ताफॉर्म मॉड्यूल आवश्यक है जिसके लिए प्रगति संकेतक की आवश्यकता होती है, क्योंकि कॉलिंग प्रक्रिया UserForm_Activate प्रक्रिया के अंदर होनी चाहिए।

इसलिए, मॉडल मॉडल में एक एकल पुन: प्रयोज्य प्रगति संकेतक होने के बावजूद, यह एकाधिक मोडल उपयोगकर्ताफॉर्म के भीतर कोड निष्पादित करने से कम विश्वसनीय होगा।

किस तरह से बेहतर है?

धन्यवाद!

उत्तर

1

मैं इसे बंद करने जा रहा हूं और कहूंगा कि मॉडल विजेता है। मैंने दोनों तरीकों की कोशिश की है, लेकिन आप मॉडेलिस उपयोगकर्ताफॉर्म के साथ बहुत सी कमी को बंद करने की कोशिश कर रहे हैं। मॉडल अधिक कठिन है क्योंकि यह अधिक सख्त है, लेकिन यह आपको अपने कोड को छोटे हिस्सों में तोड़ने के लिए प्रोत्साहित करता है जो कि लंबे समय तक बेहतर होता है।

3

Application.StatusBar का उपयोग करके तीसरा तरीका भी है। आप यू + 25 ए ​​0 और यू + 25 ए ​​1 अक्षरों के अनुक्रम का उपयोग करके एक वास्तविक प्रगति पट्टी का अनुकरण भी कर सकते हैं।

+0

सुझाव GSerg के लिए धन्यवाद, लेकिन मैंने अतीत में इसका उपयोग करने का प्रयास किया है, लेकिन एक्सेल 2007 विंडो को अपडेट करना बंद कर देता है और एप्लिकेशन विंडो के शीर्ष पर "प्रतिसाद नहीं दे रहा" दिखाता है। – Kuyenda

+2

मुझे कार्यालय 2007 के साथ बहुत अनुभवी नहीं है, लेकिन यदि आप 'स्टेटसबार' के मान को सेट करने के बाद सही तरीके से DoEvents को कॉल करते हैं तो क्या होगा? – GSerg

+0

हू, यह काम किया। वाह, यह एक अच्छा विकल्प है यह नहीं है! धन्यवाद जीएसआरजी! – Kuyenda

1

निश्चित रूप से मॉडल। यदि आप मोडलेस पर विचार करने जा रहे हैं, तो आपको इसे एक्सेल.एक्सई मुख्य थ्रेड पर नहीं, अलग-अलग प्रक्रिया के थ्रेड पर चलाना चाहिए।

1

मुझे लगता है कि प्रारंभिक विषय उत्तर देने योग्य है क्योंकि सवाल इतना स्पष्ट रूप से तैयार किया गया था कि Google इसे पहले पाता है।

धारा 1 - सिद्धांत

पहली बात कहना है कि मॉड्यूल के बीच चर हस्तांतरण करने के लिए है बिल्कुल मुश्किल नहीं है।

एकमात्र चीज जो आपको करने की ज़रूरत है वह एक अलग मॉड्यूल बनाने और सभी वैश्विक चर डालने के लिए है। फिर आप उन्हें सभी रूपों, चादरें, मॉड्यूल में हर जगह पढ़ने में सक्षम होंगे।

दूसरी बात खिड़की बिना प्रणाली का होना चाहिए। यह क्यों? जवाब कोड की गतिशीलता बनाए रखने के लिए है यानि

  1. समारोह जहां अधिकांश सामान्य प्रक्रिया निष्पादित किया जाता है UserForm मॉड्यूल में स्थित होने का नहीं है
  2. आप प्रगति बार के साथ खिड़की कॉल कर सकते हैं हर जगह और
  3. दिनचर्या समारोह/प्रक्रिया के बीच ही कनेक्शन वैश्विक चर

हैं से यह एक बड़ा फायदा यहाँ बहुमुखी हो रहा है।

धारा 2 - अभ्यास

1) एक मॉड्यूल "घोषणा" वैश्विक चर के साथ बनाएँ:

लोक StopForce पूर्णांक के रूप में 'इस वैरिएबल का उपयोगकर्ता दबाया एक संकेतक के रूप में इस्तेमाल किया जाएगा रद्द बटन

लोक PCTDone एकल के रूप में 'इस काम के% है कि पहले से ही किया गया था

पी है ⇒ CurrentFile स्ट्रिंग के रूप में 'कोई अन्य पैरामीटर जिसे हम फ़ॉर्म में स्थानांतरित करना चाहते हैं।

2) बटन के साथ फॉर्म बनाएं। बटन के ऑनक्लिक ईवेंट में एक कोड है, जहां हम वैश्विक चर करने के लिए घोषणा मॉड्यूल

Private Sub CommandButton1_Click() 

Declaration.StopForce = 1 
    End Sub 

3) जोड़े एक प्रक्रिया में StopForce उल्लेख जहां प्रगति बार

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 
+0

कृपया ध्यान दें कि मॉडेल उपयोगकर्ताफॉर्म मैक ओएस पर बिल्कुल काम नहीं कर रहा है –

संबंधित मुद्दे