我有一个宏,我想使用一堆现有的电子表格。唯一的问题是电子表格太多了,手工做太费时间了!
我已经编写了一个 Python 脚本来使用 pyWin32 访问所需的文件,但我似乎无法找到使用它来添加宏的方法。
一个类似的问题here给出了这个答案(它不是Python,但看起来它仍然使用COM),但我的COM对象似乎没有名为VBProject的成员:
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
编辑:链接到引用的类似问题:将 Excel VBA 代码注入从外部源接收的电子表格并执行 https://stackoverflow.com/questions/9301354/inject-and-execute-macro-into-spreadsheet-received-from-external-source
我还忘记提及,虽然这不是 Python,但我希望通过 COM 对象可以使用类似的对象成员。
这是转换后的代码。您可以使用win32com http://sourceforge.net/projects/pywin32/%20pywin32 or comtypes http://sourceforge.net/projects/comtypes/?source=dlp%20comtypes包。
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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)