2013-01-07 27 views
5

मेरे पास एक एप्लिकेशन ऑब्जेक्ट के साथ ऐड-इन है। वस्तु के साथ घोषित किया गया है। जब भी उपयोगकर्ता फ़ाइल सहेजता है, तो यह मुझे कुछ डेटा पॉइंट्स को केंद्रीय डेटाबेस में फ्लश करने में सक्षम बनाता है। यह ज्यादातर समय काम करता है। हालांकि, एक ऐसा उपयोगकर्ता है जो Excel एप्लिकेशन को छोड़ देता है, जो सहेजें संवाद बॉक्स को कॉल करता है। ऐसा प्रतीत होता है कि एक सहेजी गई फ़ाइल के साथ Excel को छोड़ने का अर्थ है कि वर्कबुक BforeforeSave ईवेंट आग नहीं करता है।एक्सेल वीबीए - वर्कबुकबेयरसेव इवेंट

बस जोर देने के लिए, मैंने पुष्टि की है कि जब उपयोगकर्ता CTRL-S को दबाता है, या सहेजने वाला बटन दबाता है तो ईवेंट आग लगती है। मैंने यह भी पुष्टि की है कि अगर मैं आवेदन छोड़ देता हूं तो घटना आग नहीं लगती है।

मैं कुछ कामकाज के बारे में सोच सकता हूं (उदाहरण के लिए प्रत्येक 10 सेकंड स्वचालित रूप से सहेजता है), लेकिन मैं इसके बारे में पागल नहीं हूं। क्या कोई इस व्यवहार की पुष्टि कर सकता है और/या किसी के पास कोई उपाय है?

Option Explicit 

Private WithEvents mapp As Excel.Application 

Private Sub mapp_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) 

    ' Sanity preservation device 
    Msgbox "WorkbookBeforeSave event fired." 
    SaveSomeData Wb 

End Sub 
+0

तो क्या घटना पूरी तरह से आग लगती है? शायद आप यह सुनिश्चित करना चाहते हैं कि 'application.enableEvents = True' – Larry

+0

हां, अगर मैं CTRL-S का उपयोग करके कार्यपुस्तिका को सहेजता हूं या रिबन में सेव बटन दबाता हूं तो ईवेंट आग लगती है। हालांकि, अगर मैंने एक्सेल (एएलटी-एफ 4) छोड़ दिया है, तो मुझे फ़ाइल को सहेजने के लिए कहा जाएगा, लेकिन वर्कबुकबेयरसेव घटना को निकाल दिया नहीं जाएगा। यदि ऑनक्यूइट या एप्लिकेशन ऑब्जेक्ट के लिए कुछ ऐसी चीज थी, तो मैं इसका उपयोग करूंगा। हालांकि, मुझे ऐसा कुछ नहीं दिख रहा है। – PirateGrunt

उत्तर

2

क्या आपने पहले क्लोज़ से पहले उपयोग करने पर विचार किया है? यह एक बेहतर विकल्प हो सकता है।

5

आप Workbook_BeforeClose दिनचर्या और वर्कबुक ऑब्जेक्ट की Saved संपत्ति का उपयोग कर सकते हैं।

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If ThisWorkbook.Saved = False Then 
     'Call save function 
    End If 

End Sub 
+0

दुर्भाग्यवश, मैं पहले क्लोज़ ईवेंट का उपयोग नहीं कर सकता। यहां कुछ और पृष्ठभूमि है: जब मैं यहां पहुंची, वहां सैकड़ों एक्सेल फाइलें थीं जो समान कोडिंग कम या कम थीं, लेकिन प्रत्येक ग्राहक के लिए एक अलग फ़ाइल थी। जानकारी के लिए उन फ़ाइलों को खनन करने की कोशिश में, मैंने एक ऐड-इन बनाया जो एक एक्सेस डीबी में डेटा लिखता था। पहले क्लोज़ का उपयोग करने के लिए, मुझे उस घटना को सैकड़ों कार्यपुस्तिकाओं में जोड़ना होगा। ओह। एक अतिरिक्त समस्या यह है कि कार्यपुस्तिकाएं काफी हद तक बड़ी हैं, लगभग 15 एमबी प्रत्येक। अगर मैं उनमें से दस खोलता हूं, तो मैं स्मृति से बाहर चला जाता हूं। हम अब विरासत को साफ करने के लिए अलग-अलग आगे बढ़ेंगे। – PirateGrunt

+0

एक चिपचिपा स्थिति की तरह लगता है कि आप वहां जा रहे हैं! सुनिश्चित करें कि आप इस सवाल के लिए सब कुछ जोड़ते हैं, मैं व्यक्तिगत रूप से एक साफ समाधान के बारे में नहीं सोच सकता लेकिन अन्य लोग सक्षम हो सकते हैं। शुभकामनाएँ। –