2013-10-21 53 views
5

Điều này có thể hơi căng, nhưng có khả năng là một tập lệnh python có thể được sử dụng để tạo VBA trong MS Excel (hoặc bất kỳ sản phẩm MS Office nào khác sử dụng VBA) bằng pythonwin hoặc bất kỳ mô-đun nào khác.Sử dụng Python để viết VBA Script?

Trường hợp ý tưởng này xuất phát từ các mô-đun pypyon openpyxl không có khả năng thực hiện autowidth cột. Kịch bản mà tôi đã tạo ra một bảng tính trong bộ nhớ và cuối cùng lưu nó vào đĩa. Có khá nhiều trang tính và trong mỗi trang tính, có một vài cột. Tôi đã suy nghĩ .... những gì nếu tôi chỉ cần sử dụng python để nhập khẩu một kịch bản VBA (lưu một nơi nào đó trong notepad hoặc một cái gì đó) vào trình soạn thảo VBA trong excel và sau đó chạy kịch bản đó từ python sử dụng pythonwin.

Cái gì như:

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

Trước khi bạn nhận xét, rất nhiều vâng tôi đã thấy các ví dụ pythonic làm thế nào để làm việc xung quanh tự động điều chỉnh các cột trong openpyxl, nhưng tôi thấy một số cơ hội thú vị mà có thể đã sử dụng các chức năng bạn nhận được từ VBA có thể không có sẵn trong python.

Dù sao thì, tôi tìm kiếm trên internet một chút và tôi không thấy bất cứ điều gì cho thấy tôi có thể, vì vậy tôi nghĩ tôi sẽ hỏi.

Chúc mừng, Mike

+0

Có, bạn có thể sử dụng Python để viết chương trình bằng ngôn ngữ khác, rất có thể là _any_ ngôn ngữ khác. – martineau

+2

Nếu bạn định kích hoạt Excel để chạy chế độ tự động, bạn có thể tạo toàn bộ thông qua tự động hóa. Sau đó, bạn sẽ không phải thực hiện tạo mã động ... –

+0

mặc dù câu hỏi này có chút bụi, có thể điều này có thể hữu ích: https://www.pyxll.com/docs/macros.html – AnyOneElse

Trả lời

5

Có, có thể. Bạn có thể bắt đầu xem cách bạn có thể tạo macro VBA từ VB trên that Microsoft KB.

Mã Python bên dưới minh họa cách bạn có thể thực hiện tương tự; nó là một cổng cơ bản của nửa đầu tiên của mã mẫu 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) 

Bạn có thể nhìn vào các macro Excel tự động nhìn thấy được, và bạn sẽ thấy những VBAMacro định nghĩa ở trên.

+0

Tôi có cơ hội hôm nay để thử và kiểm tra mã. Cảm ơn rất nhiều vì đã đóng góp. Điều này đang đẩy tôi đi đúng hướng. Tôi có rất nhiều ý tưởng khác mà mã này có thể trợ giúp. – Mike

+0

@ Giống như bạn đang chào đón – Boud

+0

Tôi đang tự hỏi. Tôi đang sử dụng openpyxl trong suốt mã của tôi và tôi không muốn thay đổi điều đó. Tôi nghĩ rằng, tôi có thể chạy tất cả các mã của tôi và tạo ra các bảng tính và lưu nó vào đĩa. Có cách nào tôi có thể lấy bảng tính ở cuối mã của tôi và chạy mã của bạn bằng cách sử dụng win32 và thêm vào các subprocess tại thời điểm đó? Tôi đang đấu tranh với việc mở một bảng excel hiện có với win32 đến thay vì mở một thể hiện bằng cách sử dụng EnsureDispatch như bạn đã làm ở trên. – Mike