python初心者で勉強中のものです。よろしくお願いします。
前提・実現したいこと
PDFの内容をテキストファイルに抽出したいと思っています。
pdf2txt.pyを利用するコードを作成し、pythonでの所望の動作をすることが確認できました。
エクセルのセルに入力されたPDFファイルの場所をもとにテキストファイルを生成させたいため、エクセルのVBAでpythonコードを実行させたいのです。
しかし、VBAからpythonのコードを実行させようとしたところ、テキストファイルを生成できないという問題が発生しました。
エラーメッセージも出ず、どこを直せばよいかわかりません。
発生している問題・エラーメッセージ
【追記1】下記試したことの【追記1】実行時のエラー
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "c:\users\■■■■■■■\py2xl.py", line 15, in myPDF2TXT
run(["py", str(py_path), "-o test4.txt", str(ppath)],shell = True,stdout=PIPE,stderr = PIPE,check=True).stdout
File "C:\Py\Python\lib\subprocess.py", line 512, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['py', 'C:\Py\Python\Scripts\pdf2txt.py', '-o test4.txt', 'None']' returned non-zero exit status 1.
該当のソースコード
エクセルのVBA(ファイル名はpy2xl.xlsm)
行数を引数として渡したいです。
Sub pycall() Dim row As Long row = 2 Call RunPython("import py2xl; py2xl.myPDF2TXT(" & row & ")") End Sub
python(ファイル名はpy2xl.py)
このコードだけでテキストファイルが生成できることは確認できています。
※エクセルのB2セルにPDFの場所を入力してあります。
import sys import xlwings as xw from pathlib import Path from subprocess import PIPE from subprocess import run def myPDF2TXT(row): py_path = Path(sys.exec_prefix) / "Scripts" / "pdf2txt.py" ppath = xw.Range((row,2)).value run(["py", str(py_path), "-o test.txt", str(ppath)],shell = True,stdout=PIPE,stderr = PIPE,check=True).stdout #以下は単体動作用 row = 2 myPDF2TXT(row)
試したこと
・シェルコマンドをrunでなくcall、check_out、Popenとする
・【追記1】引数のrowを空白セルになるようにして実行すると上記エラーメッセージの【追記1】が発生します。このことからpython側のrunの実行まではできていて、出力としてテキストファイルを生成するところで不具合があるのではと考えています。
補足情報(FW/ツールのバージョンなど)
・python3.8.2
・Microsoft Visual Basic for Applications 7.1
・上記xlsmファイルとpyファイル、PDFファイルは同じフォルダに格納してあります
・VBAにはxlwings.basをインポート済です
あなたの回答
tips
プレビュー