2017-04-03 63 views
1

既存の.xlsxファイルを開き、Visual Basicマクロスクリプトを自動サイズコメントに書き込み、マクロを実行してから、ブックを閉じて保存します。win32com.clientを使用してExcel VBマクロを作成して実行します。

私はwin32com.clientにはあまりよく慣れていません。数時間の掘り下げの後、私はVBマクロスクリプトをPythonから書くための良い文書を見つけられませんでした。したがって、私はこれらのスレッドからのフィードバックを使用してスクリプトを縫い合わせ:ここ

https://stackoverflow.com/a/19506287/7547876

https://stackoverflow.com/a/2141981/7547876

は、私が作ってみたコードの大まかな表現です:

import openpyxl, win32com.client as win32, comtypes, comtypes.client 

class report: 
    def __init__(self,name,dpath,inputs,**kw): 
     self.name=name 
     self.dpath=dpath 
     #ommited scripts builds excel report with openpyxl, then saves it 

     self.xl=win32.gencache.EnsureDispatch('Excel.Application') 
     self.xl.Visible=False 

     self.report=self.xl.Workbooks.Open(dpath+'\\'+self.name+'.xlsx') 
     self.report.Worksheets("Audit Assistant Report").Activate() 

     self.sheet=self.report.ActiveSheet 

     self.xlmodule=self.sheet.VBProject.VBComponents.Add(1) 

     self.excelcode="""Sub FitComments() 
'Updateby20140325 
Dim xComment As Comment 
For Each xComment In Application.ActiveSheet.Comments 
xComment.Shape.TextFrame.AutoSize = True 
Next 
End Sub""" 

     self.xlmodule.CodeModule.AddFromString(self.excelcode) 
     self.report.Run(self.name+'.xlsx!Macro_1') 
     self.report.Close(savechanges=True) 
     self.xl.Quit() 

def main(): 
    #input definitions omitted 
    report("myreport","C:\\somepath\\",inputs) 

if__name__=='__main__': 
    main() 

スクリプトを実行しようとすると、次のトレースバックが生成されます。

Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 473, in __getattr__ 
    raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr)) 
AttributeError: '<win32com.gen_py.Microsoft Excel 14.0 Object Library._Worksheet instance at 0x229316888>' object has no attribute 'VBProject' 

私はPyWin32パッケージをアップデートしようとしましたが、問題ではないと判断しました。

スクリプトを実行して目的の効果が得られるようにするには、スクリプトを変更する必要がありますか?

ご入力いただきありがとうございます。

答えて

1

Sheetオブジェクトには、VBProject属性がありません。ワークブックレベルにありますので、これを使用してください:

self.xlmodule=self.report.VBProject.VBComponents.Add(1) 

希望するものがあります。

+0

これで問題は解決しました。 \ com_error:(-2147352567、 '例外が発生しました。'、(0、u'Microsoft Excel '、Visual Basicプロジェクトへのu'Programmaticアクセスは信頼されていません。 'xlmain11.chm'、0、-2146827284)、なし) –

+2

セキュリティ上の理由から、Excelでは、デフォルトでソフトウェアでVBAモジュールを作成することはできません。デフォルト設定を変更する必要があります。 Excel 2010では、 'Developer'タブに行き、' Macro Security'アイコンをクリックし、 'VBAプロジェクトオブジェクトモデルへのアクセスを信頼する'チェックボックスをチェックします。他のバージョンと同様のものでなければなりません。 – xidgel

+0

非常に感謝しています。私のプログラムは適切なサイズのコメントを書いて、VBAスクリプトが失敗した場合にユーザがそれらのステップに従うべきであることを示唆するメッセージボックスを提供するようになりました。 –

関連する問題