मैं वीबीए से पायथन लिपि कहता हूं। इस पायथन लिपि की संरचना बिना किसी और चीज के एक ही कार्य है:

def myFunction():
    # do stuff
    return stuff_output

मुझे पता है कि यह फ़ंक्शन ठीक से काम करता है, क्योंकि अगर जोड़ा जाता है, तो print(myFunction()) कमांड लाइन में सही आउटपुट (JSON प्रतिक्रिया) उत्पन्न करता है।

मेरे VBA कोड में 'RetVal' हमेशा 4 अंकों का पूर्णांक मान होता है। शायद पायथन फ़ंक्शन भी निष्पादित नहीं किया गया है?

इसे काम करने के लिए कौन सा कोड और मुझे कैसे ठीक करना चाहिए? मैं ऐसे समाधान की सराहना करता हूं जो मेरे वर्तमान कोड के करीब है और यदि संभव हो तो बाहरी पुस्तकालयों के बिना।

Option Explicit

Sub RunPython()

    Dim RetVal
    Dim scriptPath As String

    scriptPath = "C:\Users\Rychu\Desktop\python\myPythonScript.py"
    RetVal = Shell("C:\Python36-32\python.exe" & " " & scriptPath, vbHide)

    If RetVal = 0 Then
        MsgBox "Couldn't run python script!", vbOKOnly
    Else
        Debug.Print RetVal
    End If

End Sub
1
Ryszard Jędraszyk 18 जून 2018, 21:02

1 उत्तर

सबसे बढ़िया उत्तर

मुझे पायथन फ़ंक्शन द्वारा लौटाए गए मान को स्थानांतरित करने का कोई सीधा तरीका नहीं मिला, इसलिए मैंने इसे पायथन परिणाम को डेस्कटॉप पर टेक्स्ट फ़ाइल में सहेजकर और वीबीए के साथ उसी फ़ाइल को पढ़ने + हटाने से संभाला।

महत्वपूर्ण बातें हैं:

  1. shellObj.Run Shell के विपरीत True पर लौटने की प्रतीक्षा करने के लिए एक बूलियन पैरामीटर सेट करने की अनुमति देता है, ताकि शेष वीबीए कोड टेक्स्ट फ़ाइल से डेटा प्राप्त करने का प्रयास न करे, जबकि वहां नहीं है अभी तक कोई भी बनाया गया है।

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

यहाँ मेरा पायथन कोड है:

def myFunction():
    # do stuff
    return stuff_output

import os

f = open(os.path.expanduser("~\Desktop") + "\myTemp.txt","w")   #create a new text file on Desktop in write mode
f.write(str(myFunction()))  #write output to created text file 
f.close()   #close file object

मेरा वीबीए कोड यहां है:

Option Explicit

Sub RunPython()

    Dim shellObj As Object: Set shellObj = CreateObject("WScript.Shell")
    Dim tempTxtPath As String

    Const scriptPath As String = "C:\Users\Rychu\Desktop\python\myPythonScript.py"
    Const pythonPath As String = "C:\Python36-32\python.exe"
    tempTxtPath = CreateObject("WScript.Shell").specialfolders("Desktop") & "\myTemp.txt"

    shellObj.Run pythonPath & " " & scriptPath, vbHide, True

    Debug.Print (getTextAndDelete(tempTxtPath))

End Sub

Function getTextAndDelete(filePath) As String

    Dim fileNum As Long
    Dim myData As String

    fileNum = FreeFile
    Open filePath For Binary As #fileNum

    myData = Space$(LOF(1))
    Get #fileNum, , myData
    Close #fileNum

    Kill filePath

    getTextAndDelete = myData

End Function
1
Ryszard Jędraszyk 19 जून 2018, 01:11