次の方法で共有

OnTime関数で「マクロを実行できない」エラーが出ます。

Anonymous
2012-02-11T01:10:24+00:00

Excel(2007)のVBAで、定時観測のプログラムを作ろうとして、Application.OnTimeを使ってみました。

目的の時刻に指定したプロシージャを実行しようとしていますが、

「マクロ'WAIT()'を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」

というエラーが出て、実行されません。

Application.OnTimeを記述したBookのセキュリティは、すべてのマクロを有効にする設定にしています。(セキュリティ上、怖いかもしれませんが。)

Application.OnTimeから呼び出されるプロシージャのセキュリティレベルが高くて、「マクロの実行が制限されている」とExcel VBAが思っているのでしょうか、、、。

ちなみに、OSはVistaです。

解決方法があれば、是非、ご教示ください。

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

  1. Anonymous
    2012-02-11T15:44:13+00:00

    プロシージャの指定のところをシングルクォートで囲ってください。

    Dim I As Long

    Sub Test()

    Dim x As Integer

    x = 3

    Application.OnTime Now + TimeValue("00:00:1"), "'aaa " & x & "'"

    MsgBox "end"

    End Sub

    Sub aaa(wP As Integer)

    I = I + 1

    wP = wP + 1

    MsgBox "hello " & I & " " & wP

    If I < 3 Then

      Application.OnTime Now + TimeValue("00:00:5"), "'aaa " & wP & "'"

    End If

    End Sub

    なお、パラメータを指定する場合、なぜか分かりませんがPrivateだとダメみたいです。

    20+ 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

質問作成者が受け入れた回答

  1. Anonymous
    2012-02-11T02:09:30+00:00

    次のようなサンプルを作成して、新規ブックの標準モジュールに貼り付けてTestを実行してみてください。

    Sub Test()

    Application.OnTime Now + TimeValue("00:00:15"), "aaa"

    End Sub

    Private Sub aaa()

    MsgBox "hello"

    End Sub

    もし、これで動くようなら、なにか書き方を間違えておられるのでしょうし、動かないようでしたらExcelのトラブルが疑われますので、まず、Excelのセーフモード(CTRLキーを押しながらExcelショートカットから起動)した新規ブックで同じことをやってみてください。

    7 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

質問作成者が受け入れた回答

  1. Anonymous
    2012-02-11T14:30:19+00:00

    Privateは関係ないはずですが? サンプルマクロはPrivate外してもちゃんと動きます。

    マクロ実行画面で表にでないようにするため付けただけです。

    On Timeの動きは↓を試してご覧になればわかるはずです。

    End と表示されて、OKをクリックすれば、メインモジュールは終了するわけですが、OnTimeで仕掛けたものはちゃんと起動します。

    ただ、この手のやつはちゃんと仕掛けをしておかないと終わらなくなりますのでご注意ください。

    このサンプルは3回Helloと言って終わります。

    (なお、時間は短くしてあります)

    Dim I As Long

    Sub Test()

    Application.OnTime Now + TimeValue("00:00:7"), "aaa"

    MsgBox "end"

    End Sub

    Private Sub aaa()

    I = I + 1

    MsgBox "hello " & I

    If I < 3 Then

      Application.OnTime Now + TimeValue("00:00:5"), "aaa"

    End If

    End Sub

    0 件のコメント コメントはありません

5 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2012-02-11T15:02:49+00:00

    ご指摘の通り、Privateは関係ありませんでした。

    いろいろ試してみていますが、引数を渡そうとすると、「マクロを実行できない」というエラーになるようです。

    教えていただいたプログラムは動いているみたいですが、変数Iを引数で渡そうとすると、エラーになります。

    'Dim I As Long

    Sub Test()

    Application.OnTime Now + TimeValue("00:00:7"), "aaa(I)"

    MsgBox "end"

    End Sub

    Private Sub aaa(I As Integer)

    I = I + 1

    MsgBox "hello " & I

    If I < 3 Then

      Application.OnTime Now + TimeValue("00:00:5"), "aaa(I)"

    End If

    End Sub

    Application.OnTimeは、仕掛けを作ってすぐに戻って来るんですね。

    Functionを起動して測定し、結果をExcel Work Sheetに書こうと思っていたのですが、測定だけでなく結果のWorksheetへの出力も、Subの中でGlobal変数を使ってCellを指定するようなことが必要のようですね。

    ただ、Procedureを起動することはできるけれど、引数は渡せないというのは、仕様でしょうか?

    まだ、私のプログラムの書き方が悪いのでしょうか?

    0 件のコメント コメントはありません
  2. Anonymous
    2012-02-11T12:51:46+00:00

    サンプルは、動きました。

    呼ばれるプロシージャに'Private'を付けたら、現象が変わりました。

    Application.OnTimeは、予定した事項に動作しているようですが、その次の行は、その終了を待たずに、進んでいるようです。

    Application.OnTimeの動作(仕様)がよくわかっていないようです。もう少し、ちゃんと勉強してみます。

    ともかく不具合ではなく、私のミスだったようで、前進しました。

    デバッグを手伝っていただいたようで、恥ずかしいです。

    どうもありがとうございました。

    0 件のコメント コメントはありません