• 締切済み

ExcelVBAからAccessのモジュールを実行したい

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以外の方法でモジュールを実行する方法をご教授ください。 (つたない説明でわかりにくい点あると思います。ご指摘ください)

みんなの回答

回答No.2

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

momontama
質問者

補足

回答ありがとうございます。 >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さんの環境で再現されないということは コード以外に原因があるということになるのでしょうか。

回答No.1

試してみましたが、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 でどのような記述をしているのでしょうか? 具体的なコードを出してもらったほうがアドバイスがしやすいです。

momontama
質問者

補足

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)); よろしくお願いします。

関連するQ&A

  • Excel から Accessクエリーを実行したい

    下記のようなマクロを組んでMS Accessのクエリー結果をExcelに出力したいのですが「レコードがない」というエラーになります。正しいコーディングを教えてください。 Sub DataFromAccess() Dim AccessApp As Object Set AccessApp = CreateObject("Access.Application") myDBName = "C:\MyAccess.mdb" '出力先フルパス xlsName = "C:\Invoice.xls" With AccessApp .Visible = True .OpenCurrentDatabase myDBName, acViewNormal .DoCmd.OutputTo acOutputQuery, "クエリー名", acFormatXLS, xlsName, True .CloseCurrentDatabase .Quit End With Set AccessApp = Nothing End Sub

  • AccessからExcelVBAのモジュールを呼び出したい

    AccessからExcelVBAのモジュールをキックし、実行する方法はあるでしょうか。 プロシージャを指定して実行さえできれば良いのですが・・・ 呼び出し元はAccessのマクロ・AccessVBAどちらでも構いません。 どちらでもできるのであれば、両方のやり方を教えていただけるとありがたいです。

  • ゾンビエクセル・・・(ExcelVBA)

    ExcelのVBAからAccessを起動し、エクセルファイルのインポートを行っています。 この処理を行うと、その後エクセルを閉じてもプロセスにエクセルが残ってしまいます。 なぜこうなってしまうのか判りません。よろしかったら教えてください(><) 一応コードを書いてみます。TransferSpreadsheetのコードを実行しない場合はゾンビエクセルは残らないので、それが原因だとは思うのですが他の方法がわかりません。 よろしくお願いいたします。 Dim appAccess As Object Dim acImport, fname As String, ffname As String acImport = "acImport" fname = ThisWorkbook.Path & "\取込.mdb" ffname = ThisWorkbook.FullName Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase fname appAccess.DoCmd.TransferSpreadsheet , 8, _ "torikomi", ffname, True, "torikomi" Set appAccess = Nothing

  • ExcelからAccessの関数を使用したい

    EXCELのVBAよりACCESS上のモジュールで定義された関数(Function) を使用したいのですが、可能でしょうか? EXCELから引数はACCESSに対しては、引数を付けて実行できるのですが、ACCESSからEXCELへの返却値の受け取り方が分からなくて困っています。(環境はOFFICE2000です。他のバージョンなら可能?) ■EXCEL Set objACCESS = CreateObject("Access.Application") objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\database.mdb" objACCESS.Run "UserFunction", 123 Set objACCESS = Nothing #### UserFunctionの結果が欲しい ### ■ACCESS Public Function UserFunction(inValue) W_SQL = "SELECT data FROM table WHERE key = " & inValue Set DB = CurrentDb Set RST = DB.OpenRecordset(W_SQL) If RST.EOF Then RST.Close UserFunction = -1 Else UserFunction = RST("data") RST.Close End If End Sub

  • ExcelVBA 標準モジュール内関数の呼出し

    VB6.0からExcelの標準モジュール内のパラメータ付関数を呼出すにはどうしたらよろしいでしょうか? Dim app As Excel.Application Dim wb As Workbook Set app = CreateObject("excel.application") Set wb = app.Workbooks.Open("TestXl.xls") Set app = Nothing 以上のように記述し指定のエクセルファイルをオープンすることはできたのですが ここからどうやって標準モジュールを参照し、その中の関数を実行するかがわかりません。

  • ExcelからAccessのフォームを開くVBA

    VBAをあまり理解出来ていない初心者です。 ExcelからAccessのフォームを開く為に解説サイトを参考にしました。 Accessはテーブルだけのバックエンドと、それ以外のフロントエンドに分かれています。 Sub OPEN顧客管理番号検索() Dim objACCESS As Object Set objACCESS = CreateObject("Access.Application") objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "C:\....\FE.mdb" objACCESS.DoCmd.OpenForm "F_顧客管理番号検索", acNormal objACCESS.Visible = True objACCESS.UserControl = True Set objACCESS = Nothing End Sub Excelマクロ有効テンプレートからですと動作するのですが、マクロ有効ブックで保存すると以下のエラーが表示され動きません。 実行時エラー’7866’ このデータベースを開くことができません。データベースファイルが存在しないか、他のユーザーが排他モードで開いているか、ADPファイルではないことが原因です。 Accessを終了して試したり、Excelファイルの保存場所を変更してみたりしたのですが解決出来ません。 また、今回開いているフォームとは管理番号による検索クエリを元にしたフォームなのですがExcelのセルに入力されている管理番号をパラメーターに自動で入力することはできるのでしょうか? ご指導よろしくお願いします。 通報する

  • エクセルからアクセスのプロシージャーを実行する

    エクセルからアクセスのプロシージャーを実行する方法を教えてください。 アクセスファイル名→ファイル1.accdb プロシージャー名→test1 なのですが、 エクセルで Sub ACCESSのプロシージャーを実行する() Dim OBJ As Object Set OBJ = GetObject("C:\Users\Desktop\ファイル1.accdb") OBJ.Application.Run OBJ.Name & "!test1" Set OBJ = Nothing End Sub としたら、 実行時エラー 2517 ’Microsoft Access!test1’プロシージャーが見つかりません。 になります。 test1は、アクセスの標準モジュール内に記載しています。 モジュール名も指定しないとだめなのでしょうか? その場合のコードの書き方がわからないので教授ください。 該当のアクセスファイルは既に起動しているときもあるし、してない時もあります。

  • アクセスからエクセルのプロシージャーを実行させたい

    オフィス2007です。 ////////////////////////////////////////////////////////// ‘Excel側の標準モジュール ////////////////////////////////////////////////////////// Sub Excelのプロシージャー() MsgBox "Excelです" End Sub ////////////////////////////////////////////////////////// ‘Access側の標準モジュール ////////////////////////////////////////////////////////// Sub Accessのプロシージャー() Dim xlsWB As Object Dim MyFileName As String MyFileName = "D:\Accessからプロシージャーの実行テスト用ファイル.xlsm" Set xlsWB = GetObject(MyFileName) xlsWB.Application.Run xlsWB.Name & "!Excelのプロシージャー" Set xlsWB = Nothing End Sub の状態で、アクセス側から Accessのプロシージャー実行すると、 ////////////////////////////////////////////////////////// マクロ'Accessからプロシージャーの実行テスト用ファイル.xlsm!Excelのプロシージャー' を実行できません。 このブックでマクロが使用できないか、 またはすべてのマクロが無効になっている可能性があります。 ////////////////////////////////////////////////////////// となります。 エクセル側は、「すべてのマクロを有効にする」にしているし、エクセルファイルを単独で開き、 Excelのプロシージャーを実行すると問題なく動きます。 同じ条件で、2003で検証すると問題なく動きます。(拡張子は適宜変えてます) エクセルのパスが間違ってるのかな?と思い、適当なパスに変えたところ、 「オートメーション操作中にファイル名またはクラス名を見つけられませんでした。(Error 432)」 というエラーがでたので、パスは合ってます。 原因がわかる方、ご回答よろしくお願いします。

  • ExcelVBAからAccessにアクセスする

    ExcelVBAからパスワード付きAccessにアクセスする ExcelVBAからADOでAccessに次のようにしてアクセスしています。 Dim Cnn As ADODB.Connection Set Cnn = New ADODB.Connection Cnn.ConnectionString = \"Provider=Microsoft.Jet.OLEDB.4.0;\" _ & \"Data Source=\" & mdbのフルパス Cnn.Open パスワード付きのmdbにアクセスするのはどのようにしたらよろしいでしょうか?

  • アクセスで標準モジュールの中身を書き出したい

    http://officetanaka.net/excel/vba/vbe/05.htm の Sub Sample9() Dim Code As String Code = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(7, 5) MsgBox Code End Sub のエクセルではなく アクセスバージョンはないでしょうか? http://d.hatena.ne.jp/taka_2/20090907/p2 をアクセスの標準モジュールに貼り付けてみたのですが inFileName = WScript.Arguments(0) で実行時エラー424になってしまいます。

専門家に質問してみよう