こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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のブックは開けているのですが、モジュールのマクロを起動することが出来ません。
書き方がおかしいのでしょうか?

投稿日時 - 2014-10-23 20:21:47

QNo.8800778

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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ファイルを開き忘れていたら・・・。
と考えるとタスクスケジューラを利用する方法も調べた方が良いかもですね。

投稿日時 - 2014-10-26 10:13:51

ANo.3

#1です。

> Application.Run "テスト用ファイル.xls!test"
Runの記述は、モジュール名!プロシージャ名じゃなかったかな?
モジュールが異なれば、同一プロシージャ名はアリの場合があるから。
(でないとForm毎に ボタン1_clickが宣言できない)

目的のモジュール名が対象ブック内でユニークなら、単にTESTだけで良さそう。
でも、標準モジュール上で、かつ、Publicなのかな?
シート上で宣言してたらPrivateになるかも。

投稿日時 - 2014-10-25 13:59:03

ANo.2

コード中の
Application は自身の事を指しています。
Excel中なら Excel.Application
Access中なら Access.Application になります。
なので、
Application.Run "テスト用ファイル!テスト" は
MDBファイルの中の "テスト用ファイル!テスト" プロシージャを実行しなさい、
という意味になりますから、「そんなモノは無い!」と言われてしまいます。
せっかく、 Set xlApp = CreateObject("Excel.Application")
としているのですから
xlApp.Run "テスト用ファイル!テスト"
としてみてください。

それと、どうやってXLSファイルを閉じているかが不明なので
杞憂かも知れませんが
処理がすべて終了した(Excelは一個も使っていない)状態でタスクマネージャで、Excel.exe が残っていないか
確認したほうが良いかも?

投稿日時 - 2014-10-25 11:27:46

ANo.1

モジュール・プロシージャ名の日本語使用を止めて、
Module1•subTESTとかにしてみて下さい

投稿日時 - 2014-10-23 21:40:33

お礼

回答ありがとうございます。モジュールの方で日本語の使用を止めました。
モジュールは 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の処理がおかしいのでしょうか?

投稿日時 - 2014-10-25 07:58:28

あなたにオススメの質問