2013-10-21 135 views
5

這可能有點延伸,但是有可能使用pythonwin或任何其他模塊使用python腳本在MS Excel(或任何其他使用VBA的MS Office產品)中創建VBA。使用Python編寫VBA腳本?

這個想法來自何處pythons openpyxl模塊無法做列autowidth。我在內存中創建了一個工作簿並最終將其保存到光盤。有幾張紙,每張紙裏面都有很多列。我一直在想....如果我只是使用python將excel中的VBA腳本(保存在記事本中的某處)保存到VBA編輯器中,然後使用pythonwin從python運行該腳本。

喜歡的東西:

Workbooks.worksheets.Columns("A:Z").EntireColumn.Autofit 

您發表評論之前,是的,我已經看到了很多的如何解決自動調整openpyxl列Python的例子,但我看到的是可以利用的功能進行了一些有趣的機會你從VBA中得到的可能無法在Python中使用。不管怎麼說,我在互聯網上挖了一下,我沒有看到任何表明我可以的東西,所以我想我會問。

乾杯, 邁克

+0

是的,您可以使用Python編寫另一種語言的程序,最有可能的是_any_其他語言。 – martineau

+2

如果你打算啓動Excel來運行自動適應,你可以通過自動化創建整個事情。那麼你將不必做動態代碼生成... –

+0

即使這個問題有點塵土飛揚,也許這可能有所幫助:https://www.pyxll.com/docs/macros.html – AnyOneElse

回答

5

是的,這是可能的。你可以開始研究如何從VB上生成一個VBA宏that Microsoft KB

下面的Python代碼演示瞭如何執行相同的操作;它是KB的代碼示例上半年的基本端口:

import win32com.client as win32 

import comtypes, comtypes.client 

xl = win32.gencache.EnsureDispatch('Excel.Application') 
xl.Visible = True 
ss = xl.Workbooks.Add() 
sh = ss.ActiveSheet 

xlmodule = ss.VBProject.VBComponents.Add(1) # vbext_ct_StdModule 

sCode = '''sub VBAMacro() 
     msgbox "VBA Macro called" 
     end sub''' 

xlmodule.CodeModule.AddFromString(sCode) 

你可以看一下可見自動化Excel宏,你會看到上面定義的VBAMacro

+0

我有機會今天嘗試和測試代碼。非常感謝您的貢獻。這使我朝着正確的方向邁進。我有很多其他的想法,這個代碼可以幫助。 – Mike

+0

@歡迎你 – Boud

+0

我想知道。我在我的代碼中使用了openpyxl,我不想改變它。我在想,我可以運行所有代碼並創建工作簿並將其保存到光盤。有沒有什麼辦法可以在我的代碼末尾抓取工作簿,並使用win32運行代碼並在該子進程中添加?我努力用win32打開現有的Excel表格,而不是像上面那樣使用EnsureDispatch打開實例。 – Mike