2016-11-09 19 views
0

Excel VBAからMicrosoft Accessを開き、マクロを実行してExcelでさらにコードを実行しています。数日前にすべてうまくいきましたが、今は2つの問題があります。最初のアクセスはマクロを実行した後に終了しないので、Excelはタイムアウトします(Microsoft Excelがポップアップし、別のアプリケーションがOLEアクションを完了するのを待っているというメッセージボックスが表示されます)。それは実際には別の問題です。なぜなら、タイムアウトするとExcelと再びやり取りして、Excelのマクロを実行し続ける必要があるからです。 Excelでマクロを最初に起動した後は、何も触れる必要はありません。そして、私はまずExcelからのアクセスでマクロを実行していますが、実行後にアクセスが閉じない

...それは長い時間がかかるので、私はAccessで私のマクロに複数のステップを追加しましたので、それはまた、タイムアウトするかもしれないと思う、ここにアクセスを呼び出すExcelのコードは次のとおりです。

Sub Opendatabase() 

Dim accessApp 
Set accessApp = CreateObject("Access.Application") 
accessApp.Visible = True 
accessApp.OpenCurrentDataBase ("I:\MyPath\MyFile.accdb") 
accessApp.Run "ImportDataRunQueriesExportData" 


'Run the next part of Excel macro 
Application.Run "PullinTheExportedAccessData" 

End Sub 

そして、アクセスでは、これは(それは非常に長い)申し訳ありません。それはデータを引き出し、クエリを実行する目的(私はそれらを開いたり閉じたりすることにより、より速い方法があるかどうかわかりません)、そしてデータをエクスポートします。私は最後にそれを閉じたいと思うし、今はその部分がうまくいきません。

Sub ImportDataRunQueriesExportData() 

DoCmd.RunSavedImportExport "Import-ERT Aggregate Macro" 

'Open master book January to refresh 

DoCmd.SetWarnings False 
DoCmd.OpenQuery ("Remove HP not Area8") 
DoCmd.OpenQuery ("Remove Non Area 8 HP") 
DoCmd.SetWarnings True 
DoCmd.OpenTable ("Remove HPnonArea8") 
DoCmd.Close acTable, "Remove HPnonArea8" 
DoCmd.OpenQuery ("Summary For January") 

'Open Duplicate search queries across all c 
DoCmd.OpenQuery ("S+D") 
DoCmd.OpenQuery ("S+D+L") 
DoCmd.OpenQuery ("S+D+L+F") 
DoCmd.OpenQuery ("S+D+L+F+M") 
'Open Duplicate search queries within c 
DoCmd.OpenQuery ("C+S+D") 
DoCmd.OpenQuery ("C+S+D+L") 
DoCmd.OpenQuery ("C+S+D+L+F") 
DoCmd.OpenQuery ("C+S+D+L+F+M") 


'Save and close queries, made with create Macro function 
    DoCmd.Close acQuery, "Summary For January" 
    DoCmd.Close acQuery, "S+D" 
    DoCmd.Close acQuery, "S+D+L" 
    DoCmd.Close acQuery, "S+D+L+F" 
    DoCmd.Close acQuery, "S+D+L+F+M" 
    DoCmd.Close acQuery, "C+S+D" 
    DoCmd.Close acQuery, "C+S+D+L" 
    DoCmd.Close acQuery, "C+S+D+L+F" 
    DoCmd.Close acQuery, "C+S+D+L+F+M" 

'Open Summary Queries 
DoCmd.OpenQuery ("New January") 
DoCmd.OpenQuery ("Renew January") 
DoCmd.OpenQuery ("Count October") 
DoCmd.OpenQuery ("Count November") 
DoCmd.OpenQuery ("Count December") 
DoCmd.OpenQuery ("5B") 
DoCmd.OpenQuery ("5CW") 
DoCmd.OpenQuery ("5ML") 
DoCmd.OpenQuery ("5M") 
DoCmd.OpenQuery ("5S") 
DoCmd.OpenQuery ("RA") 

'Save and close queries and table 
    DoCmd.Close acQuery, "New January" 
    DoCmd.Close acQuery, "Renew January" 
    DoCmd.Close acQuery, "Count October" 
    DoCmd.Close acQuery, "Count November" 
    DoCmd.Close acQuery, "Count December" 
    DoCmd.Close acQuery, "5B" 
    DoCmd.Close acQuery, "5CW" 
    DoCmd.Close acQuery, "5ML" 
    DoCmd.Close acQuery, "5M" 
    DoCmd.Close acQuery, "5S" 
    DoCmd.Close acQuery, "RA" 

'Make Table, delete w/in c dups, Open Data Table S D Between C, close table 
    DoCmd.SetWarnings False 

    DoCmd.OpenQuery ("Table S+D") 
    DoCmd.OpenQuery ("Delete C+S+D") 

    DoCmd.SetWarnings True 

DoCmd.OpenTable ("S D Between C") 
DoCmd.Close acTable, "S D B C" 

'Run saved exports of the queries to folder 
DoCmd.RunSavedImportExport "Export-S+D" 
DoCmd.RunSavedImportExport "Export-S+D+L" 
DoCmd.RunSavedImportExport "Export-S+D+L+F" 
DoCmd.RunSavedImportExport "Export-S+D+L+F+M" 
DoCmd.RunSavedImportExport "Export-C+S+D" 
DoCmd.RunSavedImportExport "Export-C+S+D+L" 
DoCmd.RunSavedImportExport "Export-C+S+D+L+F" 
DoCmd.RunSavedImportExport "Export-C+S+D+L+F+M" 
DoCmd.RunSavedImportExport "Export-New January" 
DoCmd.RunSavedImportExport "Export-Renew January" 
DoCmd.RunSavedImportExport "Export-Count October" 
DoCmd.RunSavedImportExport "Export-Count November" 
DoCmd.RunSavedImportExport "Export-Count December" 
DoCmd.RunSavedImportExport "Export-5B" 
DoCmd.RunSavedImportExport "Export-5CW" 
DoCmd.RunSavedImportExport "Export-5ML" 
DoCmd.RunSavedImportExport "Export-5M" 
DoCmd.RunSavedImportExport "Export-5S" 
DoCmd.RunSavedImportExport "Export-S D Between C" 
DoCmd.RunSavedImportExport "Export-RA" 

    Dim n As Integer 
    Dim db As DAO.Database 

    Set db = CurrentDb 
    For n = db.TableDefs.Count - 1 To 0 Step -1 
    ' loop through all tables 
     If InStr(1, db.TableDefs(n).Name, "ImportError") > 0 Then 
     ' if table is import errors table 
      DoCmd.DeleteObject acTable, db.TableDefs(n).Name 
      ' delete table 
     End If 
    Next n 

Application.SetOption "Auto compact", True 

End Sub 

ご協力いただければ幸いです。ありがとうございました。 DoCmd-法対象商品:

accessApp.DoCmd.OpenQuery ("5ML") 

はこの少し詳しく説明するには:これはに

DoCmd.OpenQuery ("5ML") 

変更:私はあなたの問題を見ることができるものから、

+3

は 'それ^^' Application.Run' –

+2

後accessApp.Application.Quit'を試してみてください。また、 'set accessApp = Nothing'する必要もあります。 –

+0

各行で 'DoCmd'を呼び出すのではなく、' With DoCmd ... End With'を使うことで*いくらかの速度を得ることもできます。 –

答えて

1

は次のように行にありますVBAライブラリにアクセスします。したがって、実行するにはアクセスアプリケーションオブジェクトが必要です。コードが機能するようにこのオブジェクトを作成しました。しかし、アクセス・アプリケーションの一部であり、アプリケーション・オブジェクトを参照しないメソッドを呼び出すと、自動化されたアプリケーション(この場合はAccess)へのグローバル参照が作成されます。そのため、たとえ最後を適切に閉じても、アプリケーションはシャットダウンしません。それはもちろんあなたがやるべきことです。ですから、最初にアクセス・アプリケーションの一部であるすべてのメソッドの前にアプリケーション・オブジェクトを配置し、次にアプリケーションを適切に閉じることです。原則として:ここで

accessApp.AMethodOfTheAccessApplication 
... 
accessApp.CloseCurrentDatabase 
accessApp.Quit 
Set accessApp = Nothing 

は正確かつ詳細に、明確にこれをより説明する記事です: Program won't quit

編集:は、あなたが行くことができるExcelで実行しているテーブル定義-削除ループを取得するには次のコード( Microsoft 16.0 AccessデータベースエンジンオブジェクトライブラリMicrosoft Access 16.0オブジェクトライブラリの両方を参照する必要があります(バージョン16は重要ではなく、これらの最新バージョン利用可能なライブラリあなたにはわかりますように、早期バインディング(テスト目的)の代わりにレイトバインディングを使用しています。だから、あなたが(あなたが推測する参照を心配しないために)上のコードのように、早い綴りで行くことに決めたら、tdfオブジェクトを宣言する方法を理解するだけです。ここでは、レイトバインディングと同じループされています:What does this binding stuff mean?

編集編集

Dim AccessApp As Object 
Set AccessApp = CreateObject("Access.Application") 
Dim tdf As Object 

AccessApp.OpenCurrentDatabase ("SomeDrive:\SomePath\SomeDb.accdb") 

For Each tdf In AccessApp.CurrentDb.TableDefs 
' loop through all tables 
    If InStr(1, tdf.Name, "tblDelete") > 0 Then 
    ' if table is import errors table 
     AccessApp.DoCmd.DeleteObject 0, tdf.Name 
     ' delete table 
    End If 
Next tdf 

Set tdf = Nothing 

AccessApp.CurrentDb.Close 
AccessApp.Quit 
Set AccessApp = Nothing 
+0

これは大変意味があります。私はこれを試してみよう!私には質問がありますが、私はaccess.Appを追加しますか?アクセスの私のマクロの中に?または、そのマクロからExcelにすべてを移動する必要がありますか?それは私にアクセスコードをコピーする必要があるように見えます.. – Lui

+0

ああ!ああ、申し訳ありませんが、私は2番目のマクロがAccessに配置されているのを見ていませんでした。私はそれがすべてExcelであると仮定しました。まあそれは依存しています。あなたは確かにExcelに移動することができます。私はあなたのExcelファイルからマクロを使用する場合だけ私はそれをExcelに移動します。そうでない場合は、中央の場所に保管してください。 2番目のマクロはすでにAccessデータベースに入っているので、グローバル参照があなたの動作を引き起こしているかどうかはわかりません。あなたがExcelにあり、Application.Somethingアプリケーションに入力するとExcelアプリケーションになるので、実際にはそれはすべきではありません。あなたがアクセスしている場合、同じことが成り立ちます。 –

+0

コードサンプルの最後に書いた3行のAccessアプリケーションを閉じてみてください。 –

関連する問題