質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • VBA

    1906questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1637questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Access

    472questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

ACCESSとExcelの連携操作について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 701

napoleon

score 12

質問させていただきます。

★行っていること
1.ACCESSで帳票作成
2.ACCESSフォームで出力(CopyFromRecordsetでクエリをExcelの任意のセルに出力)
※場合によりExcelファイルの数が違うためDo~loop処理を行っている
3.ACCESSからRunでExcelマクロを実行
4.任意の処理(製表、条件付き書式等)を実行
※最後の処理で上書き保存している

'''マクロ実行処理'''''''''''

        Set EE = CreateObject("Excel.Application")
            '本番はfalse
        EE.Visible = True
        EE.UserControl = False

        Set RS1 = DB.OpenRecordset("SELECT M_仕入先会社マスタ.仕入先コード,M_仕入先会社マスタ.会社名 FROM M_仕入先会社マスタ WHERE (((M_仕入先会社マスタ.[CHK])=-1));")

        Set wb = EE.Workbooks.Open("J:\シミュレート表\シミュレート表_2018\Macro.xlsm")
        Set ws = wb.Sheets("Sheet1")
        ws.Range("A1").CopyFromRecordset RS1

        EE.Run "シミュ_Macro"

        wb.Close
        EE.Quit

        Set wb = Nothing
        Set EE = Nothing


    DoCmd.SetWarnings False
    DoCmd.OpenQuery ("Q_CHK_Clear")
    DoCmd.SetWarnings True

    MsgBox "END"

End Sub


★困っていること
きちんとExcelマクロは実行され終了するのですが、処理が終わってACCESSに戻ってきたときにエラーが発生します。
『EE.Run "シミュ_Macro"』の部分です。
エラー内容はオートメーションエラー(実行時エラー440)です。
ネットなどで調べてみると、そのあとのCloseとQuitがないとExcelファイルが占有状態になると記載があったのですが。。。
ちなみにExcelのコードで最後に下記の処理を実施してACCESSに戻ろうとしています。

For Each wb In Workbooks
       If Not wb Is ThisWorkbook Then
         wb.Close SaveChanges:=True
       End If
Next wb    
ThisWorkbook.Close SaveChanges:=True

宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

単純に、
"シミュ_Macro" 内で、
ThisWorkbook.Close SaveChanges:=True
で、自分自身を閉じているのに、
さらにAccessの方で、
wb.Close
ともう一度閉じようとしているのでエラーになっているように
思えます。

どちらかの Close を削除すればいいのでは。

ネットなどで調べてみると、そのあとのCloseとQuitがないとExcelファイルが占有状態になると記載があったのですが。。。

一回、Closeすれば十分でしょう。閉じてすでに存在してないものをさらに閉じようとすればエラーになるのは当然のことだと。

追記

サンプルを作成して実験してみました。

Excel の標準モジュール

Public Sub シミュ_Macro()
    MsgBox "シミュ_Macro実行!"
    ThisWorkbook.Close SaveChanges:=False
End Sub


Accessの標準モジュール

Public Sub ZZZZZZ()
    Dim EE As Object, wb As Object

    Set EE = CreateObject("Excel.Application")
    '本番はfalse
    EE.Visible = True
    EE.UserControl = False

    Set wb = EE.Workbooks.Open("C:\TEST\MacroTest.xlsm")
    EE.Run "シミュ_Macro"

    wb.Close
    EE.Quit
    Set wb = Nothing
    Set EE = Nothing
    MsgBox "END"
End Sub

これを実行すると、EE.Run "シミュ_Macro"で、

実行時エラー'440':
オートメーションエラーです。


とエラーがでます。
オープンしたwbが シミュ_Macro 内でCloseされて参照できなくなったからだと思われます。

シミュ_Macro内のThisWorkbook.Close SaveChanges:=Falseをコメントアウトして実行したら、
エラーなく最後まで実行され、"END" とメッセージが表示されました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/02 10:48 編集

    コメントありがとうございます。

    ご指摘のあったThisWorkbook.Close SaveChanges:=Falseを外したら「END」まで流れました。
    しかし、ExcelBook『Macro』が起動されたままで保存しますか?というメッセージが表示されます。
    『Macro』も保存したいのですがこの場合、ACCESS側から保存を指示することは出来るのでしょうか?

    追記:wb.CloseとEE.Quitをコメントアウトすると表示されなくなりました。この解釈で間違ってないないのでしょうか。。。皆さんからいただいたコメントでは2回Closeをしているのが原因と書かれていたので。。。Excelをチェックすると製表され保存された状態なのですが少々不安で。。。

    キャンセル

  • 2018/07/02 12:25

    編集して保存したいのですね。
    ならば、Access側のコードで、
    wb.Close SaveChanges:=True
    とすればどうでしょう。
    あるいは、Excel側のマクロの最後で、
    ThisWorkbook.Save
    というように上書き保存すればどうてしょう。

    キャンセル

  • 2018/07/02 13:19

    ありがとうございます。上書き保存することが出来ました。
    あと一つご教示いただきたいのですが、製表したExcelを開くとなぜかMacroのファイルも立ち上がってしまいます。ACCESS側で解放しているはずなのですが、うまくできてないということなのでしょうか?処理が終了した時点でタスクマネジャーで確認してもExcelは立ち上がっていないのですが。。。

    キャンセル

  • 2018/07/02 14:37

    「製表したExcel」とは、「シミュ_Macro」で新規にワークブックを作成しているということでしょうか。新規に質問しなおして、そこで、症状が再現できるようなサンプルのコード(Excel側とAccess側の両方の)を提示し、状況を詳してく説明したほうがいいかと思います。

    キャンセル

  • 2018/07/02 14:49

    ありがとうございます。
    新たに質問したいと思います。

    色々ご教示いただきありがとうございました。

    キャンセル

+1

一旦全て閉じてから、CreateObject("Excel.Application")から始まる処理に変更してみてはどうでしょうか。

但し、マクロの実行については、ファイルのパスから指定する必要があると思います。

'''マクロ実行処理'''''''''''
        Set EE = CreateObject("Excel.Application")
'~ 略 ~
        Set ws = wb.Sheets("Sheet1")
        ws.Range("A1").CopyFromRecordset RS1
        wb.Close
        EE.Quit
        Set wb = Nothing
        Set EE = Nothing

        Set EE = CreateObject("Excel.Application")
        EE.Run エクセルファイル名 + "!シミュ_Macro"
        EE.Quit
        Set EE = Nothing

    DoCmd.SetWarnings False
    DoCmd.OpenQuery ("Q_CHK_Clear")
    DoCmd.SetWarnings True
    MsgBox "END"
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/29 15:48

    コメントありがとうございます。一旦すべて閉じるというのはExcelのお話でしょうか?
    マクロの実行はうまくできているので、その後ACCESSで解放する必要があると持っていたのですが、間違いなのでしょうか??

    キャンセル

  • 2018/06/29 16:02

    追記しました。

    キャンセル

  • 2018/06/29 16:21

    コメントありがとうございます。教えていただいたコードを試してみたのですが、うまく行きませんでした。
    なぜか再度立ち上げたExcelには毎回マクロの有効化を聞かれ、マクロを実行すると2回実行するはずの処理が1回しか走りませんでした。

    キャンセル

+1

まず、デバッグするならエクセルを表示させて、
どういう挙動か見て確認するのが早いでしょうね。

で、SaveChanges:=True は SaveChanges:=False がいいんじゃない?
たぶん、なんかダイアログが出てるんじゃぁないかなぁ??

あと、Excel側で自分自身を閉じる処理があって、
Access側でも該当ブックを閉じる処理があるから、
そこでもデバッグが起きちゃうはず。

個人的には、そういう処理はExcel側にもたせず、
Access側で制御した方が分かりやすいと思うな。

共通関数化しておいて、流用する方がこういう時にメンテしやすいし、
Excelの処理を確認しにいかなくていいし、
楽になると思うよ。

細かいところかもだけど、
レコードセットの結果が0件だとどうなっちゃうのかな?
シートにヘッダーだけ張り付くのだろうか?
今のところ0件はあり得ないとしても、
ちゃんとしといた方が無難だろうね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/29 16:33

    コメントありがとうございます。ご指摘いただいたSaveChanges:=True は SaveChanges:=False に変更しました。
    また、一度エクセルを表示させて挙動を確認してみました。
    試しに2つのファイルをセットし、2回処理を走らせ見たところ
    ・該当のExcelファイルに対し処理が走った
    ・2回処理が終わってLoopから抜けたところで、保存処理が行われた
    ・Excelが全て終了し、ACCESSの『EE.Run "シミュ_Macro"』に戻った

    そして、今度は実行時エラー1004がでました。このブックでマクロが使用できないかすべてのマクロが無効になっているかとのメッセージが出ました。

    確かにExcelは閉じてしまっているのでこのエラーが出るのかなとは思いますが。。。
    回避策などはあるのでしょうか?

    キャンセル

同じタグがついた質問を見る

  • VBA

    1906questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1637questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Access

    472questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。