アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは、エクセル2010を使っています。

Z23セルに、
=TIME(HOUR(Sheet1!D29), MINUTE(Sheet1!D29)-10,SECOND(Sheet1!D29))
が入っていて、時刻を表示させています。

この時刻になったら、アラームやBeep音を鳴らすのはどうしたら良いでしょうか。

ちなみに参照は30分おきくらいに更新されますので、出来ればその度に作業の無い物が理想です。

または、更新時に他のマクロが実行されますので、そのマクロに割り込ませる形でもOKです。

音声はファイルからではなく、簡易なもので結構です。

詳しい方、教えて頂けませんでしょうか。

よろしくお願いいたします。

質問者からの補足コメント

  • 回答ありがとうございますー

    そうですよねー私も
    Application.OnTime EarliestTime:=Range("Z23").Value, Procedure:="Test"
    とやってみたのですが、この行でエラーが出てしまうんですよね・・・。

    何故でしょうね?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/05/10 20:34
  • 回答いただき、ありがとうござます。

    教えて頂いたコードでおおよそ、希望は実現できそうです。

    こちらの利用環境で、ご指摘の通り時刻が過ぎている場合エラーが出ますので次の方法で対処しました。

    =IFERROR(TIME(HOUR(Sheet1!D29), MINUTE(Sheet1!D29)-10,SECOND(Sheet1!D29)),"23:59:00")*1

    それで、よろしければ2点ほど質問させていただきたいのです。

    1点目
    トグル? の状態ですと、時間内にマクロが実行されずに次のステップに移ると1回目に設定され、2回目は解除されてしまいます。

    それで利用環境を良く考えてみると、1設定する時にマクロを新しく実行する形になりますので、1回目の質問に有るような、2回目の実行のパターンを視野に入れる必要はなさそうです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/05/11 19:55
  • 2点目

    Beepを数回続けて鳴らそうと

    Beepの部分を

    For i = 1 To 10
    Beep
    Next i

    としてみましたが、変数が設定されていません的なエラーが出てしまいます。
    これを、実行させるにはどうしたら良いでしょうか。

    お手数かと思いますが、教えて頂けませんでしょうか。

    よろしくお願いいたします。

      補足日時:2015/05/11 19:57
  • 再度の回答ありがとうございます!

    時間の設定ループ設定 上手く行きました。
    楽しいですね^^ ありがとうございます。

    それで、1点目なのですが、1回目、2回目の概念を無くして、設定がされていても同じマクロを実行すれば今ある設定を解除するような仕様って言うのは不可能でしょうか。

    現実的には、時間前にマクロを停止する事は無く、あるとすればファイルを閉じるか、次のマクロを実行する事なのです。

    ここまで来ると自分では理解を超えていますので、教えて頂ければ嬉しいです。

    よろしくお願いいたします。

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/05/12 20:58

A 回答 (4件)

こんばんは。



>1:トグル? の状態ですと、時間内にマクロが実行されずに次のステップに移ると1回目に設定され、2回目は解除されてしまいます。

今の設定は、1つの時間だけ設定すれば、後は、実行されたら新しい設定が設けられるのです。こちらが、勝手に解除するオプションを付けてしまったのですが、残っているタイマーが思わぬ動きをする時があるからです。

もし、複数の設定の場合は、少なくとも、設定ボタンと解除ボタンを分けたほうがよいかもしれません。どちらがよいか、おっしゃってください。複数の設定する方法は、昔、どんな方法でやったのか、今はあまり覚えていませんので、試行錯誤になってしまうかもしれません。

>Beepを数回続けて鳴らそうと

>としてみましたが、変数が設定されていません的なエラーが出てしまいます。
>これを、実行させるにはどうしたら良いでしょうか。

ある程度の時間差が必要なのです。

''Option Explicit
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) 'モジュールの先頭に置く

Dim i As Long
For i = 1 To 10
Beep
DoEvents  '←たぶんいらないはずです。
Sleep 300 'スリープは、0.3秒 500(0.5)秒ぐらいのほうが良いかも。
Next i
この回答への補足あり
    • good
    • 1

#2の補足


>セル値からの設定に無理があるようです。
言葉が少ないと気にされる人もいたり、誤解されるおそれがあるので、説明します。その都度変わる時間値をNOW()関数などで設定しても、やはり、つねに、Calculateイベントが働いていないので、時間が更新しないので、それをOnTimeメソッドに代入すると、過去の時間だから、エラーが発生する、と思ったからです。ともかく、あっちこっちに、MsgBox で正しく設定されているか確認して、掲示しました。なお、本来、MsgBox は、自動的に閉じるものの方がよいのかなって思いました。もし、そうだったら、ご指摘ください。
この回答への補足あり
    • good
    • 0

こんばんは。



必ず、フォームコントロールのボタンに取り付けてください。
このボタンはトグルになっていますので、設定を押してから、もう一度押すと、解除されます。

メッセージボックスは、確認のためだけに入れています。現在は解除とエラーの時だけ、メッセージが出るような設定がされています。入り方が、ボタンとマクロによる再設定の2つなので、ロジックはややこしいです。

>Application.OnTime EarliestTime:=Range("Z23").Value, Procedure:="Test"
>とやってみたのですが、この行でエラーが出てしまうんですよね・・・。
マクロ側の問題ではなく、Range("Z23").Value の問題だと思います。
確か、ご質問者さんは、データインポートの場合に、Calculate イベントは働いていたような気がしますが、それでも、セル値からの設定に無理があるようです。

30分後に再び鳴るようになります。
 myTime = Date + Time + TimeSerial(0, 30, 0)  '*30分の設定
 
Beep に関しては、一応、何かあれば、リクエストしてください。
Wavファイルでも可能です。


'//
Option Explicit
Dim myTime As Variant
Dim flg As Boolean
Sub ボタン1_Click() '必ずフォームコントロール・ボタン
 'No. 8979529
 If TypeName(Application.Caller) = "String" Then
  
  If myTime = Empty Then
   myTime = Range("Z23").Value + Date
   If myTime <= Date + Time Then
    MsgBox myTime & "では、設定できません。", vbExclamation
    myTime = Empty
    Exit Sub
   End If
   flg = True
  Else
   flg = False
  End If
 ElseIf myTime > Date + Time Then
  'ボタンからではない場合
  flg = True
 End If
 
 On Error GoTo ErrHandler
 Application.OnTime EarliestTime:=myTime, _
 Procedure:="myAlarm", Schedule:=flg
 If flg = False Then
  MsgBox myTime & "の設定は解除されました。", vbInformation
  myTime = Empty
 Else
  '' MsgBox myTime & "は、設定されました。", vbInformation
 End If
 Exit Sub
ErrHandler:
 If Err.Number <> 0 Then
  MsgBox myTime & "は設定できませんでした", vbExclamation
 End If
 myTime = Empty
End Sub
Sub myAlarm()
 Beep
 ''MsgBox myTime & "実行されました", vbInformation
 flg = False
 myTime = Date + Time + TimeSerial(0, 30, 0)  '*30分の設定
 ''Range("A1").Value = myTime '次の時間
 Call ボタン1_Click
End Sub

'///
    • good
    • 1

OnTimeを使いますが



Sub ボタン1_Click()
Application.OnTime EarliestTime:=Range("Z23").Value, Procedure:="Test"
End Sub
Sub Test()
Beep
End Sub

こんな感じで使います。
Z23で指定した時間に Test()を実行すると云う予約をする感じです。
>ちなみに参照は30分おきくらいに更新されますので、出来ればその度に作業の無い物が理想です。
この更新された後のタイミングで、Ontimeが実行されるようにすれば、ご希望の動作になりますが
この部分が不明なので取り合えず、ここまでです。
この回答への補足あり
    • good
    • 1

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

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


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