2016-03-22 315 views
1

マクロのクエリを.accdbファイルで実行しようとしています(マクロは、データベース内の各クエリに対して新しいテーブルを保存する多数のクエリを実行します)。MS AccessのマクロをPythonで実行する

それは次のようになります。

import os 
import sys 
import shutil 
import win32ui 
import win32api,time 
import win32com.client 
from win32com.client import Dispatch, constants 
const=win32com.client.constants 


    def ejecutarPY(): 

    src_dir= r"C:\Users\irecasens\Desktop" 
    os.chdir(src_dir) 

    strDbName = 'test1.accdb'  
    objAccess = Dispatch("Access.Application")  
    objAccess.Visible = False  
    objAccess.OpenCurrentDatabase(strDbName)  
    objDB = objAccess.CurrentDb()  
    objAccess.DoCmd.RunMacro('GO')  
    objAccess.Application.Quit()  

ejecutarPY() 

それが与えるエラーは次のとおりです。

Traceback (most recent call last): 
    File "C:\EjecutarMacros.py", line 25, in <module> 
    ejecutarPY() 
    File "C:\EjecutarMacros.py", line 20, in ejecutarPY 
    objAccess.OpenCurrentDatabase(strDbName) 
    File "<COMObject Access.Application>", line 3, in OpenCurrentDatabase 
    File "C:\Program Files\Python\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_ 
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) 
com_error: (-2147352567, 'Ocurri\xf3 una excepci\xf3n.', (0, None, u'La base de datos ya est\xe1 abierta.', None, -1, -2146820422), None) 

終わりに、それはDBが既に開いているが、それは(それがローカルではないことを言いますファイルはありません。誰もアクセス権がありません。内部のテーブルもすべてローカルです)。

何が問題なのですか?

+1

いいですね。おめでとう?プログラミングの質問がありましたか?このサイトは質問のためのものであり、ランダムなコードをダンプする場所ではありません。何ですか?それに感心? –

+0

追加の(**重要**)情報を提供する際にあなたの質問を編集してください。コメントに埋め込まないでください。 –

+1

自宅で遊んでいる人のために、Google翻訳では「La base de datos yaestáabierta」と表示されています。 「データベースは現在開かれています」という意味です。 –

答えて

0

私はこのようにそれを見るためにいくつかのコマンドを変更しました:

def ejecutarPY(): 

    src_dir= r"C:\Users\..." 
    os.chdir(src_dir) 
    strDbName = 'C:\Users\....accdb' 
    print(strDbName) 
    ac = win32com.client.Dispatch("Access.Application") 
    ac.Visible=False 

    ac.OpenCurrentDatabase(strDbName) 
    ac.DoCmd.RunMacro('GO') 
    ac.DoCmd.CloseDatabase 
    ac = None 

ejecutarPY() 

そして、それは今、正常に動作します。

+0

プロセスを終了する必要があります: 'objAccess.Application.Quit()'。あなたのエンディングはデータベースファイルを閉じますが、.exeは保持します。バックグラウンドで開く。 – Parfait

関連する問題