- 締切済み
ACCESSでExcelマクロを起動
ACCESS、Excelの2003を使用しています。 常駐パソコンにACCESSプログラムを起動させておき、朝の6時になったらExcelの標準モジュールに記載しているマクロを起動し、開いたExcelを保存しようとしています。 以下ACCESSに記載しているマクロです。 If Format(Now(), "hh:nn") = "06:00" Then strXlsS = "D:\テスト用ファイル.xls" Set xlApp = CreateObject("Excel.Application") xlApp.Visible = True Set xlbook = xlApp.Workbooks.Open(strXlsS) 'エラー箇所' Application.Run "テスト用ファイル!テスト" End If 実行時エラー2517 プロシージャを見つけることができません。 と、エラーが表示されてしまいます。 該当のExcelのブックは開けているのですが、モジュールのマクロを起動することが出来ません。 書き方がおかしいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- NotFound404
- ベストアンサー率70% (288/408)
Office2003は持ち合わせていないので2010でのお話です。 Excelの標準モジュールに Sub AccSub() '実際の処理の代わり MsgBox Sheets("ここにはシート名を").Cells(1, 1).Value End Sub Function AccFunc(ByVal a As Long, b As Long) As Long AccFunc = a + b End Function としました。標準モジュールですからExcelの何処からでも呼び出せます。 で、 Accessでは Sub UseXLProcedure() Dim XL As Object Dim BK As Object Set XL = CreateObject("Excel.Application") Set BK = XL.workbooks.Open("d:\DATA\123\マクロ.xls") XL.Windows(BK.Name).Visible = True XL.Visible = True 'False の場合メッセージボックスだけが出る。但し最前面にはならない ' XL.UserControl = True Call XL.Run(BK.Name & "!AccSub") 'XL.Visible = True とした場合には当方(Win7 & Office2010)では最前面となりました MsgBox "1+2は " & XL.Run(BK.Name & "!AccFunc", 1, 2) 'こっちのメッセージはアクセスからのですが画面遷移しないので 'タスクバーで手動でアクセスに切り替えてください XL.Quit Set BK = Nothing Set XL = Nothing End Sub ・・・での確認はしています! (プロシージャ名に全角文字を使っていないのは単にIMEの切り替えが面倒くさいためです。) (過去に全角中黒 ・ がダメ、詳細 というオブジェクトがダメ とか色々・・ありましたが) (Application.Run "テスト用ファイル!テスト" が ダメ なのは前回回答の説明のとおり。) (BK.Name にしてあるのはファイルのバージョン(XLS→XLSM)変更などを考慮したから) ただねー。Excelを立ち上げて行うのは少し回りくどいような気もします (^_^;) ゆくゆくはAccessでExcelをオートメーションで全て操作する方向へ持って行くのがベターかな。 そちらの状況が全く不明なので要らぬお節介かもしれませんけど・・・。 以下は道草的な独り言 (当方でも未体験ゾーンです。) >If Format(Now(), "hh:nn") = "06:00" Then・・・ は、PCがとてもビジーな時でも間違いなく実行されるだろうか? PCがスリープに入ってしまっていたら・・・? Accessファイルを開き忘れていたら・・・。 と考えるとタスクスケジューラを利用する方法も調べた方が良いかもですね。
- bin-chan
- ベストアンサー率33% (1403/4213)
#1です。 > Application.Run "テスト用ファイル.xls!test" Runの記述は、モジュール名!プロシージャ名じゃなかったかな? モジュールが異なれば、同一プロシージャ名はアリの場合があるから。 (でないとForm毎に ボタン1_clickが宣言できない) 目的のモジュール名が対象ブック内でユニークなら、単にTESTだけで良さそう。 でも、標準モジュール上で、かつ、Publicなのかな? シート上で宣言してたらPrivateになるかも。
- NotFound404
- ベストアンサー率70% (288/408)
コード中の Application は自身の事を指しています。 Excel中なら Excel.Application Access中なら Access.Application になります。 なので、 Application.Run "テスト用ファイル!テスト" は MDBファイルの中の "テスト用ファイル!テスト" プロシージャを実行しなさい、 という意味になりますから、「そんなモノは無い!」と言われてしまいます。 せっかく、 Set xlApp = CreateObject("Excel.Application") としているのですから xlApp.Run "テスト用ファイル!テスト" としてみてください。 それと、どうやってXLSファイルを閉じているかが不明なので 杞憂かも知れませんが 処理がすべて終了した(Excelは一個も使っていない)状態でタスクマネージャで、Excel.exe が残っていないか 確認したほうが良いかも?
- bin-chan
- ベストアンサー率33% (1403/4213)
モジュール・プロシージャ名の日本語使用を止めて、 Module1•subTESTとかにしてみて下さい
お礼
回答ありがとうございます。モジュールの方で日本語の使用を止めました。 モジュールは Sub test () という名前です。 Application.Run "テスト用ファイル.xls!test" に書き換えましたが、未だに実行時エラー2517が発生します。 ACCESSから上記のコードでExcelを自動に開くと、Application.Runの部分でエラーが発生します。 Dドライブに保存しているExcelファイルをダブルクリックして開いた状態で、ACCESSからApplication.Runを実行しても同一のエラーが発生します。 ACCESSから開いたExcelを対象に、他のExcelからApplication.Runを実行してもエラーが発生します。 しかし、Dドライブに保存しているExcelファイルをダブルクリックして開き、他ExcelからApplication.Runを実行すると正常に働きます。 ACCESS側から開く処理、ACCESS側のApplication.Runの処理がおかしいのでしょうか?