Hướng dẫn convert python to vba - chuyển đổi python sang vba

Cố gắng gọi một kịch bản Python trên VBA và tôi là một người mới. Tôi đã thử chuyển đổi tập lệnh chính thành exe bằng PY2EXE và sau đó gọi nó từ VBA (shell) nhưng tập lệnh chính gọi các tập lệnh khác do đó nó trở nên phức tạp và tôi đã làm hỏng nó (exe của tôi không hoạt động). Bên cạnh đó, tập lệnh chính là một tệp lớn và tôi không muốn sửa đổi nó rất nhiều.

Điểm mấu chốt, có cách gọi tập lệnh chính từ Excel VBA, mà không chuyển đổi tập lệnh thành tệp EXE.

Cho đến nay, tôi đã thử:

RetVal = Shell("C:\python27\python.exe " & "import " & "C:\\" & "MainScriptFile")

Nó bắt đầu python.exe nhưng không làm gì khác. Sau đó tôi đã thử:

RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")

Nó bắt đầu nhắc lệnh nhưng thậm chí không bắt đầu Python.

P.S. Tôi đã kiểm tra tất cả các câu hỏi liên quan trong diễn đàn, họ không giải quyết vấn đề của tôi.

Hướng dẫn convert python to vba - chuyển đổi python sang vba

John Smith

7.0986 Huy hiệu vàng47 Huy hiệu bạc60 Huy hiệu Đồng6 gold badges47 silver badges60 bronze badges

Hỏi ngày 8 tháng 8 năm 2013 lúc 20:31Aug 8, 2013 at 20:31

2

Thử cái này:

RetVal = Shell(" " & "")

Hoặc nếu tập lệnh Python nằm trong cùng một thư mục với sổ làm việc, thì bạn có thể thử:

RetVal = Shell(" " & ActiveWorkBook.Path & "\")

Tất cả các chi tiết trong

RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")
1 sẽ được đưa ra.
RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")
1 - Cho biết các trường có thể thay đổi

Tôi đoán điều này sẽ hoạt động. Nhưng sau đó, một lần nữa, nếu tập lệnh của bạn sẽ gọi các tệp khác trong các thư mục khác nhau, nó có thể gây ra lỗi trừ khi tập lệnh của bạn đã xử lý đúng. Hy vọng nó giúp.

Hướng dẫn convert python to vba - chuyển đổi python sang vba

Siha

7.22012 Huy hiệu vàng32 Huy hiệu bạc42 Huy hiệu đồng12 gold badges32 silver badges42 bronze badges

Đã trả lời ngày 8 tháng 8 năm 2013 lúc 20:51Aug 8, 2013 at 20:51

Rajgopal Crajgopal cRajgopal C

8028 Huy hiệu bạc9 Huy hiệu Đồng8 silver badges9 bronze badges

5

Tôi vừa đi qua bài viết cũ này. Không có gì được liệt kê ở trên thực sự làm việc cho tôi. Tôi đã kiểm tra tập lệnh dưới đây và nó hoạt động tốt trên hệ thống của tôi. Chia sẻ ở đây, vì lợi ích của những người khác đến vị trí này sau tôi.

Sub RunPython()

Dim objShell As Object
Dim PythonExe, PythonScript As String
    
    Set objShell = VBA.CreateObject("Wscript.Shell")

    PythonExe = """C:\your_path\Python\Python38\python.exe"""
    PythonScript = "C:\your_path\from_vba.py"
    
    objShell.Run PythonExe & PythonScript
    
End Sub

Đã trả lời ngày 12 tháng 3 năm 2020 lúc 16:28Mar 12, 2020 at 16:28

Hướng dẫn convert python to vba - chuyển đổi python sang vba

AshashASH

Huy hiệu vàng 19.2K1670 Huy hiệu bạc169 Hàng đồng16 gold badges70 silver badges169 bronze badges

1

Có một vài cách để giải quyết vấn đề này

Pyinx - Một công cụ khá nhẹ cho phép bạn gọi Python từ việc không có không gian quy trình Excel http://code.google.com/p/pyinex/

Tôi đã sử dụng cái này một vài năm trước (trở lại khi nó được tích cực phát triển) và nó hoạt động khá tốt

Nếu bạn không ngại trả tiền, điều này có vẻ khá tốt

https://datanitro.com/product.html

Tôi chưa bao giờ sử dụng nó mặc dù


Mặc dù nếu bạn đã viết bằng Python, có lẽ bạn có thể thả Excel hoàn toàn và làm mọi thứ trong Python thuần túy? Việc duy trì một cơ sở mã (python) dễ dàng hơn rất nhiều chứ không phải 2 (python + bất kỳ lớp phủ excel nào bạn có).

Nếu bạn thực sự phải xuất dữ liệu của mình vào Excel, thậm chí còn có một số công cụ khá tốt cho điều đó trong Python. Nếu điều đó có thể hoạt động tốt hơn cho tôi biết và tôi sẽ nhận được các liên kết.

Đã trả lời ngày 8 tháng 8 năm 2013 lúc 20:52Aug 8, 2013 at 20:52

BradbradBrad

1.3231 Huy hiệu vàng8 Huy hiệu bạc17 Huy hiệu đồng1 gold badge8 silver badges17 bronze badges

2

Đối với những người bị mắc kẹt tự hỏi tại sao một cửa sổ nhấp nháy và biến mất mà không làm bất cứ điều gì, tập lệnh Python có nghĩa là phải làm sau khi gọi lệnh shell từ VBA: trong chương trình của tôi

Sub runpython()

Dim Ret_Val
args = """F:\my folder\helloworld.py"""
Ret_Val = Shell("C:\Users\username\AppData\Local\Programs\Python\Python36\python.exe " & " " & args, vbNormalFocus)
If Ret_Val = 0 Then
   MsgBox "Couldn't run python script!", vbOKOnly
End If
End Sub

Trong dòng args = "" "f: \ thư mục của tôi \ Helloworld.py" "", tôi đã phải sử dụng trích dẫn ba cho việc này để hoạt động. Nếu tôi chỉ sử dụng các trích dẫn thông thường như: args = "f: \ thư mục của tôi \ helloworld.py" Chương trình sẽ không hoạt động. Lý do cho điều này là có một không gian trong đường dẫn (thư mục của tôi). Nếu có một không gian trong đường dẫn, trong VBA, bạn cần sử dụng trích dẫn ba.

Đã trả lời ngày 15 tháng 1 năm 2020 lúc 17:53Jan 15, 2020 at 17:53

OmiomiOmi

1091 Huy hiệu bạc9 Huy hiệu đồng1 silver badge9 bronze badges

Mã này sẽ hoạt động:

 your_path= ActiveWorkbook.Path & "\your_python_file.py" 
 Shell "RunDll32.Exe Url.Dll,FileProtocolHandler " & your_path, vbNormalFocus 

ActiveWorkbook.Path Trả về thư mục hiện tại của sổ làm việc. Lệnh shell mở tệp qua vỏ của Windows.

Đã trả lời ngày 23 tháng 12 năm 2019 lúc 14:18Dec 23, 2019 at 14:18

Hướng dẫn convert python to vba - chuyển đổi python sang vba

Pablo Vilaspablo VilasPablo Vilas

5065 Huy hiệu bạc12 Huy hiệu Đồng5 silver badges12 bronze badges

2

Bạn cũng có thể thử Excelpython cho phép bạn thao tác với đối tượng Python và mã gọi từ VBA.

Đã trả lời ngày 25 tháng 3 năm 2014 lúc 15:16Mar 25, 2014 at 15:16

Ehremoehremoehremo

3872 Huy hiệu bạc7 Huy hiệu đồng2 silver badges7 bronze badges

Thử cái này:

retVal = Shell("python.exe ", vbNormalFocus)

Hoặc nếu tập lệnh Python nằm trong cùng một thư mục với sổ làm việc, thì bạn có thể thử:

Tất cả các chi tiết trong

RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")
1 sẽ được đưa ra.
RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")
1 - Cho biết các trường có thể thay đổiSep 22, 2014 at 14:50

1

Tôi đoán điều này sẽ hoạt động. Nhưng sau đó, một lần nữa, nếu tập lệnh của bạn sẽ gọi các tệp khác trong các thư mục khác nhau, nó có thể gây ra lỗi trừ khi tập lệnh của bạn đã xử lý đúng. Hy vọng nó giúp.

ChDir ActiveWorkbook.Path

Siha

7.22012 Huy hiệu vàng32 Huy hiệu bạc42 Huy hiệu đồngJan 17, 2020 at 0:36

Đã trả lời ngày 8 tháng 8 năm 2013 lúc 20:51

Rajgopal Crajgopal cJul 28, 2020 at 16:00

Hướng dẫn convert python to vba - chuyển đổi python sang vba

8028 Huy hiệu bạc9 Huy hiệu Đồng

RetVal = Shell("C:\Windows\System32\cmd.exe " & "python " & "C:\\Python27\\hello.py")
0

Đã trả lời ngày 7 tháng 7 năm 2021 lúc 12:12Jul 7, 2021 at 12:12

Đối với tôi, điều này không hoạt động retval = shell ("" & activeworkbook.path & "")

Đối với tôi điều này:

Retval = shell ("python3" & "" & "c: \ a \ b \ c \ xyz.py")

Đã trả lời ngày 15 tháng 2 lúc 12:55Feb 15 at 12:55

Hướng dẫn convert python to vba - chuyển đổi python sang vba

1