簡體   English   中英

ModuleNotFoundError:嘗試從 Excel 中的 VBA 宏運行 Python 腳本時,沒有名為“xlwings”的模塊

[英]ModuleNotFoundError: No module named 'xlwings' when trying to run a Python script out of a VBA macro in Excel

我有一個名為“RapidAPI_Invest_FX_Lista_Pares_POST_Req.py”的 Python 模塊,它從 RapidAPI POST 方法中獲取來自 Investing.com 的可用外匯貨幣對的更新列表,如下所示:

import xlwings as xw
import requests
import json

def FX_Lista_Pares():
    # Reference Excel file:
    FinMkt = xw.Book("""FinMkt.xlsm""")

    # Reference API info worksheet:
    wsAPIURL = FinMkt.sheets["""API URL"""]
    wsAPIheaders = FinMkt.sheets["""API Headers"""]

    # Pull URL from API info worksheet:
    url = wsAPIURL.range("E26").value

    # Pull credentials from API info worksheet:
    keyHeader = wsAPIheaders.range("B8").value
    key = wsAPIheaders.range("C8").value
    hostHeader = wsAPIheaders.range("B9").value
    host = wsAPIheaders.range("C9").value

    # RapidAPI content type (when required), key and host headers:
    headers = {
        keyHeader: key,
        hostHeader: host
        }

    # Fetch POST method endpoint data and return in JSON format:
    response = requests.request("POST", url, headers=headers)
    data = response.json()

    # Serializing data into JSON:
    json_object = json.dumps(data, indent=4)

    # Writing to sample.json
    with open("""RapidAPI Investing POST Output/FX_Lista_Pares.json""", "w") as outfile:
        outfile.write(json_object)

運行后,上述代碼將更新保存在其各自指定子文件夾下的“FX_Lista_Pares.json”文件。

然后我在 Excel 中開發了一個 PQ 查詢,它加載並轉換提到的 JSON 文件並將其轉換為 Excel 表,如下圖所示:

在此處輸入圖像描述

由於我打算將此文件分發給具有零編碼知識的許多不同用戶,因此我將使用預設的 xlwings 安裝文件並啟用宏,因此可以觸發 VBA 代碼來運行相應的 Python 腳本,該腳本將更新此類列表按下按鈕(上圖中的“Atualizar lista de moedas”按鈕)。

按照 xlwings 的標准流程,我在 VBA 模塊中編寫了以下代碼,因此將其分配給上述按鈕:

Sub FX_Lista_Pares_POST()

    RunPython ("import RapidAPI_Invest_FX_Lista_Pares_POST_Req; RapidAPI_Invest_FX_Lista_Pares_POST_Req.FX_Lista_Pares()")
    ActiveWorkbook.Connections("Query - FX_Lista_Pares_Post_Req").Refresh
    Range("A4").Select

End Sub

問題是每次我嘗試通過單擊按鈕運行代碼時,它都會立即返回以下錯誤消息:

在此處輸入圖像描述

我目前通過 VS Code 在 Anaconda 環境下運行 Python,並且我已經安裝了所有必需的模塊(包括 xlwings)所以這個 Python 腳本運行得很好。

由於 xlwings 應該默認在虛擬環境之外運行 Python,因此其他沒有預安裝 Anaconda 環境的用戶可以直接運行它,我通過啟動“RapidAPI_Invest_FX_Lista_Pares_POST_Req.py文件”來檢查它。並意識到與 xlwings 模塊導入相關的代碼行以黃色下划線顯示,就好像它不是安裝在 Windows VE 上的 pip 一樣:

但問題是我的機器上已經安裝了 xlwings。 如此之多,以至於當我運行新的“pip install xlwings”作為對問題進行故障排除的手段時,Powershell 只會返回消息說要求已經得到滿足!

在此處輸入圖像描述

我還在 Anaconda 之外安裝了另一個 Python 3.10.6 實例,並在 xlwings 的工具欄上指定了其 PYTHONPATH。

在此處輸入圖像描述

我已經用盡了在 web 周圍可以找到的所有故障排除技巧來解決此問題,但無濟於事。 誰能解釋一下這個?

提前致謝,

萊昂納多

我用下面的代碼替換了之前設置的 VBA 代碼,它成功了。

Sub FX_Lista_Pares_POST()

Dim objShell As Object
Dim PythonExePath As String, PythonScriptPath As String
ActiveWorkbook.Save

    Set objShell = VBA.CreateObject("Wscript.Shell")

    PythonExePath = """%USERPROFILE%\AppData\Local\Programs\Python\Python310\python.exe"""
    PythonScriptPath = """%USERPROFILE%\OneDrive\Jobs\Consulting\Data BI\Cases\FinData\FinMkt\RapidAPI_Invest_FX_Lista_Pares_POST_Req.py"""

    objShell.Run PythonExePath & PythonScriptPath

    ActiveWorkbook.Connections("Query - FX_Lista_Pares_POST_Req(1)").Refresh
    Range("A4").Select

End Sub

我試圖通過使用相同的 VBA 腳本來解決此問題,但我已將其 scope 限制在相應的工作表中,這可能是問題持續存在的原因。 現在我已經在一個模塊中完成了,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM