2013-06-19 9 views
12

में मैक्रोज़ इंजेक्ट करने के लिए पायथन का उपयोग करें मुझे एक मैक्रो मिला है कि मैं मौजूदा स्प्रेडशीट का उपयोग करने के लिए एक गुच्छा चाहता हूं। एकमात्र समस्या यह है कि इतने सारे स्प्रेडशीट हैं कि हाथ से ऐसा करने में बहुत समय लगेगा!स्प्रेडशीट्स

मैं pyWin32 का उपयोग कर की जरूरत फ़ाइलों तक पहुँचने की Python स्क्रिप्ट लिखा है, लेकिन मैं में मैक्रो जोड़ने के लिए इसका इस्तेमाल करने का उपाय खोजा नहीं कर पा रहे।

ऐसा ही एक सवाल यहाँ यह जवाब दिया (यह अजगर नहीं है, लेकिन ऐसा लगता है कि यह अभी भी COM का उपयोग करता दिखता है), लेकिन मेरी कॉम वस्तु एक सदस्य VBProject कहा जाता है प्रतीत नहीं होता: Inject and execute Excel VBA code into spreadsheet received from external source

: समान प्रश्न संदर्भित के लिए लिंक:

Set objExcel = CreateObject("Excel.Application") 
objExcel.Visible = True 
objExcel.DisplayAlerts = False 
Set objWorkbook = objExcel.Workbooks.Open("C:\scripts\test.xls") 
    Set xlmodule = objworkbook.VBProject.VBComponents.Add(1) 
    strCode = _ 
    "sub test()" & vbCr & _ 
    " msgbox ""Inside the macro"" " & vbCr & _ 
    "end sub" 
    xlmodule.CodeModule.AddFromString strCode 
objWorkbook.SaveAs "c:\scripts\test.xls" 
objExcel.Quit 

संपादित करें

मैं यह भी उल्लेख करना भूल गया कि हालांकि यह पायथन नहीं है, मैं उम्मीद कर रहा था कि इसी तरह के ऑब्जेक्ट सदस्य COM ऑब्जेक्ट्स के माध्यम से मेरे लिए उपलब्ध होंगे।

+0

"यहां एक समान प्रश्न ने यह जवाब दिया" एक लिंक यहां गायब है, है ना? –

+2

अच्छी तरह से शुरू करने के लिए, आपका उदाहरण कोड पायथन भी नहीं है; मुझे यकीन है कि यह विजुअल बेसिक है। –

+1

मैंने अपने प्रश्न में संशोधन किया है! –

उत्तर

7

यह कोड परिवर्तित है। आप या तो win32com या comtypes पैकेज का उपयोग कर सकते हैं।

import os 
import sys 

# Import System libraries 
import glob 
import random 
import re 

sys.coinit_flags = 0 # comtypes.COINIT_MULTITHREADED 

# USE COMTYPES OR WIN32COM 
#import comtypes 
#from comtypes.client import CreateObject 

# USE COMTYPES OR WIN32COM 
import win32com 
from win32com.client import Dispatch 

scripts_dir = "C:\\scripts" 
conv_scripts_dir = "C:\\converted_scripts" 
strcode = \ 
''' 
sub test() 
    msgbox "Inside the macro" 
end sub 
''' 

#com_instance = CreateObject("Excel.Application", dynamic = True) # USING COMTYPES 
com_instance = Dispatch("Excel.Application") # USING WIN32COM 
com_instance.Visible = True 
com_instance.DisplayAlerts = False 

for script_file in glob.glob(os.path.join(scripts_dir, "*.xls")): 
    print "Processing: %s" % script_file 
    (file_path, file_name) = os.path.split(script_file) 
    objworkbook = com_instance.Workbooks.Open(script_file) 
    xlmodule = objworkbook.VBProject.VBComponents.Add(1) 
    xlmodule.CodeModule.AddFromString(strcode.strip()) 
    objworkbook.SaveAs(os.path.join(conv_scripts_dir, file_name)) 

com_instance.Quit() 
+0

मदद के लिए धन्यवाद! बस पूरी तरह से होने के लिए, मुझे "एक्सेल विकल्प" -> "ट्रस्ट सेंटर" टैब -> "ट्रस्ट सेंटर सेटिंग्स ..." -> मैक्रो सेटिंग्स टैब में "वीबीए प्रोजेक्ट ऑब्जेक्ट मॉड्यूल पर ट्रस्ट एक्सेस" को भी देखना था। इस कोड को चलाने में सक्षम हो। –

3

जैसा कि मैंने भी यह अधिकार प्राप्त करने के लिए कुछ समय के लिए संघर्ष किया, मैं एक और उदाहरण है जो Excel 2007/2010/2013 के xlsm प्रारूप के साथ काम करने के लिए माना जाता है प्रदान करेगा। ऊपर दिए गए उदाहरण में बहुत अंतर नहीं है, यह अलग-अलग फाइलों पर लूपिंग के बिना थोड़ा और सरल है और अधिक टिप्पणियों के साथ। इसके अलावा, पाइथन लिपि में हार्ड-कोडिंग के बजाय मैक्रो का स्रोत कोड टेक्स्टफाइल से लोड किया जाता है।

अपनी आवश्यकताओं के लिए स्क्रिप्ट के शीर्ष पर फ़ाइल पथ को अनुकूलित करना याद रखें।

इसके अलावा, याद रखें कि Excel 2007/2010/2013 केवल प्रारूप में मैक्रोज़ के साथ वर्कबुक स्टोर करने की अनुमति देता है, xlsx में नहीं। xlsx फ़ाइल में मैक्रो डालने पर, आपको इसे एक अलग प्रारूप में सहेजने के लिए कहा जाएगा या मैक्रो फ़ाइल में शामिल नहीं किया जाएगा।

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

फ़ाइल -> विकल्प -> ट्रस्ट सेंटर -> ट्रस्ट सेंटर सेटिंग्स -> मैक्रो सेटिंग्स ->Trust access to the VBA project object model पर चेकमार्क सक्रिय करें।

# get directory where the script is located 
_file = os.path.abspath(sys.argv[0]) 
path = os.path.dirname(_file) 

# set file paths and macro name accordingly - here we assume that the files are located in the same folder as the Python script 
pathToExcelFile = path + '/myExcelFile.xlsm' 
pathToMacro = path + '/myMacro.txt' 
myMacroName = 'UsefulMacro' 

# necessary imports 
import os, sys 
import win32com.client 

# read the textfile holding the excel macro into a string 
with open (pathToMacro, "r") as myfile: 
    print('reading macro into string from: ' + str(myfile)) 
    macro=myfile.read() 

# open up an instance of Excel with the win32com driver 
excel = win32com.client.Dispatch("Excel.Application") 

# do the operation in background without actually opening Excel 
excel.Visible = False 

# open the excel workbook from the specified file 
workbook = excel.Workbooks.Open(Filename=pathToExcelFile) 

# insert the macro-string into the excel file 
excelModule = workbook.VBProject.VBComponents.Add(1) 
excelModule.CodeModule.AddFromString(macro) 

# run the macro 
excel.Application.Run(myMacroName) 

# save the workbook and close 
excel.Workbooks(1).Close(SaveChanges=1) 
excel.Application.Quit() 

# garbage collection 
del excel 
संबंधित मुद्दे