2010-09-17 31 views
20

में एक स्क्रीन अपडेट को मजबूर करें मेरा एक्सेल टूल एक लंबा काम करता है, और मैं स्टेटस बार में या शीट में कुछ सेल में प्रगति रिपोर्ट प्रदान करके उपयोगकर्ता के प्रति दयालु होने की कोशिश कर रहा हूं, जैसा कि नीचे दिखाया गया है । लेकिन स्क्रीन रीफ्रेश नहीं होती है, या किसी बिंदु पर रीफ्रेश करना बंद कर देती है (उदा। 33%)। कार्य अंततः पूरा हो जाता है लेकिन प्रगति पट्टी बेकार है।एक्सेल वीबीए

स्क्रीन अपडेट को मजबूर करने के लिए मैं क्या कर सकता हूं?

For i=1 to imax ' imax is usually 30 or so 
    fractionDone=cdbl(i)/cdbl(imax) 
    Application.StatusBar = Format(fractionDone, "0%") & "done..." 
    ' or, alternatively: 
    ' statusRange.value = Format(fractionDone, "0%") & "done..." 

    ' Some code....... 

Next i 

मैं Excel 2003

उत्तर

30

लूप के अंदर DoEvents फ़ंक्शन जोड़ें, नीचे देखें।

आप यह भी सुनिश्चित करना चाहते हैं कि स्टेटस बार उपयोगकर्ता को दिखाई दे और आपके कोड को पूरा होने पर इसे रीसेट कर दें।

Sub ProgressMeter() 

Dim booStatusBarState As Boolean 
Dim iMax As Integer 
Dim i As Integer 

iMax = 10000 

    Application.ScreenUpdating = False 
''//Turn off screen updating 

    booStatusBarState = Application.DisplayStatusBar 
''//Get the statusbar display setting 

    Application.DisplayStatusBar = True 
''//Make sure that the statusbar is visible 

    For i = 1 To iMax ''// imax is usually 30 or so 
     fractionDone = CDbl(i)/CDbl(iMax) 
     Application.StatusBar = Format(fractionDone, "0%") & " done..." 
     ''// or, alternatively: 
     ''// statusRange.value = Format(fractionDone, "0%") & " done..." 
     ''// Some code....... 

     DoEvents 
     ''//Yield Control 

    Next i 

    Application.DisplayStatusBar = booStatusBarState 
''//Reset Status bar display setting 

    Application.StatusBar = False 
''//Return control of the Status bar to Excel 

    Application.ScreenUpdating = True 
''//Turn on screen updating 

End Sub 
+0

यदि आप इसे प्रत्येक लूप पर करते हैं तो बहुत सारे 'कबूतर' हैं, इसके बजाय यह प्रत्येक 10 या तो करें: 'अगर मैं 10 = 0 संशोधित करता हूं तो Doevents' –

6

उपयोग कर रहा हूँ पाश में DoEvents के लिए एक कॉल रखो।

यह प्रदर्शन को प्रभावित करेगा, इसलिए आप इसे केवल 10 वें पुनरावृत्ति पर कह सकते हैं।
हालांकि, अगर आपके पास केवल 30 है, तो यह शायद ही कोई मुद्दा है।

0

यह सीधे आपके प्रश्न का उत्तर नहीं दे रहा है, बल्कि बस एक विकल्प प्रदान कर रहा है। मुझे कई लंबे एक्सेल गणनाओं में पाया गया है, अधिकांश समय प्रतीक्षा स्क्रीन पर एक्सेल अद्यतन मान है। यदि यह मामला है, तो आप अपने उप के सामने निम्न कोड डालें सकता है:

Application.ScreenUpdating = False 
Application.EnableEvents = False 

और कहा कि इस बार जो भी कोड को गति

Application.ScreenUpdating = True 
Application.EnableEvents = True 

मैंने पाया अंत के रूप में इस डाल मैं इतना काम कर रहा हूं कि उपयोगकर्ता को प्रगति पर सतर्क करना अनावश्यक है। यह आपके लिए प्रयास करने का एक विचार है, और इसकी प्रभावशीलता आपकी शीट और गणनाओं पर काफी निर्भर है।

+0

अच्छी जानकारी ... thx – ZEE

8

वर्कशीट्स में टेक्स्ट बॉक्स कभी-कभी अपडेट नहीं होते हैं जब उनका टेक्स्ट या स्वरूपण बदल जाता है, और DoEvent कमांड मदद नहीं करता है।

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

निम्न कमांड चाल करने के लिए लग रहे हैं:

- ActiveSheet.Calculate  
- ActiveWindow.SmallScroll  
- Application.WindowState = Application.WindowState 
+0

क्या उस समस्या के साथ समस्या थी आज। फॉर्म और शीट अपडेट करना बंद कर दिया। एप्लिकेशन को जोड़ना। विन्डोस्टेट चाल कुछ समस्याओं को हल करता है मेरी समस्या हल हो जाती है। –

+1

'ActiveWindow.SmallScroll डाउन: = 1'' ActiveWindow.SmallScroll अप का उपयोग करने के लिए मेरे लिए काम कर रहा था: = 1' – Hubisan

0

विशेष रूप से, अगर आप एक UserForm साथ काम कर रहे हैं, तो आप रीपेंट विधि का प्रयास हो सकता है। यदि आप अपने फॉर्म में ईवेंट ट्रिगर्स का उपयोग कर रहे हैं तो आपको DoEvents के साथ कोई समस्या आ सकती है। उदाहरण के लिए, फ़ंक्शन चलने के दौरान दबाए गए किसी भी कुंजी को द्वारा भेजा जाएगा DoEvents कुंजीपटल इनपुट को स्क्रीन अपडेट होने से पहले संसाधित किया जाएगा, इसलिए यदि आप कीबोर्ड पर तीर कुंजी को दबाकर स्प्रेडशीट पर सेल्स बदल रहे हैं , तो सेल फ़ंक्शन इवेंट मुख्य फ़ंक्शन समाप्त होने से पहले फायरिंग रखेगा।

कुछ मामलों में उपयोगकर्ताफॉर्म को रीफ्रेश नहीं किया जाएगा, क्योंकि DoEvents ईवेंट को आग लगा देगा; हालांकि, दोबारा उपयोगकर्ताफॉर्म अपडेट करेगा और उपयोगकर्ता स्क्रीन पर हुए बदलावों को तब भी देखेंगे जब भी कोई अन्य ईवेंट पिछली घटना का पालन करता है।

Me.Repaint 
-3

लिखें DoEvents बस लाइन जहां यूआई अद्यतन कर रहे हैं से पहले, यह काम करना चाहिए:

UserForm कोड में यह रूप में सरल रूप में है।

+5

यह उत्तर 4-5 साल पहले लिखे गए अन्य लोगों को क्या महत्व देता है? –