0

次のコマンドを使用して、Microsoft Access VBA から Python スクリプトを正常に実行しています:,

Shell (CurrentProject.Path & "\Python\Python-Portable.exe " & CurrentProject.Path & "\Python\scripts\convert.py")

Python スクリプトを実行すると、csv 出力が Windows ホーム ディレクトリに配置されます。convert.py のソース Python コードは次のとおりです。

#!/usr/bin/python
import sys, os
from openpyxl.reader.excel import load_workbook

def main():
    wb=load_workbook(filename='list.xlsx')  
    for sheet in wb.worksheets:
        csv_file='%s.csv' % sheet.title
        print 'Creating %s' % csv_file
        fd=open(csv_file, 'wt')
        for row in sheet.rows:
            values=[]
            for cell in row:
                value=cell.value
                if value is None:
                    value=''
                if not isinstance(value, unicode):
                    value=unicode(value)
                value=value.encode('utf8')
                values.append(value)
            fd.write('\t'.join(values))
            fd.write('\n')
        fd.close()

if __name__=='__main__':
    main()

CSV ファイルを "CurrentProject.Path & "\Python\scripts\" に配置したいのですが、Access VBA が出力を Windows ホーム ディレクトリに配置する理由について何か提案はありますか?

ありがとう

4

1 に答える 1

3

このShell関数は、実行するプログラムの特定の作業ディレクトリを保証しません。実際、デフォルト シェルのデフォルトは何でも使用すると思います。これは、新しい Windows ではホーム ディレクトリを意味し、古い Windows ではまったく役に立たない場所を意味する傾向があります。 .

のような生のファイル名'mysheet.csv'(または のような相対パス名r'foo\mysheet.csv') を指定すると、Python は現在の作業ディレクトリを使用してそれを配置する場所を決定します。

したがって、プログラムを実行する前に VBA スクリプトを明示的に指定cdするか、より簡単に言えば、Python スクリプトでファイルを適切な場所に明示的に配置する必要があります。


たとえば、スクリプトファイル自体のすぐ隣にファイルを配置したい場合 (これは奇妙なことですが、それがあなたが求めているようです):

import sys, os

scriptdir = os.path.dirname(os.path.abspath(__file__))

# ... later ...

fd=open(os.path.join(scriptdir, csv_file), 'wt')

または、VB スクリプトが出力ディレクトリを引数として渡すことができるようにすることもできます。

fd = open(os.path.join(sys.argv[1], csv_file), 'wt')

それで:

Shell (CurrentProject.Path & "\Python\Python-Portable.exe " & 
       CurrentProject.Path & "\Python\scripts\convert.py " & 
       CurrentProject.Path & "\Python\scripts")
于 2013-10-09T21:11:34.347 に答える