2009-04-01 23 views
9

में वर्ड दस्तावेज़ खोलना/सक्रिय करना मुझे उम्मीद है कि एक वीबी/वीबीए विशेषज्ञ मेरी मदद कर सकता है। निम्न पर विचार करें: उपयोगकर्ता Word 2003 में और Normal.dot AutoOpen मैक्रो के भीतर एक दस्तावेज़ खोलता है, हम वर्तमान दस्तावेज़ को देखते हैं, और यदि इसे किसी वेबपृष्ठ पर किसी लिंक पर क्लिक करके खोला गया है, और कुछ अन्य एप्लिकेशन विशिष्ट मापदंड, स्ट्रीम 'प्रतिलिपि' को बंद करने और स्रोत दस्तावेज़ को खोलने (एक साझा ड्राइव पर पाया हम उपयोगकर्ता की पहुंच है मान सकते हैं):वीबीए मैक्रो

Documents.Open origDoc 
Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges 
Documents(origDoc).Activate 

With ActiveDocument 
    ''# Do work 
End With 

मेरे सोचा कि मैं यह सुनिश्चित करें कि मूल Activate कॉल करने के लिए जरूरी था दस्तावेज़ ActiveDocument था, लेकिन मुझे .Activate कॉल पर 4160 'खराब फ़ाइल नाम' त्रुटि मिल रही है। अगर मैं .Activate पर कॉल पर टिप्पणी करता हूं, तो ऐसा लगता है कि ActiveDocument मूल दस्तावेज़ पर सेट है, भले ही अन्य दस्तावेज़ पहले ही खोले गए हों (मुझे सच में यकीन नहीं है कि दस्तावेज़ संग्रह कैसे प्रबंधित किया जाता है, और कैसे Word निर्धारित करता है कि अगला ActiveDocument क्या होगा यदि आप वर्तमान सक्रिय दस्तावेज़ को प्रोग्रामेटिक रूप से बंद करते हैं)

तो, दस्तावेज़ पर .Open पर कॉल करने से दस्तावेज़ को ActiveDocument स्पष्ट रूप से सेट किया गया है? साथ ही, पहले से सक्रिय दस्तावेज़ पर .Activate पर कॉल करने से त्रुटि उत्पन्न होती है?

मैं वास्तव में इसके बारे में अधिक दस्तावेज नहीं ढूंढ पाया है, इसलिए किसी भी सुझाव और अंतर्दृष्टि के लिए अग्रिम धन्यवाद!

Document(origDoc).Activate 

होना चाहिए दस्तावेज़ रों:

+0

संभवतः आप दस्तावेज़ की स्ट्रीम की गई प्रतिलिपि को अपने कोड में ActiveDocument के रूप में प्रबंधित कर रहे हैं। उस दस्तावेज़ ऑब्जेक्ट को अपने कोड की शुरुआत में एक चर के लिए असाइन करना बेहतर होगा और शेष कोड के माध्यम से अपने चर का उपयोग करना बेहतर होगा। जैसा कि दूसरे ने इंगित किया है, आप संभवतः कोड की दूसरी पंक्ति में दस्तावेज़ के गलत संस्करण को बंद कर रहे हैं। जब भी आप इसे खोलते हैं तो "मूल" दस्तावेज़ ऑब्जेक्ट को चर के लिए असाइन करना बुद्धिमान होगा। – robartsd

उत्तर

1

आप यहाँ एक त्रुटि की है।

हां, आप सक्रिय दस्तावेज़ को सक्रिय कर सकते हैं। तब कुछ भी नहीं होता है।

हां, खोला गया दस्तावेज़ सक्रिय हो जाता है। यदि आप सुनिश्चित नहीं हैं, तो Documents.Open(origDoc).Activate का उपयोग करें।

+0

टाइपो को स्पॉट करने के लिए धन्यवाद, दुर्भाग्य से यह केवल मेरी पोस्ट में था, वास्तविक कोड नहीं। यदि आपको खुले दस्तावेज़ को सक्रिय करने की अनुमति है, तो मुझे एक्टिवेट कॉल पर 4160 त्रुटि कैसे मिल रही है? – echoesofspring

+0

उत्पत्ति में वास्तव में क्या होता है? – GSerg

1

आपको पहले स्थान पर ActiveDocument ऑब्जेक्ट का उपयोग नहीं करना चाहिए जब तक कि बिल्कुल जरूरी नहीं है क्योंकि यह बहुत अविश्वसनीय है। वरीय दृष्टिकोण यह होगा:

Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges 

Dim doc as Document 
Set doc = Documents.Open(origDoc)   
With doc 
    'Do work 
End With 
+2

मुझे स्पष्ट रूप से कुछ याद आ रहा है। आप 'ActiveDocument' का उपयोग न करने के लिए कहते हैं, लेकिन आप आगे बढ़ते हैं और इसे अपने कोड नमूने में उपयोग करते हैं? – Sabuncu

-1

खबरदार कि सामना किया जा सकता समस्याओं की एक किस्म देखते हैं कि:

  1. यदि आप फिर से खुल करने के लिए उन्हें बंद करने से एक बार के बाद दस्तावेज़ चाहते हैं .. ..वर्ड/विंडोज फ़ाइल नाम 'रिलीज' नहीं करते हैं और आपको 'फ़ाइल व्यस्त' संदेश मिलता है, या संदेश ' 0 अस्थायी प्रति' बनाते हैं। इस समस्या से निपटने के लिए , मुझे बनाने/सहेजने और के किसी अन्य दस्तावेज के कई संस्करणों को व्यवस्थित करने के लिए मुझे अपने वर्ड अनुप्रयोगों में खुले/हेरफेर करने की विस्तृत प्रणाली विकसित करनी है क्योंकि Office Open/Close/Save विधियां।

  2. .Open विधि

  3. दस्तावेज़ वस्तु की चर्चा करते हुए (नाम डॉक, ऊपर) के साथ ReadOnlyRecommended संपत्ति False करने के लिए सेट का उपयोग कर सकते हैं गंभीर त्रुटियों का कारण यदि आप आश्वासन नहीं है कि doc वस्तु अभी भी मौजूद है इससे पहले कि आप कोशिश करें और इसका इस्तेमाल करें। हमेशा याद रखें, शब्द एक 'खुला' एप्लिकेशन प्लेटफॉर्म है .... और उपयोगकर्ता उन चीजों को कर सकता है जिन्हें आपने पिछली मिलीसेकंड में पर गिनती नहीं की थी। यह सलाह किसी अन्य ऑब्जेक्ट या प्रॉपर्टी के लिए रखती है जो आप Word में हेरफेर करना चाहते हैं।

  4. आप को हटाने या संग्रह के भीतर जाने से पहले आश्वस्त है कि दस्तावेज़ या अन्य ऑब्जेक्ट अभी भी वहाँ है और वैध बिना दस्तावेज़ संग्रह (या किसी अन्य) में हेरफेर करता है, तो आप कर सकते हैं
    प्राप्त 'ढेर अतिप्रवाह' त्रुटियों। विशेष रूप से यदि आप कोशिश करते हैं और .item(1) से शुरू होने वाले संग्रह में ऑब्जेक्ट को बंद/हटाएं। आप पिछले एक से एक संग्रह से आइटम हटाना चाहिए, और याद रखें कि संग्रह idicies और संकेत जब चाहें बदल सकते .add/.remove/.close उन लोगों से आइटम नहीं है।

4

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

सक्रिय दस्तावेज़ के साथ सावधान रहना महत्वपूर्ण है, क्योंकि यह हमेशा स्पष्ट नहीं होता है कि कोड या अन्य जगहों पर कौन से क्रियाएं एक दस्तावेज़ 'सक्रिय' बनाती हैं (मेरे पास कोई प्रमाण नहीं है लेकिन यहां तक ​​कि एक ऑटोओव भी ऐसा कर सकता है)। यदि कोई संदेह है कि आप दस्तावेज़ संग्रह के माध्यम से किसी दस्तावेज़ का जिक्र करना बेहतर कर रहे हैं, हालांकि दस्तावेज़ अब खुला नहीं होने पर त्रुटियों का कारण बन सकता है, और आपको यह सुनिश्चित करने के लिए संग्रह के माध्यम से पुनरावृत्ति करना पड़ सकता है कि दस्तावेज़ है, वास्तव में, खुला। मैं एक्सेल वीबीए के साथ बहुत कुछ चलाता हूं, और वर्ड वीबीए उस संबंध में समान रूप से काम करता प्रतीत होता है।

इसके अलावा, VBA आवेदन वस्तुओं को रिहा बारे में परतदार है। यदि आप सावधान नहीं हैं, तो आप कई विन्डवर्ड प्रक्रियाओं के साथ समाप्त हो जाएंगे, कार्य प्रबंधक में देखने योग्य, भले ही आप उन्हें अपने कोड में बंद करें या छोड़ दें। टास्क मैनेजर में एंड प्रोसेस का चयन करने की प्रक्रिया को अनुकरण करने के लिए मुझे इस कोड के आसपास काम करने के लिए मिला है। यह काम करता है, लेकिन एक बेहतर समाधान होना चाहिए।

+0

वीबीए? आप अस्थिर? मैंने कभी इस तरह के आरोप क्यों नहीं सुना है! – franklin