Application.OnTimeの変数渡しに関するエラーと解決方法

このQ&Aのポイント
  • Application.OnTimeを使用して他のプロシージャに変数を渡す際にエラーが発生する理由を説明します。
  • エラーの原因は、Application.OnTimeでは変数を直接渡せないためです。
  • 正しく変数を渡すには、変数を文字列として渡し、呼び出し側で再度変数に戻す必要があります。具体的には、変数を引用符で囲み、呼び出し側で引用符を取り除きます。
回答を見る
  • ベストアンサー

Application.OnTime Nowの変数

他のプロシージャに1秒後に変数を渡すテストをしました。 Sub test01() Dim ws As Worksheet Set ws = ActiveSheet Application.Wait Now + TimeValue("0:00:01") Call AAA(ws) 'ただしく渡される End Sub Sub test02() Dim ws As Worksheet Set ws = ActiveSheet Application.OnTime Now + TimeValue("00:00:01"), "AAA(" & ws & ")" 'エラー End Sub Sub AAA(ByVal ws As Worksheet) MsgBox ws.Name End Sub Application.OnTime を使ったほうがエラーになるのはなぜでしょうか? どうやれば正しく渡せるうのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

参考に記載したURLで回答しているマクロの通りに作れば良いのですが? 誤: Application.OnTime Now + TimeValue("00:00:01"), "'BBB " & s & "'" 正: Application.OnTime Now + TimeValue("00:00:01"), "'BBB """ & s & """'" 参考URLのマクロを Sub macro1()  Dim i  For i = 1 To 5   debug.print "'macro2 ""Sheet" & i Mod 2 + 1 & """'"  Next i End Sub のように改造した練習マクロを作成して,どういう文字列を作って渡せば通るのか確認し,あらためて今やりたいことはじゃぁどう書けばよいのか再度考えてみてください。

emaxemax
質問者

お礼

何度もご指導ありがとうございました。 いろいろ試しました。 つまりは、 1.Ontimeの引数Procedureには、文字列型 の値を使用する。(そのためダブルクォーテーションでくくる。) 2.Ontimeで呼び出すプロシージャ名に変数などをつけるには、プロシージャ名+スペースを1つ入れてその後ろに値や変数を記述する。 3.上記、2の場合は、値が文字列の場合は "値" となるように """ & 変数 & """ とする。 4.上記、2の場合は 'プロシージャ名+スペース+値' というように前後をダブルクォーテーションではなく、シングルクォーテーションでくくる。 ということですね? 理屈は良く理解できていませんが、なんとかできるようになりました。 有難うございました。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

その文脈にしたいなら,たとえば application.ontime now + timeserial(0,0,1), "'AAA " & ws.codename & "'" のようにすれば,AAAにwsの中身(アクティブシート)を渡せます。 #補足しておきます Ontimeのヘルプにありますが,引数Procedureは文字列限定なので,「オブジェクトを渡す」事はできません。 参考: http://okwave.jp/qa/q7040494.html なので最初から「シート名」で受け渡した方が,手っ取り早いのです。(補足オマケ:上述マクロで渡しているのは「シート名」ではもちろんありません)

emaxemax
質問者

お礼

keithinさま、いつもありがとうございます。 codenameってなんだろうと思ったら、オブジェクト名を返すんですね。 これでばっちりうまくいきました。 ただ、 > 引数Procedureは文字列限定なので, とのことなので、 Sub test03() Dim s As String s = ActiveSheet.Name Application.OnTime Now + TimeValue("00:00:01"), "'BBB " & s & "'" End Sub Sub BBB(s As String) MsgBox s End Sub としてみたら、「マクロBBB シート名」がみあたりませんというエラーになってしまいました。 なぜシングルクォーテーションがあるのかもわかりませんのできっとまたポカをやっているのでしょうが、これは別質問としたほうがよいのでしょうか?

関連するQ&A

  • EXCELのApplication.OnTimeは予約のことですか?

    こんにちは、VBAの初心者です。 Application.OnTimeとは目覚し時計をセットするみたいに 時間になったら実行させたいタスクの「予約をする」ことですか。 ---------------- 例えばThisWorkbookに Sub ThisWorkbook_Open()  Application.OnTime TimeValue("09:00:00"), "A"  Application.OnTime TimeValue("10:00:00"), "B"  Application.OnTime TimeValue("11:00:00"), "C" End Sub 標準モジュールに Sub A()  Beep End Sub Sub B()  Beep End Sub Sub C()  Beep End Sub --------------- と書けば、Workbookを開いた時に「3つのタスクが予約された」と考えて良いのでしょうか。 その場合、11時前にEXCELを終了させたら 最後のタスクは自然消滅するのでしょうか、それともエラー扱いになるのでしょうか。

  • ontimeのリセット方法

    簡単な問題を出すexcelを作っています。 問題を出した時点でタイマー(ontime)を出し、 1分間だけ猶予を持たせ、 回答が出ればリセットをする。 間に合わなければ「残念でした」を出そうとしています。 Sub start8() Application.OnTime Now + TimeValue("00:01:00"), "timeout8" End Sub Sub reset8() Application.OnTime Now + TimeValue("00:01:00"), "timeout8", , False End Sub Sub timeout8() "残念でした。" End Sub 見よう見まねで上記の通り書きましたが、 分からないのは、これだとresr8の引き金を引いてから、1分後のように思います。 ここはどのように書けばいいのでしょうか。 Application.OnTime Now + TimeValue("00:00:00"), "timeout8", , Falseのように書いてみましたが、 エラーになります。 制限時間内にリセットボタンを押せば何事もなかった、という風にやりたいのです。 宜しくお願いします。

  • Application.OnTime の使い方

    エクセルのマクロで、過ぎた時間の背景を グレーにする予定表を作ろうとしてます。 試しに一秒ごとにグレーにしようと以下のものを書いてみたのですが 1セルしかグレーになりません。 理想としては1秒、2秒、3秒ごとに一つずつセルを変えたいです。 range * i で型の問題がある気がするのですが、 なにかアドバイスあればよろしくお願いします。 以下は関数のページです。 TimeValue http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfcttimevalue.asp OnTime http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbawd10/html/womthOnTime.asp ---------------------------------------------------- Sub timer() Dim range As Integer For i = 1 To 100 range = TimeValue("0:00:01") my_time = Now + (range * i) Application.OnTime my_time, "setBg" Next End Sub Sub setBg() Cells(Second(Now), 1).Interior.ColorIndex = 16 End Sub

  • Application.OnTime が動作するタイミング(vba)

    まず10秒たってからtest2222と表示させて、次にtestと表示させるプログラムを以下のように作成したのですが、なぜか先にtestが表示されて、次にtest2222が表示されます。 なぜなのでしょうか? 分かる方がいれば教えてください。 よろしくお願いします。 Sub aa() Application.OnTime Now + TimeValue("00:00:10"), "kara" MsgBox "test" End Sub Sub kara() MsgBox "test22222" End Sub

  • EXSEL OnTime

    OnTimeを使ったタイマーですが、サンプルを利用して実行させると次のようなエラーになってしまいます。 「マクロ’I:¥一定時間後にxls'実行マクロ'が見つかりません。」 なにか設定する事項でもあるのでしょうか? Option Explicit Dim 待ち時間 Dim 指定時刻 Sub 一定の時間間隔でマクロを実行する() 指定時刻 = Now + TimeValue("0時00分05秒") '5秒後 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "実行マクロ名", TimeValue(待ち時間) End Sub Sub 実行マクロ名() Dim wavfile As String wavfile = "C:\Windows\Media\ringin.wav " 'wavファイルのパス Shell "mplay32.exe /play /close " & wavfile End Sub

  • OnTimeを使ったのですが「エラー」になってしまいます

    VBA でOnTimeの「サンプル」を使ってのタイマーですが、実行すると次のようなエラーが出て、実行マクロへ行けません。 「マクロ"I:\一定時間後に.xls'!実行マクロ名'が見つかりません。」 どうしてなのか教えてください。 Option Explicit Dim 待ち時間 Dim 指定時刻 Sub 一定の時間間隔でマクロを実行する() 指定時刻 = Now + TimeValue("0時00分05秒") '5秒後 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "実行マクロ名", TimeValue(待ち時間) End Sub Sub 実行マクロ名() Dim wavfile As String wavfile = "C:\Windows\Media\ringin.wav " 'wavファイルのパス Shell "mplay32.exe /play /close " & wavfile End Sub

  • セルの現在時刻表示の更新間隔をセルから入力したい

    セルの現在時刻表示の更新間隔をセルから入力したい マクロは以下を使用してますが更新間隔変更のtimevalue(c3)とするとエラー13が出ます。 どなたかお教え下さい。 ******************************************** Sub Auto_Open() Dim TargetTime, WaitTime TargetTime = Now + TimeValue("00:00:01") WaitTime = TimeValue("00:00:10") Application.OnTime TargetTime, "Macro1", WaitTime End Sub Sub Macro1() Dim TargetTime, WaitTime Calculate TargetTime = Now + TimeValue("00:00:01") 'ココをセルにするとエラー13がでる WaitTime = TimeValue("00:00:10") Application.OnTime TargetTime, "Macro1", WaitTime End Sub Sub auto_close() Dim i As Integer, TargetTime On Error Resume Next For i = 1 To 10 TargetTime = Now + TimeValue("00:00:" & Application.Text(i, "00")) Application.OnTime TargetTime, "Macro1", , False Next i End Sub **********************************************

  • Excel VBA onTime関数のプロシージャ引数に、引数(変数)つきのプロシージャを呼び出す方法を教えてください。

    現在ExcelVBAで一定時間ごとにメッセージを出すツールを作成しています。 その際にonTime関数を使っていますが、その引数のひとつである呼び出すプロシージャに「引数(変数)つきのプロシージャ」を設定しようとしています。 サイトを探してみたところ、引数にシングルクオーテーションで囲むなど書いてあったのですが、変数を引数としたプロシージャを設定すると、「プロシージャが見つかりません」のエラーがでます。 どなたかお力を貸してくれませんでしょうか。 ちなみに僕のコードは以下の通りです。(簡略化) ------フォーム Private Sub cmbOk_Click() Call メッセージ実行(txtTime.Text, txtContent.Text) End Sub ------ThisWorkbook Private Sub メッセージ実行(ByVal time As String, ByVal content As String) Dim starttime As Double MsgBox time & "毎に" & vbCr & content & vbCr & "を表示します。", vbInformation Unload frmSet starttime = Now + CDbl(TimeValue(time)) Application.OnTime starttime, "'expressContent" & time & content & "'" End Sub ------標準モジュール Dim starttime2 As Double Sub expressContent(ByVal time2 As String, ByVal content2 As String) MsgBox "content2", vbInformation starttime2 = Now + CDbl(TimeValue(time2)) Application.OnTime starttime2, "'expressContent" & time & content & "'" End Sub よろしくお願い致します。

  • 「一定の時間間隔で5秒毎にMacro1を実行する」

    「一定の時間間隔で5秒毎にMacro1を実行する」 一応startマクロ、stopマクロは作成してみたのですが、 下記stopコマンド実行しても止まらなかったような気がします。 ここから改変するとしたらどうですか? Public timestop As Boolean Sub test() Dim tt As Double Dim wt As Double tt = Now + TimeValue("00:00:05") '5秒後 wt = TimeValue("00:00:02") 'インターバル2秒 Application.OnTime tt, "Macro1", wt If (timestop = False) Then Time = Timer Application.OnTime earliesttime:=(Now + TimeValue("00:00:01")), procedure:="test" End If End Sub ---------------------------------------- ここからstart,stopマクロ Sub t_start() timestop = False Call test End Sub Sub t_stop() timestop = True End Sub

  • Excelのontimeについて

    a1に数式が入っています。 c3からd3,e3,f3…に一定時間ごとにa1の値を入力するマクロがあります。 Sub 入力() Sheets("Sheet1").Select Range("a3").End(xlToRight).Offset(0, 1).Select ActiveCell.Value = Cells(1, 1).Value End Sub Sub スタート() Dim MyTime As Date Dim Jikan As Date Dim i As Integer Jikan = TimeValue("13:59:00") For i = 0 To 5 MyTime = Jikan + TimeSerial(0, 0, 5) * i Application.OnTime MyTime, "入力" Next End Sub で、教えていただきたいのですが、"入力"を動かしている途中で 上記のマクロをとめるにはどうしたらよいのでしょう? ご教授ください。

専門家に質問してみよう