2017-07-31 15 views
11

Tôi có một tệp excel (Main.xlsm) chứa macro. Tôi có một tập tin python (python.py) để tạo ra một tập tin excel công ty con (sub.xlsx) mà tôi sẽ tiếp tục gọi trong các macro của tập tin Main.xlsm. Tệp sub.xlsx này được tạo bởi chạy python.py được lưu trong cùng thư mục làm việc.Có cách nào để gọi mã python trong Excel-VBA không?

Bây giờ tôi muốn làm cho python.py này được thực hiện trong khi chạy các macro Main.xlsm và sau đó sử dụng tệp xlsx này. Về cơ bản tôi muốn giảm bước thực hiện python.py bên ngoài. Có lệnh cho điều đó không? Tôi mới làm quen với VBA.

+1

sau đó ở lại mới (và tránh xa) VBA :) Tôi hy vọng y tìm thấy những gì bạn cần. Câu hỏi thú vị. –

+0

@ Jean-FrançoisFabre Cảm ơn sự quan tâm của bạn được hiển thị trong câu hỏi. : p –

+0

từ quan điểm của tôi (cũng áp dụng cho các hệ thống độc quyền và cồng kềnh khác), đôi khi tốt nhất là 1) xuất dữ liệu dưới dạng CSV 2) chạy tập lệnh python để xử lý dữ liệu dễ dàng và 3) reimport to excel/cũng sử dụng thủ thuật này thay vì cố gắng viết mã bằng ngôn ngữ con :) –

Trả lời

12

Cách đơn giản nhất là để chạy các dịch viên python với lệnh Shell

Shell ("python.exe " & yourScript & " " & arguments) 
+0

Cảm ơn bạn đã trả lời @Uri. Nhưng một câu hỏi nhỏ là nó là một lệnh cho python hoặc cho VBA? Tôi cần thực hiện nó trong VBA. –

+0

Đó là lệnh VBA –

+0

@UriGoren của bạn theo ngữ cảnh này là Main.xlsm? –

9

Có, có. Cách ưa thích của tôi để làm điều này là thông qua xlwings (https://www.xlwings.org/), nhưng cũng có một số tùy chọn khác. XlWings rất tuyệt vì nó miễn phí, nguồn mở và dễ sử dụng, với tài liệu tuyệt vời. Có một số hạn chế về tính năng, vì vậy bạn phải kiểm tra xem nó có phù hợp với nhu cầu của bạn không.

+0

Ý tưởng hay, có một ý tưởng tuyệt vời. Không XlWings làm việc trong một thread duy nhất mặc dù? – Bathsheba

+0

Theo như tôi biết, đó là chuỗi đơn thực sự – Gabor

+0

Tuyệt vời bổ trợ! Không biết điều này, cảm ơn! Có một (khác) upvote. –

3

Có nhiều cách tu chạy một kịch bản python với VBA tùy thuộc vào việc bạn cần phải chờ đợi cho đến cuối thực hiện và biết nếu nó không có lỗi.

Với Shell, không đồng bộ với giao diện điều khiển:

Public Sub RunPython(file As String, ParamArray args()) 
    Shell "python.exe """ & file & """ " & Join(args, " ") 
End Sub 

Với Shell, đồng bộ mà không cần giao diện điều khiển:

Public Function RunPython(file As String, ParamArray args()) 
    Shell "pythonw.exe """ & file & """ " & Join(args, " ") 
End Function 

Với WScript.Shell, đồng bộ mà không cần giao diện điều khiển và với mã lối ra:

Public Function RunPython(file As String, ParamArray args()) As Long 
    Dim obj As Object 
    Set obj = CreateObject("WScript.Shell") 
    RunPython = obj.Run("pythonw.exe """ & file & """ " & Join(args, " "), 0, True) 
End Function 
Các vấn đề liên quan