質問させていただきます。
★行っていること
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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" とメッセージが表示されました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
まず、デバッグするならエクセルを表示させて、
どういう挙動か見て確認するのが早いでしょうね。
で、SaveChanges:=True は SaveChanges:=False がいいんじゃない?
たぶん、なんかダイアログが出てるんじゃぁないかなぁ??
あと、Excel側で自分自身を閉じる処理があって、
Access側でも該当ブックを閉じる処理があるから、
そこでもデバッグが起きちゃうはず。
個人的には、そういう処理はExcel側にもたせず、
Access側で制御した方が分かりやすいと思うな。
共通関数化しておいて、流用する方がこういう時にメンテしやすいし、
Excelの処理を確認しにいかなくていいし、
楽になると思うよ。
細かいところかもだけど、
レコードセットの結果が0件だとどうなっちゃうのかな?
シートにヘッダーだけ張り付くのだろうか?
今のところ0件はあり得ないとしても、
ちゃんとしといた方が無難だろうね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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
2018/07/02 14:49
新たに質問したいと思います。
色々ご教示いただきありがとうございました。