2016-07-08 16 views

答えて

0

を使用してExcelワークブック(.XLS)からすべてのモジュールを削除したい

は(VBAを削除し、他のもの):

import xlrd, xlwt 
from xlutils.copy import copy as xl_copy 
rb = xlrd.open_workbook('/path/to/fin.xls') 
wb = xl_copy(rb) 
wb.save('/path/to/fou.xls') 
+0

*「他のものは削除されます」*は望ましくない可能性があります。少なくとも、それは文書化されていなければなりません。 – IInspectable

+0

良い点、@nsnspectable!他に何が削除されているか調べるためにいくつかの調査をします。 – bernie

+0

他に何が削除されたのかについてのこの質問をご覧くださいhttp://stackoverflow.com/questions/3723793/preserving-styles-using-pythons-xlrd-xlwt-and-xlutils-copy – bernie

0

Pythonのwin23com.clientモジュールでアクセスCOMインターフェイスで利用可能なVBComponents collectionを使用することを検討してください。しかし、特定のワークブック内では、最初にprogrammatic access to the VBA object libraryを付与する必要があります。

また、シート(Type = 100)とワークブック(Type = 100)を含むオブジェクトモジュールを削除できないため、条件付きでタイプを設定する必要があります。標準モジュール(Type = 1)、クラスモジュール(Type = 2)、ユーザーフォーム(Type= 3)、およびその他の挿入コンポーネントのみを削除できます。もちろん、削除するモジュールの定義済みのリストを反復処理することもできます。 Try/Exceptステートメントは、スクリプトが失敗したかどうかにかかわらず、Excel.Applicationプロセスを効果的に終了させるために使用されます。

import win32com.client 

# OPEN EXCEL APP AND WORKBOOK 
xlApp = win32com.client.Dispatch("Excel.Application") 
xlwb = xlApp.Workbooks.Open("C:\\Path\\To\\Workbook.xlsm") 

# ITERATE THROUGH EACH VB COMPONENT (CLASS MODULE, STANDARD MODULE, USER FORMS) 
try:  
    for i in xlwb.VBProject.VBComponents:   
     xlmodule = xlwb.VBProject.VBComponents(i.Name) 
     if xlmodule.Type in [1, 2, 3]:    
      xlwb.VBProject.VBComponents.Remove(xlmodule) 

except Exception as e: 
    print(e) 

finally:  
    # CLOSE AND SAVE AND UNINITIALIZE APP 
    xlwb.Close(True) 
    xlApp.Quit 

    xlApp = None 
+0

非常に興味深い。私は今日まで試され、それがうまくいくと受け入れます - それは私が望んでいたものと正確に見えます。 –

+0

テストで不運?ワークブックにプログラムによるアクセスを許可するようにしてください。 – Parfait

関連する問題