人気マンガがだれでも無料♪電子コミック読み放題!!

よろしくお願いします。
VBAで指定した時間に処理(関数)を呼び出すという事がしたくて色々調べていたらApplication.Ontime というやつでなんとかできそうだとメドが立った

・・・つもりでいたのですが、どうやらこれはExcelの機能のようでした。
参照設定でエクセルのオブジェクトライブラリをチェックしたらAccessVBAで
 >Excel.Application.Ontime 待ち時間, コマンドA

と記述することでひとまず実行予約的な事まではできたのですが、
指定時間になると「コマンドAが見つかりません」
というエラーメッセージが出てしまいます。

おそらくエクセルのマクロを実行しようとして「見つからない」と言われているのでは無いかと考えています。

長くなりましたが質問は、上記のようなコードで、Accessのマクロ(関数)を呼び出すにはどうすれば良いのでしょうか?

よろしくお願いします。
上記の前提が勘違いの場合は併せてご指摘頂ければ幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

フォームのイベントの「タイマー時」を使うのが良いと思います。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
現在は暫定対応としてフォームのタイマーイベントやらループやらスリープ(API)を織り交ぜて実装してます。
まあこれはこれでいい感じなのでいまさらOnTimeメソッドにこだわる必要もなくなりつつあるのですが。

お礼日時:2009/08/15 02:06

参考質問


http://www.accessclub.jp/bbs/0201/beginers62477. …
終わりの方のリンクページ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考リンク先を全て理解しきれていなのですが、
「外出しのVBSにしてコマンド実行すれば?」と仰ってますでしょうか?

今回の質問で一番知りたいのは、
Excel.Application.Ontime 待ち時間, コマンドA
~~~~~~
とした場合、この「コマンドA」はエクセルのマクロブックから探しにいくしかないのか?
そうだとした場合アクセスのマクロを実行する(簡単な)方法はないのか?
という事です。

よろしくお願いします。

お礼日時:2009/08/15 02:10

横レス失礼します。



> OnTimeメソッドにこだわる必要もなくなりつつあるのですが。

Accessからの呼び出しでしたら、Access(とAPI)で対応された方が
よいとは思いますが、何かの参考に、ということで・・・

Excel.Application上のOnTimeを使用する場合、指定できるのは
Excel.Applicationの管理下にあるものになりますので、Excel VBAで
当該マクロ(コマンドA)を呼び出すSubを作成し、Access上からこれを
呼び出す形になるかと思います。
(「Access→Excel→Access」と、相互に参照するような形)

【Excel側】
以下のマクロを、適当なExcelファイルの標準モジュールとして保存します。
OnTimeを使用してコマンドAを実行する際には、一旦このファイルを
開いて、下記Subを実行する、という流れになります。

Public Sub コマンドB()
On Error GoTo エラー処理

  Dim Acc As Object

  '「OnTime」を呼び出したAccess(=ここではdb1.mdb)を捕捉
  Set Acc = GetObject("c:\db1.mdb")
  'db1.mdbで作成された「コマンドA」マクロを実行
  Acc.Application.Run "コマンドA"

終了処理:
 '念のため、メモリを解放
Set Acc = Nothing
Exit Sub
エラー処理:
MsgBox Err & ":" & Error$, , "CallAccess"
Resume 終了処理
End Sub


【Access側】
「OnTime」を使用する前に、上記Excelファイルを開きます。
「OnTime」では「コマンドA」を直接呼び出す代わりに、Excelから
「コマンドA」を間接的に呼び出す「コマンドB」を実行させます。

Public Sub コマンドC()
On Error GoTo エラー処理

  Dim Xls As Object

  '上記で保存したExcelファイル(=ここではwb1.xls)を開く
  Set Xls = CreateObject("Excel.Application")
  Xls.Workbooks.Open "c:\wb1.xls"
  '「OnTime」を使用して、「コマンドB」経由で「コマンドA」を実行
  Xls.OnTime 待ち時間, "コマンドB"

終了処理
  'エラー時も含めて、確実にExcelを終了させる
  If Not (Xls Is Nothing) Then Xls.Quit
  'メモリの解放
  Set Xls = Nothing
  Exit Sub
エラー処理:
  MsgBox Err & ":" & Error$, , "Test"
  Resume 終了処理
End Sub


・・・以上です。


なお、蛇足になりますが、No.2の回答は、No.1の方と全く同じこと
(=Timerイベントの使用)を言っているだけでしょうから(下記参照)、
既にTimerイベント等で対応が取れているのでしたら、リンク先の
内容は気にする必要はないかと思います。

以下は推測の根拠(例):
http://oshiete1.goo.ne.jp/qa5196729.html
http://oshiete1.goo.ne.jp/qa5193921.html
    • good
    • 0
この回答へのお礼

丁寧なご回答に加えサンプルコードまで頂き、ありがとうございます。
やはりExcel.Applicationの管理下のものじゃないと駄目なんですね、当然といえば当然ですが(汗
プログラミングって「できる」と言うのは簡単ですが「出来ない」と言い切るのは大変なので、どうしても「他に方法は無いのかな?」と気になってしまい、他の方法で出来てるならいいじゃないか、と思いつつもなかなか振り切れないのが自分の悪い癖だと思いつつなかなか性格は直りません(TT)

とても参考になりました、ありがとうございました。

お礼日時:2009/08/17 01:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAを時間指定で自動実行

就業時間内(9時~6時)でエクセルVBAを指定時間に自動実行させたいです。
エクセルはパソコン起動した朝に、開いておきます。(バックグラウンド)
指定時間になったらVBAを自動実行させたいのです。
指定時間は例えば、
10時11分
10時16分
10時21分 などです。最初の時間から5分間隔で実行。
こういう事はできるのでしょうか?VBAでできるのか?
それ以外の方法があるのか?よくわかりません。
詳しく教えてください。

Aベストアンサー

たとえば、こんなことか。
下記は、1度testを実行すると、15秒たつとtest1を実行し、以後10秒ごとにtest2を実行するというもの。
test1もtest2も単にmsgboxを表示するだけ。

Dim gotime1, gotime2
Sub test()

gotime1 = Time + TimeValue("00:00:15")
gotime2 = gotime1
Application.OnTime gotime1, "test1"
gotime2 = gotime2 + TimeValue("00:00:10")

While gotime2 < gotime1 + TimeValue("00:01:00")
Application.OnTime gotime2, "test2"
gotime2 = gotime2 + TimeValue("00:00:10")
Debug.Print gotime1, gotime2
Wend
MsgBox "start " & Time
End Sub

Sub test1()
MsgBox "test1 " & Time
End Sub

Sub test2()
If Time >= gotime1 + TimeValue("00:01:00") Then
MsgBox "end " & Time
Else
MsgBox "test2 " & Time
End If
End Sub

たとえば、こんなことか。
下記は、1度testを実行すると、15秒たつとtest1を実行し、以後10秒ごとにtest2を実行するというもの。
test1もtest2も単にmsgboxを表示するだけ。

Dim gotime1, gotime2
Sub test()

gotime1 = Time + TimeValue("00:00:15")
gotime2 = gotime1
Application.OnTime gotime1, "test1"
gotime2 = gotime2 + TimeValue("00:00:10")

While gotime2 < gotime1 + TimeValue("00:01:00")
Application.OnTime gotime2, "test2"
gotime2 = gotime2 + TimeValue("00:...続きを読む

Qアクセスのフォームでタイマー機能を使うとエラー

Win7 Ultimate アクセス2013でタイマー機能を使って夜中にデータをアップデートしています。
リンクテーブルAのデータをを全て消して、その後リンクテーブルBからデータを全てリンクテーブルAに追加する事をしています。データは200列で約10,000件あります。削除クエリーと追加クエリーをマクロに記してあります。
これをマクロで手動でやると何度やっても問題なく動きますが、フォームを開いておいてタイマーでマクロを動かすと、できる時があったり、マクロのエラーが出ていたり、ひどい時はリンクテーブルAのデータをを消して、その時点でエラーになっている時もあります。
アクセス2010、2013はトラブルが多々ありますので、Win Vista Ultimate アクセス2003SP3でも試してみましたが結果は同じでした。しかし2013に比べエラーの出る頻度ははるかに2003の方が少ないと思います。
2003も同じくマクロを手動でやればエラーは全く出ません。
このアクセスのフォームのタイマーは、使い物にならない物なのでしょうか。
簡単なもの(小さいテキストファイルをフォルダーAからフォルダーBに動かす)はタイマーでやっても一度もエラーは出ません。

ご意見をお聞かせ下さい。

Win7 Ultimate アクセス2013でタイマー機能を使って夜中にデータをアップデートしています。
リンクテーブルAのデータをを全て消して、その後リンクテーブルBからデータを全てリンクテーブルAに追加する事をしています。データは200列で約10,000件あります。削除クエリーと追加クエリーをマクロに記してあります。
これをマクロで手動でやると何度やっても問題なく動きますが、フォームを開いておいてタイマーでマクロを動かすと、できる時があったり、マクロのエラーが出ていたり、ひどい時はリンクテーブルAのデ...続きを読む

Aベストアンサー

No.2です。
レスが遅くなってすみません(汗)

> マクロではなくVBAで試していますが、2日間はエラーは出ておりません。

とのことから思い至ったのですが、マクロの「クエリを開く」や
VBAのDoCmd.RunSQLが「非同期」だといわれているのは、
もしかしたら「一連のマクロ/コードの実行中」の話ではなく、
「あるマクロ/コードの実行中に、タイマーなど、全く関連の
ないイベントをきっかけに、別のマクロ/コードが実行された
場合」の話、なのかもしれません。

つまり、タイマー時イベントによる処理の実行中に、タイマー
間隔の設定の時間が経過した場合、VBAでCurrentDbの
Executeメソッドであれば、前のタイマー時イベントの処理が
終わるまで待機されるのに対し、マクロの『クエリを開く』
アクションやDoCmd.RunSQLでは即座に実行されるという
ことではないか、ということです。

今回検証はしていませんが、こういうことであれば、今まで
使用してきた経験と照らし合わせても違和感はありません。

例)
タイマー間隔が1分、タイマー時イベントの処理に要する
時間が1.5分の場合:

 0     30秒  60秒   90秒   120秒
 |---|---|---|---|
 (a)          (b)    (c)

(a)=最初のタイマー時イベントの発生タイミング
(b)=次のタイマー時イベントの発生タイミング

→マクロやDoCmd.RunSQLは、「(b)」で2回目の処理を実行
 (=非同期処理)
 CurrentDb.Executeでは、「(a)」のイベントで実行された
 処理が終了する「(c)」まで待ってから、2回目の処理を実行
 (=同期処理)


> アクセスのTimer機能で問題はございませんか?

こちらでは、主にデータベースの使用状況(使用端末と
使用時間を確認し、自動バックアップの要否を判定)で
使用していますが、データベースの使用中に端末を
休止状態にしたりといったことをしない限り、タイマー
関連でのエラーは発生していません。
(タイマー時イベントの処理は一瞬で終わる内容で、
 タイマー間隔は10分なので、minoriyukiさんの
 ケースとは状況が違いますが)


なお、「ある特定条件で発生することを把握している、
(無視して後続処理を継続しても問題ない)エラー」が
発生している場合は、VBA上でエラー処理を組み込む
という対応方法もありますので、併せて参考まで。

http://officetanaka.net/excel/vba/tips/tips104.htm
上記サイトの最下方にある、『エラーの種類を自動判定する』
の辺りが実用的かと思います。

※「On Error Resume Next」を冒頭に記述して、
 すべてのエラーを無視する方法を紹介しているサイト
 などもありますが、自分の予想外のエラーも含めて
 無視してしまうと、実際は問題があるのに隠蔽されて
 しまい非常に危険です。
 上記サイトのように、エラー番号で場合分けをしたり
 するなどして、『想定していないエラー』については
 MsgBoxで表示するか、無人処理にする場合は
 エラーログとしてファイルを出力させる、といった対応を
 とることを強くお勧めします。
 (VBAで長時間の無人稼動をさせるのは、どちらにせよ
 お勧めできませんが(汗))

No.2です。
レスが遅くなってすみません(汗)

> マクロではなくVBAで試していますが、2日間はエラーは出ておりません。

とのことから思い至ったのですが、マクロの「クエリを開く」や
VBAのDoCmd.RunSQLが「非同期」だといわれているのは、
もしかしたら「一連のマクロ/コードの実行中」の話ではなく、
「あるマクロ/コードの実行中に、タイマーなど、全く関連の
ないイベントをきっかけに、別のマクロ/コードが実行された
場合」の話、なのかもしれません。

つまり、タイマー時イベントによる処理の実行中に、...続きを読む

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSのマクロを自動で実行させたい

ACCESSで、
TXTファイルをテーブルにインポートするマクロを作成したのですが、
TXTファイルが毎日更新されるため、毎日自動でマクロを実行させたいと思っています。
ACCESSの機能かWINDOWSの機能ですることは可能なのでしょうか。
ご教授ください

Aベストアンサー

Accessのオプションでアクションクエリの確認メッセージをはずせば、アクションに関するメッセージはでなくなります。

>このファイルに意図的にお使いのコンピュータに損害を与えるコードが含まれる場合、ファイルは安全でない可能性があります
これはおそらくセキュリティに関するメッセージでしょうから、コマンドでは処理できないようにおもいます。
AccessなのでVBAの脆弱性とか考慮されているのでしょう。
対処はちょっとわかりません。

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QAccess で 特定の文字の個数をしりたい

テーブルのフィールドに特定の文字があります。
たとえば、@があったとすると、1フィールド内に何個@があるか調べるにはどうしたらよいのでしょうか。

宜しくお願いします。

Aベストアンサー

個数を調べつ関数を作り、クエリから呼ぶようにすれば

よいと思います。

---
標準モジュール

Public Function cnt(wk As Variant) As Long

cnt = UBound(Split(wk, "@"))

End Function

SQL

SELECT cnt([フィールド]) AS 個数
FROM テーブル;

QAccessのフォームのみ表示させたい

Accessを起動した際、フォームのみ表示するにはどうすればよいのでしょうか?
(Accessを起動すると、オブジェクトメニュー?(テーブルやクエリ等のオブジクトを選択するウィンドウ)を表示させないで、フォームのみを表示させるには?)
また、上記と同じようにして、なおかつAccessを起動させないでフォームで起動や終了といったことが出来るのでしょうか?
やはりこれはVB等プログラミングでないと出来ないのでしょうか?ちなみに私はプログラミングは全く出来ません。
わかる方、教えて下さい。宜しくお願いします。

Aベストアンサー

ツールメニュー
”起動時の設定”を開き

フォーム/ページの表示にて起動時に表示させたいフォームを選択すれば、そのMDBを開いた時に、該当のフォームが表示されます。

メニュー画面等を作り、各処理のフォームを開いたり、アクセスを終了するマクロを呼び出すボタンを作ればフォームからの終了等も可能です。

また、データベースウィンドウの表示のチェックボックスを外せば、質問者様の言われているオブジェクトメニューは表示されなくなります。

メンテナンス等を行いたい時はshiftキーを押下しながら立ち上げればデータベースウィンドウが表示できます。

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング