2013-06-19 27 views
12

Kullanılacak bir sürü e-tabloyu kullanmak istediğim bir makronun var. Tek sorun o kadar çok e-tablo var ki el ile yapmak için çok zaman harcayacak!E-tablolara Makroları Enjekte Etmek için Python Kullan

Ben PyWin32 kullanarak gerekli dosyalara erişmek için bir Python komut dosyası yazdım, ama ben makro eklemek için kullanmak için bir yol bulmaya gibi olamaz. Benzer bir soru burada bu cevabı verdi

(Python değil, ama yine de COM kullanır gibi görünüyor) ama benim COM nesnesi VBProject adlı bir üyeye sahip görünmüyor: Inject and execute Excel VBA code into spreadsheet received from external source

: başvurulan benzer soruya Bağlantı:

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 

DÜZENLEME

Ayrıca, bu olsa da bahsetmeyi unuttum Python değil, benzer nesne üyelerinin COM nesneleri aracılığıyla bana ulaşabileceğini umuyordum.

+0

"Benzer bir soru, bu yanıtı verdi" Burada bir bağlantı eksik, değil mi? –

+2

Başlangıç ​​olarak, örnek kodunuz Python bile değil; Eminim Visual Basic. –

+1

Sorumu değiştirdim! –

cevap

7

Bu, dönüştürülen koddur. win32com veya comtypes paketlerini kullanabilirsiniz.

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

Yardımın için teşekkürler! Sadece kapsamlı olmak için, "Excel Seçenekleri" -> "Güven Merkezi" sekmesindeki "VBA proje nesne modülüne güven erişimi" -> "Güven Merkezi Ayarları ..." -> Makro Ayarları sekmesini de kontrol etmek zorunda kaldım. Bu kodu çalıştırabilmek. –

3

Ben de bu hakkı almak için biraz zaman çabalarken, ben Excel 2007/2010/2013 en xlsm formatı ile çalışmak gerekiyordu başka bir örnek sağlayacaktır. Yukarıda verilen örnekte çok fazla bir fark yoktur, farklı dosyalar üzerinde döngü yapmaksızın ve daha fazla yorumla birlikte sadece biraz daha basittir. Ayrıca, makro'nun kaynak kodu Python betiğinde sabit kodlamak yerine bir metin dosyasından yüklenir.

Komut dosyasının en üstünde bulunan dosya yollarını gereksinimlerinize uyarlamayı unutmayın.

Ayrıca, Excel 2007/2010/2013'ün yalnızca 'da değil, xlsm biçiminde Makrolar ile çalışma kitaplarının depolanmasına izin verdiğini unutmayın. Bir makroyu xlsx dosyasına eklerken, bunu farklı bir biçimde kaydetmeniz istenir veya makro dosyaya dahil edilmez.

Son olarak, Excel'in uygulama dışından VBA kodunu yürütme seçeneğinin etkinleştirildiğini (varsayılan olarak güvenlik nedenleriyle devre dışı bırakılır) kontrol edin, aksi halde bir hata iletisi alırsınız. yüzden, açık Excel yapmak ve

Dosya gidin -> Seçenekler -> Güven Merkezi -> Güven Merkezi Ayarları -> Makro Ayarlar ->Trust access to the VBA project object model üzerinde onay işareti etkinleştirin.

# 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 
İlgili konular