2011-12-23 7 views
7

मैं एक्सेल-वीबीए में Please Wait संदेश बनाने की कोशिश कर रहा हूं। यह उपयोगकर्ता को एसक्यूएल क्वेरी को संसाधित करने की याद दिलाता है कि प्रक्रिया अभी भी चल रही है।एक्सेल वीबीए "कृपया प्रतीक्षा करें" पॉप-अप संदेश

मैं यह संदेश उपयोगकर्ताform में प्रदर्शित करना चाहता हूं।

वर्तमान में, उपयोगकर्ता एसक्यूएल डीबी से कनेक्ट होता है, डीबी और कुछ अन्य विकल्प चुनता है, प्रेस दबाता है ... और फॉर्म अनलोड नहीं होता है। गो पॉइंट पर मेरे पास एक और फॉर्म है जो संदेश Please Wait के साथ पॉप अप करता है, लेकिन यह फॉर्म अनलोड नहीं होता है, यानी sql execute कमांड नहीं चलाता है।

Please Wait userform बुला, एक लेबल सहित के लिए मेरे कोड: एक और कोड मॉड्यूल में

Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow 
    SQl.Execute 
    Call KillWait 

मेरे पास है:

Private Sub UserForm_Activate() 
Call PleaseWait 
End Sub 

Sub PleaseWait() 
Wait.Label1.Caption = "Calculating...Please Wait!" 
End Sub 
:

Sub WaitShow() 
    Wait.Show 
    End Sub 

    Sub KillWait() 
    Unload Wait 
    End Sub 

मैं userform निम्न कोड के साथ wait कहा जाता है

अब कोड निष्पादित करते समय, रन-टाइम करें तों निम्नलिखित को निष्पादित करने के लिए मॉड्यूल के माध्यम से वापस ले जाने के लिए नहीं:

SQl.ExecuteSQl.Execute 

मैं स्थिति बार के साथ कार्यक्रम की प्रगति दिखा सकते हैं, लेकिन एक userform संदेश पॉप अप इस कार्यक्रम के लिए बहुत उपयोगी होगा।

उत्तर

6

फॉर्म का डिफ़ॉल्ट व्यवहार फॉर्म शो शो मोड को एक मॉडल संवाद के रूप में दिखाने के लिए है। क्या आप देख रहे हैं प्रणाली का डायलॉग बॉक्स है, तो आप यह है कि निर्दिष्ट करने की आवश्यकता इस तरह:

Sub WaitShow() 
    Wait.Show vbModeLess 
End Sub 

अद्यतन:

आप उपयोगकर्ता नहीं प्रणाली का डायलॉग, आप अन्य विकल्प हैं कर सकते हैं, के रूप में एक टिप्पणी में उल्लेख किया। उनमें से एक प्रतीक्षा उपयोगकर्ता को एसक्यूएल निष्पादन करने देना है। यह इस तरह किया जा सकता है:

इंतजार रूप में, पहले चर

Private mySomeParameter1 As String 
Private mySomeReturnValue1 As String 

'Input parameters to the form 
Public Sub Init(ByVal some_parameter1 As String, ...) 
... Initialize your SQL, NOT execute it 
End Sub 

'Output values from the from 
Public Sub GetReturns(ByRef some_return_value1 As String, ...) 
... set the output parameters... 
End Sub 

'Do the work 
Private Sub UserForm_Activate() 
    Call PleaseWait 
    'Either call DoEvents or a manual Refresh to let the label display itself 
    Call ExecutSQL ' A function that executes the SQL 
    Unload Me 
End Sub 

घोषित और मुख्य रूप में:

Sub WaitShow() 
    Wait.Init(the parameters...) 
    Wait.Show 
    Wait.GetReturns(the results...) 
End Sub 

फिर भी आप के लिए एक और विकल्प प्रतीक्षा छोड़ होगा पूरी तरह से फॉर्म बनाएं और इसके बजाय मुख्य स्वरूप पर "प्रतीक्षा" छवि दिखाएं और SQL प्रसंस्करण होने पर इसे छुपाएं।

+0

उत्तर जीटीजी के लिए धन्यवाद। मैंने पहले से ही कोशिश की है और इसे प्राप्त करें: मोडल फॉर्म प्रदर्शित होने पर गैर-मोडल फॉर्म नहीं दिखाया जा सकता है। – Fwafa

+0

इसके अलावा, मैं यह उल्लेख करना भूल गया कि उपयोगकर्ता पहला विकल्प चुनता है जहां उपयोगकर्ता विकल्प चुनते हैं। – Fwafa

+1

अपना पहला फॉर्म मानने के लिए मोडल होना आवश्यक है, तो आप या तो "प्रतीक्षा" उपयोगकर्ताफॉर्म के अंदर अपना SQL निष्पादन कोड डाल सकते हैं या "प्रतीक्षा" उपयोगकर्ता प्रारूप से मूल रूप में फ़ंक्शन को कॉल कर सकते हैं। इस तरह आपको किसी भी अतिरिक्त मॉड्यूल की आवश्यकता नहीं है। एक तीसरा विकल्प "प्रतीक्षा" फ़ॉर्म के लिए ActiveX .exe बनाना होगा और उस प्रक्रिया को मॉडलिंग "प्रतीक्षा" फ़ॉर्म दिखाएगा। हालांकि, आपको इसकी एक्सेल शीट के साथ उस .exe को तैनात करने की आवश्यकता होगी। – GTG

1

यहाँ एक प्रगति बार दिखाने का तरीका बताया गया कि आपके उपयोगकर्ता इंतजार कर रहे हैं, जबकि एक्सेल समाप्त करने के लिए के लिए प्रसंस्करण:

https://stackoverflow.com/a/10791349/138938

Excel progress bar

आपके मामले में, आप के लिए एक उचित "औसत" समय अनुमान लगा सकते हैं आपके प्रश्न और उस समय के प्रतिशत के साथ प्रगति बार अपडेट है, जो आपके उपयोगकर्ताओं को आश्वस्त करेगा कि एक्सेल काम कर रहा है और उन्हें घबराहट करने की आवश्यकता नहीं है।

0

मेरा समाधान दूसरों की तुलना में बहुत कम सुरुचिपूर्ण और प्रभावशाली है। एफवाईआई, मेरी लिपि एक फोरम के भीतर कई भागीदारों के लिए प्रसंस्करण कर रही है ...अगला लूप, और मैं वर्तमान में संसाधित होने वाले साझेदार के साथ स्क्रीन अपडेट करना चाहता हूं।

मैंने "संदेश" नामक वर्कशीट टैब बनाया है। मैंने सेल ए 1 को चौड़ा और लंबा विस्तार किया जितना मैं कर सकता था, और मैंने एक फ़ॉन्ट चुना जो मुझे एक रंग योजना पसंद आया जिसे मुझे पसंद आया। मेरी स्क्रिप्ट ScreenUpdating बंद करके शुरू होता है। मैं फिर

Sheets("Messages").Select 
Cells(1, 1).Value = "Processing " & Partner 
Application.ScreenUpdating = True 
Application.ScreenUpdating = False 

इसके बाद, मैं जो भी शीट चाहता हूं उसे वापस लौटाता हूं। कुछ भी कल्पना नहीं है, लेकिन यह तेज़, आसान है, और जो मुझे चाहिए वह करता है। :)

0

मैं प्रपत्र एक बहुत छोटे आकार, छिपा हुआ जब शीर्षक के साथ प्रपत्र लोड हो जाए, करने के लिए सेट पर एक आदेश बटन का उपयोग करें "कृपया प्रतीक्षा करें, प्रसंस्करण ..."

मैं रूप में बटन का आकार परिवर्तन Iniliatlise घटना (मैं बस शीर्ष, बाएं, चौड़ाई & ऊंचाई गुणों का उपयोग कर फार्म आकार में आकार बदलते हैं)। आप निश्चित रूप से इसे जो भी आकार पसंद कर सकते हैं उसे बना सकते हैं।

मैं अपने समय लेने वाले कोड & से पहले कमांड बटन को कोड के अंत में फिर से छुपाता हूं।

कुछ "DoEvents" की आवश्यकता है, लेकिन पूरी तरह से काम करता है।