2016-01-25 58 views
9

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

यह (कुछ) मेरी एक्सेल VBA कोड है:

Sub GenerateReport() ' (Tables, InputDataObj) 
    ' code generating the WordApp object (works!) 

    WordApp.Documents.Add Template:="Brev.dot" 

    ' Getting user information from Utilities.Userinfo macro in Document 
    Call WordApp.Run("Autoexec") ' generating a public variable 
    Call WordApp.Run("Utilities.UserInfo") 
    ' more code 
End sub 

वर्ड VBA Autoexec मॉड्यूल में, एक सार्वजनिक चर user नामित परिभाषित और घोषित किया जाता है। UserinfoUtilities मॉड्यूल से उप user पॉप्युलेट करता है। इन दोनों दिनचर्या वीबीए से किसी भी शिकायत के बिना चलाए जाते हैं। मैं तो मेरे एक्सेल VBA में user चर उपयोग करने में सक्षम होना चाहते हैं, लेकिन मैं निम्न त्रुटि

Compile Error: Variable not yet created in this context.

कैसे मैं Excel VBA में वर्ड VBA चर का उपयोग कर सकते हैं? मैंने सोचा कि यह उतना ही कम था?

संपादित करें: user चर उपयोगकर्ता को Type केवल String विशेषता के साथ परिभाषित किया गया है। प्रतिलिपि बनाई जा रही वर्ड VBA कार्यों कि user चर पॉप्युलेट बिल्कुल संभव है, सिर्फ अधिक काम की तुलना में मैं हालांकि जरूरी हो गया था ...

+0

किसी फ़ंक्शन में 'UserInfo' को चालू करें और उसे एक रिटर्न वैल्यू दें जो एक्सेल –

+0

@MacroMan 'UserInfo' में एक चर के लिए असाइन किया जा सकता है टेम्पलेट्स में बनाया गया है और ऐसा कुछ नहीं है जिसके साथ मैं छेड़छाड़ कर सकता हूं ... – Holene

+0

वैरिएबल –

उत्तर

4

है एक शब्द मॉड्यूल में:

Public Function GetUserVariable() As String '// or whatever data type 
    GetUserVariable = user 
End Function 

एक एक्सेल मॉड्यूल में:

myUser = WordApp.Run("GetUserVariable") 
के रूप में यह user कहा जाता है मुझे लगता है कि यह एक उपयोगकर्ता के बारे में कुछ जानकारी लौटा रहा है -

वैकल्पिक रूप से, आप चर मूल्य को दोहराने के लिए सक्षम हो सकता है , या एक दस्तावेज़ के लेखक। जो मामले में निम्न में से एक हो सकता है कि आप क्या कर रहे हैं के बाद:

'// Username assigned to the application 
MsgBox WordApp.UserName 

'// Username defined by the system 
MsgBox Environ$("USERNAME") 

'// Name of the author of the file specified 
MsgBox CreateObject("Shell.Application").Namespace("C:\Users\Documents").GetDetailsOf("MyDocument.doc", 9) 
+0

क्या यह केवल एक्सेल वीबीए के माध्यम से किया जा सकता है? एक्सेल वीबीए की तरह कुछ वर्ड दस्तावेज़ में मॉड्यूल जोड़ता है, 'उपयोगकर्ता' चर को निष्पादित और वापस कर देता है? – Holene

+1

जब तक आपके पास संरक्षित VBProject ऑब्जेक्ट मॉडल तक पहुंच न हो - जो सुरक्षा कारणों से डिफ़ॉल्ट रूप से अक्षम है। –

+0

मुझे संदेह है कि इन टेम्पलेट्स को कई साल पहले बनाया गया था, मध्य 2000 के शायद। मैं कैसे पुष्टि कर सकता हूं कि यह काम नहीं करेगा? – Holene

3

एक अन्य विकल्प - आप केवल (अपने सार्वजनिक चर सेट करने के बाद) Utilities.UserInfo उप करने के लिए कोड की एक पंक्ति जोड़ सकता है यदि:

ActiveDocument.Variables("var_user") = user 

तो फिर तुम यह Excel में आसानी से बाद में पहुंच सकता है:

Sub GenerateReport() ' (Tables, InputDataObj) 
    ' code generating the WordApp object (works!) 

    'I am assuming your WordApp object is public, as you don't declare it. 
    'Capture the new document object  
    Dim newdoc as Object 
    set newdoc = WordApp.Documents.Add(Template:="Brev.dot") 

    ' Getting user information from Utilities.Userinfo macro in Document 
    Call WordApp.Run("Autoexec") ' generating a public variable 
    Call WordApp.Run("Utilities.UserInfo") 

    'Get and show the value of "user" 
    Dim user as String 
    user = newdoc.Variables("var_user") 
    msgbox, user 
End Sub 

यह मानते हुए किया जाता है कि user एक श्रृंखला है।

संपादित करें: क्योंकि केवल एक्सेल वीबीए पर काम करने की आवश्यकता है, इसलिए मैं निश्चित रूप से स्कॉट और मैक्रोमन द्वारा सुझाए गए दृष्टिकोण की कोशिश करता हूं - यदि संभव हो तो एक्सेल में वर्ड मैक्रोज़ की समान कार्यक्षमता को दोहराना। यह वास्तव में:

मुझे लगता है कि आप पहले से ही मूल टेम्पलेट के एक संपादित प्रतिलिपि, सार्वजनिक फ़ोल्डर में सेट उपयोग करने की संभावना को खारिज कर दिया है ...

completness के लिए, वहाँ एक और संभावना है "ब्रूट फोर्स" द्वारा वीबीप्रोजेक्ट ऑब्जेक्ट मॉडल के बिना वर्ड दस्तावेज़ में वीबीए कोड इंजेक्ट करने के लिए संभव है। यदि आप Word दस्तावेज़ को .zip फ़ाइल के रूप में नामित करते हैं और इसे खोलते हैं, तो आप इसमें \word\vbaProject.bin फ़ाइल देखेंगे। इस फ़ाइल में दस्तावेज़ के लिए वीबीए प्रोजेक्ट है और, सिद्धांत रूप में, कोई इसे संशोधित या प्रतिस्थापित करके वीबीए कोड जोड़ या बदल सकता है।

मैंने कुछ दस्तावेजों को एक दस्तावेज़ से दूसरे दस्तावेज़ में ट्रांसप्लांट करने के लिए बस vbaProject.bin फ़ाइल की प्रतिलिपि बनाकर, और अवधारणा कार्य करता है। यदि आप इस फ़ाइल के बारे में अधिक जानने में रुचि रखते हैं, तो this topic उपयोग किया जा सकता है।

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

+0

मदद कर सकते हैं ध्यान दें कि इस तकनीक के साथ, यदि दस्तावेज़ सहेजा गया है, तो दस्तावेज़ वैरिएबल "var_user" का मान इसके साथ सहेजा गया है और मैक्रोज़ को फिर से चलाने के बिना बाद में अनुमान लगाया जा सकता है बस दस्तावेज़ खोलना और इसके दस्तावेज़ की जांच करना। वैरिएबल संग्रह)। – dnep

+0

यह भी ध्यान दें कि शब्द को खाली मूल्य पर डॉकवायरबल्स सेट करने में कठिनाई होती है; यदि उन्हें हो सकता है तो उन्हें इंगित करने के लिए आपको एक विशेष वर्ण अनुक्रम का उपयोग करना होगा। –

+0

इस विधि का उपयोग करने के लिए यह बिल्कुल प्यारा होगा, लेकिन मैं वर्ड वीबीए को स्पर्श नहीं कर सकता। कोड को अन्य कंप्यूटरों पर भी काम करने की ज़रूरत है, और टेम्पलेट्स सभी उपयोगकर्ताओं के लिए काम पर सेट हैं ... – Holene