dポイントプレゼントキャンペーン実施中!

ExcelVBAからAccessのモジュールを実行したいのですが、
終了した後、タスクマネージャにExcelが残ってしまいます。

ExcelVBAは下記の通りです。
Dim objAccess As Object
Dim strAccessPath As String
strAccessPath = ThisWorkbook.Path & "\a.mdb"

Set objAccess = CreateObject("Access.Application")
objAccess.Opencurrentdatabase objAccessPath

objAccess.Run "モジュール1"

objAccess.closecurrentdatabase
objAccess.Quit
Set objAccess = Nothing
です。

モジュールの内容は、
 1.ExcelのシートをAccessにインポート
 2.選択クエリでテーブルとの差分を抽出しグループ化
 3.クエリをエクスポートする
です。

objAccess.Run "モジュール1"
をしなければExcelが残らないようなので
Run以外の方法でモジュールを実行する方法をご教授ください。
(つたない説明でわかりにくい点あると思います。ご指摘ください)

A 回答 (2件)

ANo.1 です。



補足された Access のコードを使用したのですが、やはり Excel が残ることはありませんでした。

コードを見た限り、何か問題になるような記述はないように思います。

気になった点を挙げておきます。
1. Access の標準モジュールに記述しているのか?
2. Function を使用しているが、これには理由があるのか?
(Function は返り値がある場合に使用します。返り値がない場合は Sub を使用します。)
3. タスクマネージャに残ってしまうのは、アプリケーション自体なのか、それとも何かのプロセスなのか?
4. Access 側で補足されたコードを実行した場合に何か問題は生じていないのか?

この回答への補足

回答ありがとうございます。

>1. Access の標準モジュールに記述しているのか?
はい、標準モジュールに記述しています。

>2. Function を使用しているが、これには理由があるのか?
(Function は返り値がある場合に使用します。返り値がない場合は Sub を使用します。)
返り値はないので Sub に変更します。ありがとうございます。

>3. タスクマネージャに残ってしまうのは、アプリケーション自体なのか、それとも何かのプロセスなのか?
これはどのように確認すればよいのでしょうか。
タスクマネージャには EXCEL.EXE とあります。

>4. Access 側で補足されたコードを実行した場合に何か問題は生じていないのか?
EXCELVBA 記述内の
objAccess.Run "モジュール1"
をコメントアウトし実行した後、 ACCESS を立ち上げてモジュール1を実行した場合には EXCEL は残りませんでした。
問題はないように思います。

気がついた点1
タスクマネージャに EXCEL が残っている状態で、
A.xls の VBE を開いたときに、プロジェクトエクスプローラに
VBAProject(A.xls)は2つあり、
VBAProject(PERSONAL.xls)がないことに気が付きました。

気がついた点2
質問文中の objAccessPath は strAccessPath の誤りでした。
すいませんでした。


irija_bariさんの環境で再現されないということは
コード以外に原因があるということになるのでしょうか。

補足日時:2007/10/10 13:45
    • good
    • 0

試してみましたが、Excel のタスクが残るようなことはありませんでした。



1. hoge1.xls, hoge2.xls, hoge.mdb を作成
2. hoge.mdb に hoge1.xls からインポートし、 hoge2.xls にエクスポートする
Sub を記述
3. hoge1.xls に hoge.mdb の Sub を実行するマクロを記述
4. hoge1.xls のマクロを実行

という手順で行いました。hoge.mdb のエクスポート先を hoge1.xls にすると hoge1.xls の
マクロ実行時にエラーが出てしまいました。

hoge1.xls のマクロ実行後に Excel のタスクが残ってしまうことはありませんでした。

Access でどのような記述をしているのでしょうか?
具体的なコードを出してもらったほうがアドバイスがしやすいです。

この回答への補足

irija_bariさん、回答ありがとうございます。
以下、Accessの記述です。

Function モジュール1()
  Dim db As DAO.Database
  Dim LoadFilePath As String 'インポートするブック
  Dim SaveFilePath As String 'エクスポート先のフォルダ
  Dim i As Integer

  LoadFilePath = CurrentProject.Path & "\A.xls"
  SaveFilePath = CurrentProject.Path & "\保存\"

  Set db = CurrentDb

  'インポートするシート(Sheet1)が既にあれば削除
  For i = 1 To db.TableDefs.Count - 1
  If db.TableDefs(i).Name = "Sheet1" Then
  db.TableDefs.Delete "Sheet1"
  End If
  Next

  'Sheet1のインポート
  DoCmd.TransferSpreadsheet acImport, _
   acSpreadsheetTypeExcel9, "Sheet1", LoadFilePath, True

  'クエリ1のエクスポート
  DoCmd.TransferText acExportDelim, , "クエリ1", _
   SaveFilePath & Replace(Date, "/", "") & "データ1.csv", True

  'Sheet1テーブルの削除
  DoCmd.DeleteObject acTable, "Sheet1"
  db.Close: Set db = Nothing
End Function


以下、クエリ1の内容です。
Sheet1と既存テーブルとのコードの差分を抽出しています。

SELECT Sheet1.コード FROM Sheet1
LEFT JOIN 既存テーブル ON Sheet1.コード = 既存テーブル.CODE
GROUP BY Sheet1.CODE,既存テーブル.CODE
HAVING (((既存テーブル.CODE) Is Null));

よろしくお願いします。

補足日時:2007/10/08 11:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!