2012-06-14 13 views
14

मैं कैसे पर मैक OSX VBA का उपयोग कर एक bash फ़ाइल चला सकते हैं कॉल करने के लिएकैसे VBA (एक्सेल) से एक बैश स्क्रिप्ट

मैं निम्नलिखित कोड

location = FolderPath(ThisWorkBook.FullName) 

जो वर्तमान निर्देशिका शून्य से फ़ाइल रिटर्न की कोशिश की नाम।

द्वारा

Shell(location &"runmybatch.sh") 

मैं ऐसा किया क्योंकि पार्टी स्क्रिप्ट एक्सेल स्प्रेडशीट के रूप में एक ही फ़ोल्डर के भीतर स्थित है पीछा किया।

+1

क्या यह प्रश्न http://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac –

+0

स्थान के बीच "\" char शामिल करने की आवश्यकता नहीं है, लिपि का नाम? सौभाग्य। – shellter

+2

"शैल" कमांड को ':' अलग पथ की आवश्यकता होती है, हालांकि यह समस्या नहीं है। मैंने एक्सेल वर्कबुक के समान निर्देशिका में, मोड 755 के साथ एक बैश खोल फ़ाइल को इंगित करने वाले पूरी तरह से योग्य पथ के साथ एक सरल शेल कॉल की कोशिश की है, और मुझे हमेशा अनुमति अस्वीकार कर दी जाती है। यह एक बहुत ही आसान चीज की तरह लगता है लेकिन मैं इसे काम नहीं कर सकता, या तो। –

उत्तर

1

मैंने फ़ोल्डरपाथ कमांड का उपयोग नहीं किया, ऐसा लगता है कि यह मेरे लिए उपलब्ध नहीं है, इसलिए मैं बाद में जांच नहीं करूंगा क्यों नहीं। नीचे कुछ नमूना कोड है जिन्हें मैंने यह सुनिश्चित करने के लिए परीक्षण किया है कि ओएसएक्स एक्सेल से .sh फ़ाइल चलाने के लिए संभव है।

.sh फ़ाइल मैं परीक्षण के लिए इस्तेमाल किया मेरे डेस्कटॉप पर रखा गया था और केवल निम्न पंक्ति में शामिल हैं: "खुला /Applications/Calculator.app"

VBA कोड पर OSX है एक्सेल से .sh आह्वान करने के लिए नीचे:

Dim DesktopFolder As String 
DesktopFolder = MacScript("return (path to desktop folder) as string") 

Dim ScriptFile As String 
ScriptFile = DesktopFolder & "test.sh" 

RetVal = Shell(ScriptFile, vbNormalFocus) 

मैं अगर जाँच करने का निर्णय लिया इसके केवल कुछ फ़ोल्डरों पर कार्यात्मक तो मैं/tmp फ़ोल्डर में .sh फ़ाइल चले गए और फ़ाइल को कार्यान्वित नहीं कर सकता है, बस हो गया "फ़ाइल नहीं मिला त्रुटि" चाहे कितना मैंने पथ को एन्कोड किया। अंत में एहसास हुआ कि ओएसएक्स पर/tmp फ़ाइल एक प्रतीकात्मक लिंक है जो/private/tmp पर मैप करता है और जब मैंने उस पथ का उपयोग किया तो यह सब ठीक काम करने लगता है।

Dim ScriptFile As String 
ScriptFile = "Macintosh HD:private:tmp:test.sh" 
RetVal = Shell(ScriptFile, vbNormalFocus) 

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

0

मेरे पास मैक के लिए एमएस ऑफिस स्थापित नहीं है, इसलिए मैं प्रस्तावित उत्तर का परीक्षण नहीं कर सकता। मुझे लगता है कि बाश को बाइनरी (यानी/bin/bash) को कॉल करना संभव है और उस स्क्रिप्ट का नाम पास करना चाहिए जिसे आप तर्क के रूप में निष्पादित करना चाहते हैं। यह अनुमति बिट्स के साथ किसी भी मुद्दे से बच जाएगा, और यह सुनिश्चित करेगा कि दूसरे तर्क के लिए पथ का नाम सामान्य यूनिक्स-शैली/अलग-अलग है। पहले तर्क के लिए, किसी भी पथ के बिना, इसके नाम से बैश को कॉल करने के लिए पर्याप्त हो सकता है, क्योंकि इसे पैथ पर्यावरण चर का उपयोग करना चाहिए।

कुल मिलाकर, और अभी भी परीक्षण के बिना, मैं यह कोशिश करेंगे:

Shell("bash runmybatch.sh") 

या, कि अगर गलत कार्यशील निर्देशिका की वजह से काम नहीं करता है,

Shell("bash '" & location & "/runmybatch.sh'") 

जहां स्थान है/कार्यपुस्तिका की निर्देशिका के लिए अलग पथ। Sngle उद्धरण पथ में किसी भी रिक्त स्थान या अन्य विदेशी पात्रों का ख्याल रखना चाहिए।

3

कुछ आश्चर्यजनक हैं जो इस मुश्किल को बनाते हैं!

  1. शैल समारोह उम्मीद रास्तों द्वारा अलग किया जा रहा: अपने कार्यशील निर्देशिका के रूप में नहीं /
  2. जब स्क्रिप्ट चलता है, यह जड़ होगा (/) निर्देशिका,

इसके अलावा आप शैल कमांड का उपयोग करके एक बैश स्क्रिप्ट चलाने में सक्षम होना चाहिए। शुरू करने के लिए यहां चरण-दर-चरण निर्देश दिए गए हैं।

  • अपने डेस्कटॉप निर्देशिका और नाम यह test.sh में निम्नलिखित बैश स्क्रिप्ट बनाएं:
#!/bin/bash 
open /Applications/Calculator.app/ 
  • यकीन test.sh निष्पादन योग्य है (एक टर्मिनल से खिड़की, chmod + x test.sh)
  • ru ru इसे nning (टर्मिनल में ./test.sh टाइप करें)। कैलक्यूलेटर ऐप दिखाना चाहिए। उस से बाहर निकलें।
  • एक्सेल चलाएं और एक नई कार्यपुस्तिका बनाएं, कार्यपुस्तिका
  • सहेजें एक मैक्रो-सक्षम कार्यपुस्तिका
  • भागो वीबी के रूप में डेस्कटॉप निर्देशिका में इस खाली कार्यपुस्तिका: उपकरण> मैक्रो> दृश्य मूल संपादक
  • तत्काल खिड़की नहीं दिखा रहा है, देखें> तत्काल खिड़की
  • तत्काल खिड़की में, निम्न लिखें VBA कोड:
Shell ActiveWorkbook.Path & ":test.sh" 
  • कैलकुलेटर अनुप्रयोग चलाने चाहिए।
2

मैं शेल कमांड के साथ कोई किस्मत थी, लेकिन यहाँ क्या applescript के माध्यम से मेरे लिए काम किया एक्सेल 2011 में बताया गया है:

script_s = "do shell script ""/Users/user/path/to/script/rubyscript_09.rb""" 
MacScript script_s 

मैंने पाया यह आवश्यक स्क्रिप्ट '#!/usr/bin/env ruby' की एक कुटिया का उपयोग करने के लिए (के बाद रूबी संस्करण प्रबंधक)

एक फ़ाइल बुला फ़ाइल फ़ोल्डर का एक सबफ़ोल्डर में है कि पता करने के लिए की स्थापित करते हैं, इस का उपयोग करें:

FilePathName_s = ThisWorkbook.Path & ":subfolder:filename" 

यह : के साथ एक पथ देता है, जो मुझे लगता है कि do shell script के लिए / पर परिवर्तित होना चाहिए।यह ऐप्पलस्क्रिप्ट, quoted form of POSIX path of FilePathName_s के साथ किया जा सकता है, या वीबीए FilePathName_s = "/" & Replace(FilePathName_s, ":", "/")

1

मुझे अपनी सरल बैश स्क्रिप्ट को काम करने में भी परेशानी हो रही थी, भले ही मेरे पास वैश्विक पथ (/ usr/bin) पर था और सभी उपयोगकर्ताओं के पास अनुमतियां पढ़ें और निष्पादित करें। दो चीजों ने मेरी स्क्रिप्ट को असफल कर दिया: ऐप्पलस्क्रिप्ट पर्यावरण और मेरे उपयोगकर्ता के बैश पर्यावरण के बीच मतभेदों के कारण अनुमतियां और पथ। मुझे अपनी समस्या को हल करने में VBA Shell function in Office 2011 for Mac पर अधिक चर्चा मिली। अंततः प्रक्रिया जिस पर मैं बस गया था।

क्योंकि एक्सेल अंतर्निहित विवरण मास्किंग था, मैं AppleScript संपादक है, जो उम्मीद है कि व्यर्थ एक्सेल त्रुटियों मैंने देखा की तुलना में अपने समस्या निवारण के दौरान बेहतर जानकारी देता है उपयोग करने की अनुशंसा:

  1. उपयोग AppleScript संपादक स्क्रिप्ट कि पुष्टि करने के लिए

    1. स्पॉटलाइट में, "applescript संपादक" टाइप जब तक यह पता चलता है शुरू करने और फिर इसे
    2. पर क्लिक करें: वास्तव में जो कुछ भी उपयोगकर्ता के रूप में और साथ जो कुछ भी वातावरण चर इस्तेमाल किया जा करने के लिए होता काम करता है
    3. एक नया AppleScript संपादक फ़ाइल
    4. दोहरे उद्धरण चिह्नों को दोगुना करने के बिना नई फ़ाइल में अपने सरल स्क्रिप्ट टाइप बनाएँ - मेरा पढ़ता

      do shell script "parseCsvAndOpen.sh" 
      
    5. अपनी स्क्रिप्ट
    6. ट्रैक के लिए मारो "रन" बटन दबाए कोई समस्या, बदलाव करें, और जब तक आप इसे AppleScript Editor
      • से अच्छी तरह से निष्पादित करने के लिए "रन" बटन पर दोबारा दोहराएं, तो अच्छी खबर यह है कि आपके पास एक संक्षिप्त खोज है यदि आप मदद ;-)
  2. अब अपनी VBA को AppleScript संपादक से अपने सरल स्क्रिप्ट कॉपी के लिए StackOverflow या गूगल के लिए वापस जाओ और इस बात की पुष्टि यह अभी भी काम करता है

    1. मैं करने में सक्षम था की जरूरत है बस अपना दोहरे उद्धरण चिह्नों को दोगुना और MacScript कोड के बाद दोहरे उद्धरण चिह्नों में रख:

      MacScript "do shell script ""parseCsvAndOpen.sh""" 
      

      वास्तव में एक है कि, दो, और फिर तीन दोहरे qu ओटी अक्षर! (संभवतः दोहरे उद्धरण चिह्नों से बचने)

0

आप अपने VBA मैक्रो में निम्न आदेश लिखना है क्या करने की जरूरत:

Shell "C:Path\to\script\location\script.sh" 

(पथ आसपास डबल कोट्स शामिल करना न भूलें)

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

+0

जो ओएसएक्स पर काम नहीं करेगा – ekkis

1

पहले, जोएल का उत्कृष्ट ट्यूटोरियल मेरे लिए काम नहीं करता था (ओएस एक्स 10.11.6 और मैक 2011 के लिए एक्सेल)।कुछ सुस्त होने के बाद, मैंने पाया कि मेरी समस्या मेरी स्क्रिप्ट फ़ाइल में "विस्तारित विशेषताओं" के कारण हुई थी, test.sh. टर्मिनल में, ls -l test.sh पैदावार:

[email protected] 1 tgk staff 456 Mar 16 13:12 test.sh 

ध्यान दें कि "@" विस्तारित फ़ाइल विशेषताओं की उपस्थिति का संकेत। अधिक जानकारी ls [email protected] test.sh, जो पैदावार लागू द्वारा दिया जाता है:

[email protected] 1 tgk staff 456 Mar 16 13:12 test.sh 
     com.apple.FinderInfo 32 
     com.apple.TextEncoding  15 

दूसरे शब्दों में, कैसे फ़ाइल बनाया गया था, यह या विस्तारित गुण नहीं हो सकता है पर निर्भर करता है। इसलिए मैंने विस्तारित विशेषताओं को xattr -c test.sh के माध्यम से हटा दिया, और फिर जोएल का कॉल: Shell ActiveWorkbook.Path & ":test.sh" पूरी तरह से काम किया! सभी को बहुत धन्यवाद।

____

मैं बाद में पता चला कि विस्तारित गुण लिखे बिना खोल स्क्रिप्ट बचत पहले टर्मिनल में defaults write com.barebones.textwrangler WriteExtendedAttributes never लागू द्वारा TextWrangler में संभव है। हालांकि, यह केवल com.apple.FinderInfo विशेषता के अतिरिक्त को रोकता है; com.apple.TextEncoding विशेषता बनी हुई है। सौभाग्य से, हालांकि, जोएल का वीबीए स्क्रिप्ट कमांड अब काम करता है जब शेल स्क्रिप्ट में com.apple.TextEncoding विस्तारित विशेषता है! तो, TextWrangler मेरे लिए संपादक है!