[[20140910063023]] 『指定セルに入力できるタイムを3分に設定』(やま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定セルに入力できるタイムを3分に設定』(やま)

 ◎ 現況
 小学生に計算問題を「暗算」でさせています。ここでのご教示(特にVBA)で、下記コー
 ドにより教室でのファイルが「完成」しています。これを家庭練習用に一部修正中です
 問題の表示は、回数を入力してEnterを押したタイミングです。(その前は問題の枠のみ
 表示されている。)ここで、教師がストップウウォッチを押して3分を計測しています。

 ◎ これを
 回数を入力してEnterを押したタイミングで、「タイム計測開始」。3分経過したら、
「答え入力セル」は、修正も入力も不可能な状態にしたいのですが、良い方法はありま
 せ んでしょうか?

 ◎ できれば
 3分経過したタイミングで、マウスカーソルが次の入力セル(G2)へ移動する。

 ◎ 回数入力セル=C3  答えの入力セル=D14:H14  D28:H28  D42:H42
                         上記の判定セル= 各 1行下段
 生徒番号=G2 これを入力したら、◎ × の判定や得点などが表示されますので
 マクロボタンの「得点記録」「答えを消す」「保存して終了」を順にクリックして終了

 ◎ 下記はコード記述です。   よろしくお願いします。
Private Sub Workbook_Open()
'一旦、シート保護を解除
ActiveSheet.Unprotect
'シート保護を設定(Ulのみ)
ActiveSheet.Protect UserInterfaceOnly:=True

ActiveWindow.ScrollRow = 1

End Sub

Sub ボタン3_Click()
Dim r As Variant

  If Range("G2").Value <> "" And Range("I2").Value <> "" Then
    r = Application.Match(Range("G2").Value, Range("P13:P17"), 0)
    If IsError(r) Then Exit Sub
    Range("P13:P17").Cells(r).End(xlToRight).Offset(, 1).Value = Range("I2").Value

  End If

End Sub

Sub ボタン2_Click()

Dim r As Variant

 Range("C3,D14:H14,D28:H28,D42:H42,G2").ClearContents

 'シートを保護

 Worksheets("回数入力").Protect

End Sub

< 使用 Excel:Excel2003、使用 OS:WindowsXP >


 質問箇所へのコメントだけですが、
 OnTime で シート保護を掛ければできないでしょうか。
(Mook) 2014/09/10(水) 08:16

 (Mook)さん: 2014/09/10(水) 08:16
 コメントありがとうございました。「20070709142135」で「on Timeメソッドの使用方法」を見つけました。
 (Mook)さんがコメントされていました。VBAは、初級の能力ですので、ご教示をよろしくお願いします。
 現在、色々試していりますが。
(やま) 2014/09/10(水) 09:23

 もちろん過去の Q&A を参照されるのも良いですが、解説サイトや公式サイトも目を
 通すようにした方が良いと思います。

http://msdn.microsoft.com/ja-jp/library/office/ff196165%28v=office.15%29.aspx
http://officetanaka.net/excel/vba/tips/tips114.htm
(Mook) 2014/09/10(水) 09:51


 (Mook)さん 2014/09/10(水) 09:51

 Application.OnTime Now + TimeValue("00:03:00"), "my_Procedure"

 ◎ 上記コードが利用できるのでしょうか?

 "my_Procedure" (意味が理解できていませんが)ここを「G2セルへ移動」する為の記述にできれば良いと
 思うのですが、そのコード記述が分かりません。

 ◎ さらに、できてからに事ですが、OnTimeの取り消しは。

  Dim startTime
 startTime = Now + TimeValue("00:03:00")
 Application.OnTime startTime, "my_Procedure"   を何処に記述して

 、
 Application.OnTime startTime, "my_Procedure",,False  これで取り消すのか?

 ◎ よろしく ご教示ください。

(やま) 2014/09/10(水) 11:17


 > "my_Procedure" (意味が理解できていませんが
 の意味を理解するのが最初にやるべきことかと思います。呼び出すプロシージャの名前
 です(ここが処理する内容)。

 取り消しは
 Now + TimeValue("00:03:00") ではなく設定時に指定した時間を指定します。
 ですから、終了予定時間をどこかに記憶しておく必要があります。
 (適当なセルでよいと思いますが。)

 いきなりコーディングではなく、解説サイトのサンプルを実際に試して動かしながら
 機能の意味を理解するような演習をしてみると良いと思います。

(Mook) 2014/09/10(水) 11:58


(Mook)さん 2014/09/10(水) 11:58

 ◎ 何度もありがとうございます。これから、ゆっくり挑戦していきます。又よろしくお願いします。
(やま) 2014/09/10(水) 12:14

 (Mook)さん 2014/09/10(水) 11:58

 ◎ まずは、3分後の時間設定のみを練習しています。

 Sub 時間計測()

 Application.OnTime Now + TimeValue("00:00:20"), "Sub セルの選択()"
End Sub

Sub セルの選択()

 Worksheets("回数入力").Range("G2").Select

End Sub

 ◎ これを、最初の質問コードに「追加記述」してみましたが、反応なしです。
 「試行の為20秒」に設定中。 20秒後には、G2セルを取得してくれるとよいのですが?

 ◎ 情けない! プロシージャが読めなかったんですね。よろしく お願いします。
(やま) 2014/09/10(水) 16:15

 >Application.OnTime Now + TimeValue("00:00:20"), "Sub セルの選択()"
 ここは
 Application.OnTime Now + TimeValue("00:00:05"), "セルの選択"
 こうでなくて?
(稲葉) 2014/09/10(水) 16:40

 (稲葉)さん 2014/09/10(水) 16:40

 ◎ ご指摘ありがとうございます。 しかし・・・? です。
 ◎ 全てのコードです。よろしくお願いします。

 Private Sub Workbook_Open()
'一旦、シート保護を解除
ActiveSheet.Unprotect
'シート保護を設定(Ulのみ)
ActiveSheet.Protect UserInterfaceOnly:=True

 ActiveSheet.EnableSelection = xlUnlockedCells

ActiveWindow.ScrollRow = 1

End Sub
Sub 時間計測()

 Application.OnTime Now + TimeValue("00:00:20"), " セルの選択"
End Sub

Sub セルの選択()

 Worksheets("回数入力").Range("G2").Select

End Sub

Sub ボタン3_Click()
Dim r As Variant

  If Range("G2").Value <> "" And Range("I2").Value <> "" Then
    r = Application.Match(Range("G2").Value, Range("p13:p17"), 0)
    If IsError(r) Then Exit Sub
    Range("p13:p17").Cells(r).End(xlToRight).Offset(, 1).Value = Range("I2").Value

  End If

End Sub

Sub ボタン2_Click()

Dim r As Variant

 Range("D14:H14,D28:H28,D42:H42,G2").ClearContents

End Sub

 Sub ボタン5_Click()

 Worksheets("回数入力").Range("C3").Select

  ActiveWorkbook.Save

'シートを保護

 Worksheets("回数入力").Protect

End Sub

(やま) 2014/09/10(水) 16:55


 > ◎ ご指摘ありがとうございます。 しかし・・・? です。
 はちょっと端折りすぎでは。

 タイマーができたのかどうか
 次は何が問題と考えているのか

 といった説明はないのでしょうか。
(Mook) 2014/09/10(水) 23:58

 (Mook)さん 2014/09/10(水) 23:58

 >はちょっと端折りすぎでは。
 ◎ 失礼しました。 前記コードの状態では、20秒後も「何の反応もない」ようでしたので。

 まず、ご教示頂きたいのは、この状態で「タイマーが効けば」入力途中の(答えを)数字が、G2セルに移動 
 して「入力」されるという結果になれば「成功」なのでしょうか?

 ◎ ご覧いただいておりますように「完成していたファイル」のコードに、下記を追加記述しました。
 それをタイマーで20後に実行されるようにと考えたつもりです。
 
 Sub セルの選択() 

 Worksheets("回数入力").Range("G2").Select

 End Sub 

 引き続き、よろしくお願いします。

(やま) 2014/09/11(木) 09:37


 >前記コードの状態では、20秒後も「何の反応もない」ようでしたので。

 最初は下記程度に、反応の明確にわかるものでテストしたほうが良いと思います。
 Sub セルの選択()
     MsgBox "セルを選択します。"
     Worksheets("回数入力").Activate
     Range("G2").Activate
 End Sub

 もちろん、「時間計測」 を実行してから20 秒後ということですよね?
(Mook) 2014/09/11(木) 09:56

 (Mook)さん 2014/09/11(木) 09:56

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

 下記のようにしましたが変化なしの状況ですので、ご教示いただきました件について確認させてください。
 質問前に「完成」していたファイルを「練習用」と名前をつけて作成し直して(シート名=回数入力)

 Sub 時間計測()

 Application.OnTime Now + TimeValue("00:00:20"), " セルの選択"
End Sub

Sub セルの選択()

     MsgBox "セルを選択します。"
     Worksheets("回数入力").Activate
     Range("G2").Activate

 End Sub

 この、2個だけのコード記述にして試してみましたが、「反応なし」でした。どこが「ミス」なのかが分か
 りません。このうような方法で、テスト体験をせよとの事と解釈しています。よろしくお願いします。

 >もちろん、「時間計測」 を実行してから20 秒後ということですよね?
 ◎ 仰せのとおりです。

(やま) 2014/09/11(木) 11:17


 下記は少し気になりますが、それでもこちらでは提示のコードで動きましたが。
 " セルの選択"
   ↓
 "セルの選択"

 新規ブックでやっても同じ結果でしょうか
 (モジュール内に同じプロシージャ「セルの選択」は複数存在していませんでしたか?)。
(Mook) 2014/09/11(木) 11:25

 >このうような方法で、テスト体験をせよとの事と解釈しています。よろしくお願いします。
 その通りです。

 こういった実際に手を動かす作業が、技術習得の一番の近道だと思います。
(Mook) 2014/09/11(木) 11:28

 (Mook)さん 2014/09/11(木) 11:28

 ◎ 早々に、ありがとうございます。
 これから、色々試行錯誤していきますので、よろしくお願いします。
(やま) 2014/09/11(木) 11:47

(Mook)さん 2014/09/11(木) 11:28

 >新規ブックでやっても同じ結果でしょうか

 ◎ これに挑戦しています。

    新規ファイル「タイム測定」を作成。
  シート1を「回数入力」に変更
  適当なセルに数字を入力して、G2セルは良く判別できるようにと四角で囲む
  ファイル保存の際に「この機能はマクロなしのブックに保存されません」→Excelマクロ有効ブックを
    選択くして保存

 VBAProject(タイム測定.xlsm)
   Micorosoft Excel Objects
     Sheet1(回数入力)
   Sheet2(Sheet2)
     Sheet3(Sheet3)
     ThisWorkbook ・・・ ここに、下記のコードを記述

 Sub 時間計測()

 Application.OnTime Now + TimeValue("00:00:20"), "セル番地の選択"
End Sub

Sub セル番地の選択()

     MsgBox "セルを選択します。"
     Worksheets("回数入力").Activate
     Range("G2").Activate

 End Sub

 ◎ 新規ブックのファイルは、最初に何か「コード記述」が必要でしょうか?
  これで、タイマーが機能するのでしょうか?  よろしくお願いします。

(やま) 2014/09/11(木) 13:51


 うーんそこでしたか。
 標準モジュールに記載してください。

 そうやって説明してもらえると、原因がわかりますね。
(Mook) 2014/09/11(木) 14:33

 (Mook)さん 2014/09/11(木) 14:33

 ◎ 質問していますこのPC(Windows7 Excel2010)での「作業中」です。(最終的にはXP・Excel2003)

 VBAProject(タイム測定.xlsm)
  アイコン Module1      ・・・ 「新しい標準モジュール」をクリックし、ここに記述しました。
    
     Sheet1(回数入力)
   Sheet2(Sheet2)
     Sheet3(Sheet3)
     ThisWorkbook
 ◎ これでも「う〜ん」 機能してくれない。引き続きよろしくお願いします。
(やま) 2014/09/11(木) 15:48

 そんなはずないと思うのですけれど。

 何もない状態で、
 1)EXCEL を立ち上げる
 2)ファイルがなければ、新規ファイルを作成(Ctl+N)
 3)Alt+F11 で VBE を起動
 4)挿入⇒標準モジュール
 5)そこに下記をコピー
 6)EXCEL に戻って Alt+F8で「時間計測」を選択、OK をクリック
 7)5秒待つ

 Sub 時間計測()
      Application.OnTime Now + TimeValue("00:00:05"), " セルの選択"
 End Sub

 Sub セルの選択()
     MsgBox "セルを選択します。"
     Worksheets("Sheet1").Activate
     Range("G2").Activate
 End Sub

 で動きませんか?
(Mook) 2014/09/11(木) 16:13

 (Mook)さん 2014/09/11(木) 16:13

 ◎ 詳細な指示のお陰で、やっと一歩進みました。感謝!

 5秒後にメセージボックスが出現し、OKをクリックで、G2セルへ移動しました。

 今後の作業として、失敗していたExcelファイルにて再度挑戦していくのですが、作業の流れや注意点など
 ご教示いただけますでしょうか。
(やま) 2014/09/11(木) 20:05

 うーん、一連の手順は書きましたけれど、言っていることはそれ以前に書いたことと
 変えたつもりはありません。

 ですので、動いたものと動かないものと、どこが違うかというのを、見比べてもらう
 しかないと思うのですが、これまでの作業との相違点はなかったでしょうか。

 こういったことを迅速に解決するためには、まずデバッグの仕方を習得したら
 良いかと思います。

 処理の先頭にブレークポイントを置いておけば、一ステップごとに動作確認や
 処理の内容を確認できますから。
(Mook) 2014/09/11(木) 22:24

 (Mook)さん 2014/09/11(木) 22:24

 ◎ 次の操作について、ご教示をお願いします。

 > 6)EXCEL に戻って Alt+F8で「時間計測」を選択OK をクリック →Boxには「計算や 
 め」の文字にした。

 ◎ これを、「回数入力セル=C3」に「入力してEnterキー」のタイミングに、どう動作
 させるのか?
 Sub 時間計測() ここに追加のコード記述をするのかがわかりません。

 > 取り消しは
 Now + TimeValue("00:03:00") ではなく設定時に指定した時間を指定します。
 ですから、終了予定時間をどこかに記憶しておく必要があります。
 (適当なセルでよいと思いますが。)

 ◎ この「設定時に指定した時間」 と「終了予定時間」とは、解釈できていません?
 以上 よろしくお願いします。
(やま) 2014/09/12(金) 08:21

 せっかく OnTime を始めたのですから、まず
 >> 取り消しは
 からにしましょう。

 開始時間は
 > Now + TimeValue("00:03:00") 
 としてますが、これが現在から3分後の時間を指していることはわかりますか?
 (1)この時間を A1 に入れるコードを提示してみてください。

 (2)それができたら、A1 の時間でタイマーをセットするコードを提示してみてください。

 (3)それができたら、A1の時間でタイマーを解除するコードを提示してみてください。

 テストの時は、時間は5〜10秒で行った方が良いと思います。
 3分にするのは、最後の最後でいいでしょう。

(Mook) 2014/09/12(金) 08:36


 (Mook)さん 2014/09/12(金) 08:36

 ◎ まずは1つですが。

 Sub 時間計測()
      Application.OnTime Now + TimeValue("00:00:05"), "データの移動"
 End Sub

Sub データの移動()

  Worksheets("Sheet1").Activate
  Range("A1").Activate
End Sub

 ◎ NOw関数は使っていて承知していましが(PCから現在時刻の取得)、ご設問の3分(5秒)のデータを移動
 これでは いけませんか? 引き続きよろしくお願いします。
(やま) 2014/09/12(金) 10:49

 質問をもう一度確認してください。
 (1)でやってほしいことは 現在が 「12:00」 だとしたら、 A1 に「12:03」 と入るコードの作成です。

 スケジュールの削除は 12:01 に実行しても12:02に実行しても、
 「12:03 の予定を削除」という指定をしなければなりません。
(Mook) 2014/09/12(金) 12:07

 (Mook)さん 2014/09/12(金) 12:07

 Sub 現在時刻の取得()
Dim varValue As Variant
varValue = Worksheets("Sheet1").Range("A1").Value
End Sub

Sub 時間計測()

      Application.OnTime ("A1") + TimeValue("00:00:05"), "セルの選択"
 End Sub

 Sub セルの選択()
     MsgBox "計 算 や め"
     Worksheets("Sheet1").Activate
     Range("G2").Activate
 End Sub

 ◎ Ai=NOW() このタイムを「時間計測」のスタート時間とさせる為、上記の式ではダメでした。
 現在時刻の取得は、これでよいのでしょうか?
(やま) 2014/09/12(金) 13:20

 割込み失礼します。
 そのコードで
 >(1)この時間を A1 に入れるコードを提示してみてください。
 この部分にあたるのはどこですか。

(semm) 2014/09/12(金) 13:26


 とりあえずヒントまで(足りないときは検索を)。

 セルの代入
http://officetanaka.net/excel/vba/cell/cell01.htm
 セルの参照
http://officetanaka.net/excel/vba/cell/cell02.htm

 詳細な回答は semm さんへのコメントが付いた後で。
(Mook) 2014/09/12(金) 13:33

(semm) さん 2014/09/12(金) 13:26
 (Mook)さん 2014/09/12(金) 13:33

 ◎ ありがとうございます。無能な頭が混乱しております。「この時間を」とは、この
 解釈が?
 任意のセルに、このマクロを実施したタイムを記録させておく。
 それを「A1セル」へ表示。

 Sub 現在時間取得()
    Range("A1").Value = "16.55.53"
End Sub

 ◎ これで、A5セルに表示されている、タイムが、A1セルへいったよおなんですが。
(やま) 2014/09/12(金) 17:12

 (Mook)さん 2014/09/12(金) 12:07  では
  >(1)でやってほしいことは 現在が 「12:00」 だとしたら、 A1 に「12:03」 と入るコードの作成です。
 とも書いてありますよ。「この時間」とは、現在の3分後です。
 テストの場合は現在の5秒後です。

(semm) 2014/09/12(金) 18:47


 Now が現在の時間ということはわかっていると思いますが、
 「Now + TimeValue("00:00:05")」も「時間」ということはわかるでしょうか。
 となれば     この「時間」 の時間は何を指すかと、考えてください。

 数学も国語(読解力)が必要ですよね。
 塾で教えてらっしゃるのであれば、良くご存知のことと思いますが。

 理解して苦労して自分で作ったものは、堂々と生徒に薦められると思いますよ。
 がんばってください。
(Mook) 2014/09/12(金) 18:57

 (semm)さん 2014/09/12(金) 18:47
 (Mook) さん2014/09/12(金) 18:57

 ◎ 何度もご教示を頂き恐縮しております。何せ、己の能力以上の事に挑戦をしている分けでして、簡単に
 は出来ないのは覚悟をせねばなりません。老骨鞭打って頑張りますのでお付き合いをお願いしておきます。

 Sub 時間計測()

     Application.OnTime Now + TimeValue("00:00:05"), "タイム表示"
 End Sub

 Sub タイム表示()
Dim buf1 As Long, buf2 As Date
    buf1 = Range("A2")
    buf2 = Range("A2")

    MsgBox buf1 & vbCrLf & buf2

 End Sub

 ◎ A2=Now() です。 「時間計測マクロ」をクリックでBOX内に 時間表現はできていますが、 5秒後に
 なっていないな。残念!

(やま) 2014/09/12(金) 20:59


 ご自身で努力される限りは、できるだけお手伝いします。

 A2=Now()
 はEXCEL シートでの書き方ですね。

 VBA では
 Range("A2").Value = Now
 となります。

 Now は EXCEL にもある関数ですが、VBA にも同じ名前で関数があります。
 ですが、これは必ずしも同じではなく、EXCEL にしかない関数、VBA にしかない関数、
 同じ名前でも機能が異なる関数とあるので、都度確認してください。

 ですので、5秒後の時間を A2(A2で作業されているようなので)に設定するには、
  Range("A2").Value = Now + TimeValue("00:00:05")
 となります。

 これはいくら時間がたとうと、変更しない限りはずっと変わらないので、これを使って
 タイマーのセットと解除を行います。

 なので現在の処理
     Application.OnTime Now + TimeValue("00:00:05"), "タイム表示"
 を
     Range("A2").Value = Now + TimeValue("00:00:05")
     Application.OnTime Range("A2").Value, "タイム表示"
 としておくと、スケジュールのキャンセルは
     Application.OnTime Range("A2").Value, "タイム表示",, False
 とすることができます。

 これに置き換えて、一連の動作が期待通りにできることを確認してみてください。
(Mook) 2014/09/12(金) 21:14

 (Mook)さん 2014/09/12(金) 21:14

 >これに置き換えて、一連の動作が期待通りにできることを確認してみてください。

 ◎ Now関数を承知していると書いたのが「ミス」ですね。A2=Now() を書いていなかっ
 たら?と思うと 不安になりました。
 とうとう詳細に回答を頂いてしまいました。感謝です。今夜は「時間計測」マクロ で
 5秒後のタイムが、BOX内に日時と時間が表示された報告まで。 明日以降、またよろし
 くお願いします。

(やま) 2014/09/12(金) 22:32


 今だったら提示した説明内容を、理解してもらえたと思うのですがどうでしょうか。

 運用としては、スケジュール時間を経過してのキャンセルは無効(エラー)になるので、
 実行前のスケジュールかどうか、確認処理が必要になると思います。

 A2 の時間には有効期限があるということですね。

 そこまで書いて、このステップは完了になると思います。
 一通り動いたら、コードを提示してみてください。
(Mook) 2014/09/13(土) 03:05

 (Mook)さん 2014/09/13(土) 03:05

 ◎ 深夜にまで、ご親切なコメント痛み入ります。今朝、指定セルの「A1」 に戻して、設定を「3分」に
 変えて気が付きました。マクロを実行したタイミングで、A1セル=3分後を表示している。

 >(2)それができたら、A1 の時間でタイマーをセットするコードを提示してみてください。

 今後はこちらの作業にむかいます。 ありがとうございました。
(やま) 2014/09/13(土) 10:53

 (Mook)さん 2014/09/13(土) 03:05

 ◎ タイム表示は「A1セル」に変更しています。 現況では最初のコード「Sub 回数入力」の文字を
 ドラッグして、「実行」→「SUb/ユーザーフォームの実行」で試した結果の報告です。

 ?@ C3セル(回数入力)を取得し ?A10秒後に MsgBoxに「計算やめ」が出現して ?B Okをクリックで
 ?C G3セル(生徒番号入力)を取得 と 一連の操作が進行していきました。
 
 ◎ 但し、肝心の「C3セル入力」時点での、タイマー起動にはなっておりません。明日以降に、再度挑戦し
 て参りますが、この「一連の操作」が出来たのに感動しましたので、ご報告させていただきました。 また、「スケジュールのキャンセル」作業は、後程です。よろしく。

 Sub 回数入力()

   Application.OnTime Range("C3").Activate, "時間計測"

End Sub

Sub 時間計測()

    Range("A1").Value = Now + TimeValue("00:00:10")
     Application.OnTime Range("A1").Value, "タイム表示"

 End Sub

 Sub タイム表示()
Dim buf1 As Long, buf2 As Date
    buf1 = Range("A1")
    buf2 = Range("A1")

    Application.OnTime Range("A1").Value, "タイマー開始"

 End Sub

 Sub タイマー開始()

    Range("A1").Value = Now - TimeValue("00:00:10")
    Application.OnTime Range("C3").Select, "セルの選択"

 End Sub

Sub セルの選択()

     MsgBox "計 算 や め"
     Worksheets("Sheet1").Activate
     Range("G2").Activate

 End Sub

(やま) 2014/09/13(土) 18:59


 動いたようでよかったです。

 タイマー開始は
  Now - TimeValue("00:00:10")
 ではなく
  Now + TimeValue("00:00:10")
 かな?

 一歩一歩がんばってください。
(Mook) 2014/09/13(土) 20:41

 (Mook)さん 2014/09/13(土) 20:41

 ご声援ありがとうございます。
(やま) 2014/09/13(土) 21:21

 (Mook)さん 2014/09/13(土) 20:41

 ◎ 最初の質問で、コードをUPしましたように「最終的」には、以前作成のファイルを使用します。
 そのファイルでは、最初に「回数入力セル」C3 セルが「指定」されています。そこで、昨日UPのを変えて
 いる時に気が付きましたが「回数入力」「時間計測」どれでもマクロの実行で「一連の動作」をすると。
 それで、下記のコードになりましたが、結局は肝心な「C3セル入力」でタイマー開始できていません。
 少し、ヒントをお願いできませんでしょうか? よろしくお願いします。

 Sub タイマー開始()

    Range("A1").Value = Now + TimeValue("00:00:10")
    Application.OnTime Range("C3").Select, "時間計測"

 End Sub

Sub 時間計測()

    Range("A1").Value = Now + TimeValue("00:00:10")
     Application.OnTime Range("A1").Value, "タイム表示"

 End Sub

 Sub タイム表示()
Dim buf1 As Long, buf2 As Date
    buf1 = Range("A1")
    buf2 = Range("A1")

    Application.OnTime Range("A1").Value, "セルの選択"

 End Sub

 Sub セルの選択()

     MsgBox "計 算 や め"
     Worksheets("Sheet1").Activate
     Range("G2").Activate

 End Sub
(やま) 2014/09/14(日) 09:27

 >    Application.OnTime Range("C3").Select, "時間計測"
 はきちんと動くコードと比べておかしいと思いませんか?

 OnTime の「第1引数」は【起動時間】です。
 C3 は回数(何のかはわかりませんが)だとしたら、時間とは関係ないセルですよね?

(Mook) 2014/09/14(日) 09:49


 当初の質問コードを見ても、
 >問題の表示は、回数を入力してEnterを押したタイミングです。

 をどのように実装するかの記述がありません。

 ・これは現在は実現できているのですか?
  ・できていないとしたら、これはボタンを使用しようとしているのですか?
  ・そうでなければ C3 に単に値を入れることで起動しようとしていますか?
    ・そうだとしたら、C3 に繰り返し値を入れるとどうなりますか?

 いずれにせよコードを組む前に、仕様を明確にする必要があると思います。
 プログラムを作成する場合(マクロって、結局プログラミングです)、仕様の策定作業が
 一番大事なことです。
 コーディングは(文法さえ理解できていれば)単なる置き換え作業ですから。
(Mook) 2014/09/14(日) 10:08

 (Mook)さん 2014/09/14(日) 10:08

 ◎ ありがとうございます。

  >問題の表示は、回数を入力してEnterを押したタイミングです。          → その通りですね。

 >・そうでなければ C3 に単に値を入れることで起動しようとしていますか?  → はい。
  ・そうだとしたら、C3 に繰り返し値を入れるとどうなりますか?         → やってみます。

 ◎ 丁度、新規の問題ができたところですので、「新規ファイル」として現在のコードを記述してみます。
 そうですようね!完成ファイルでは、「C3セルの入力]で問題表示している。起動する。少し理解しました。
(やま) 2014/09/14(日) 12:01

 (Mook)さん 2014/09/14(日) 10:08

 当初の質問コードを見ても、
 >問題の表示は、回数を入力してEnterを押したタイミングです。

 をどのように実装するかの記述がありません。

 ◎ 他セルに有る問題(数字)からの「呼び出し」です。 1番の1列目一行目は 下記の通りです。

 '=IF($C$3=1,D73,IF($C$3=2,D114,IF($C$3=3,D154,IF($C$3=4,D194,IF($C$3=5,D234,IF$3=6,D274,""))))))

 ◎ 以下、同様にした「呼び出し」をして「問題表示」をしています。

 ◎ 先程までの質問は「コードテスト用」の新規Excel(2010)ファイルでの操作報告でした。
  
 今回は、只今できた問題を既存ファイルに入れ替えて、下記コードを「Module1」に記述してみました。
 元ファイル(Excel2003)のコード(当初の質問)は、ThisWorkbook に記述されています。
 操作結果=元ファイルで作成の動作、判定・得点記録などは、正常に動作しました。
 追加記述分については、まだ、反応していません。 以上が現況です。

 Sub 回数入力()

 Application.OnTime Range("C3").Select, "時間計測"
End Sub
Sub 時間計測()
    Range("A1").Value = Now + TimeValue("00:00:10")
     Application.OnTime Range("A1").Value, "タイム表示"

 End Sub

 Sub タイム表示()
Dim buf1 As Long, buf2 As Date
    buf1 = Range("A1")
    buf2 = Range("A1")

    Application.OnTime Range("A1").Value, "タイマー開始"

 End Sub

 Sub タイマー開始()

    Range("A1").Value = Now - TimeValue("00:00:10")
    Application.OnTime Range("C3").Select, "セルの選択"

 End Sub

Sub セルの選択()

     MsgBox "計 算 や め"
     Worksheets("Sheet1").Activate
     Range("G2").Activate

 End Sub

 

 ◎ ご質問の答えになっていますでしょうか? 引き続きよろしくお願いします。

 

(やま) 2014/09/14(日) 13:11


 (Mook)さん 2014/09/14(日) 10:08

 ◎ 追加です。

 新たに作成したファイルで、勉強させていただいた「OnTimeの操作」の件です。
 「時間計測」のマクロ実行をクリックすれば、「一連の動作」をしましたので、報告しておきます。
(やま) 2014/09/14(日) 13:36

 いろいろと提示いただいていますが、テストで行っているコードと実際の目的に適用する
 コードが混在しているようですね。

 時間を指定して処理をしたいという、当初の質問は回答が得られたでしょうか。

 確認が必要でしたら、テストコードは終了して、最終的な処理コードのみの提示をして
 はどうかと思います。
(Mook) 2014/09/14(日) 15:09

 (Mook)さん 2014/09/14(日) 15:09

 ◎ 新ファイルのコードを報告しますので、よろしくお願いします。

 ◎ A1=タイム表示中  C3=問題(数字)の回数を入力して、呼び出した数字を表示させる。

 未入力の場合は「問題枠」のみを表示している。
 G2セル=生徒番号入力(ここの入力で、判定などを表示させる。)=セルの書式設定で。
 シート名=回数入力 としています。 

 ◎ 以下が ThisWorkbook の記述です。(前に完成しているファイルで問題(数字)のみを修正した。

・・・・・・・・・・・・・・・・・・・・

 Private Sub Workbook_Open()
'一旦、シート保護を解除
ActiveSheet.Unprotect
'シート保護を設定(Ulのみ)
ActiveSheet.Protect UserInterfaceOnly:=True

 ActiveSheet.EnableSelection = xlUnlockedCells

ActiveWindow.ScrollRow = 1

End Sub

Sub ボタン3_Click()
Dim r As Variant

  If Range("G2").Value <> "" And Range("I2").Value <> "" Then
    r = Application.Match(Range("G2").Value, Range("T13:T44"), 0)
    If IsError(r) Then Exit Sub
    Range("T13:T44").Cells(r).End(xlToRight).Offset(, 1).Value = Range("I2").Value

  End If

End Sub

Sub ボタン2_Click()

Dim r As Variant

 Range("D14:H14,D28:H28,D42:H42,G2").ClearContents

End Sub

 Sub ボタン5_Click()

 Worksheets("回数入力").Range("C3").Select

  ActiveWorkbook.Save

'シートを保護

 Worksheets("回数入力").Protect

End Sub

 ・・・・・・・・・・・・・・・・・・・・・・・・・・

 ◎ Sub 回数入力()  これは 削除しました。 

   Sub 回数入力()        

 Application.OnTime Range("C3").Select, "時間計測"
End Sub

 ・・・・・・・・・・・・・・・・・・・・・・・・・・・

 ◎ 以下が、Module1の記述です。
 
Sub 時間計測()
    Range("A1").Value = Now + TimeValue("00:00:10")
     Application.OnTime Range("A1").Value, "タイム表示"

 End Sub

 Sub タイム表示()
Dim buf1 As Long, buf2 As Date
    buf1 = Range("A1")
    buf2 = Range("A1")

    Application.OnTime Range("A1").Value, "タイマー開始"

 End Sub

 Sub タイマー開始()

    Range("A1").Value = Now - TimeValue("00:00:10")
    Application.OnTime Range("C3").Select, "セルの選択"

 End Sub

Sub セルの選択()

     MsgBox "計 算 や め"
     Worksheets("回数入力").Activate        → Sheet1 を変更しています
     Range("G2").Activate

 End Sub

 ◎ この状況で、「時間計測」マクロを「実行」クリックで、10秒後「計算やめ」「Ok」でG2セルへ
 いきます。 何度も 何度も 恐縮です。

(やま) 2014/09/14(日) 16:28


 全体のシート構成の説明が欲しいですね。
 「回数入力」のシート以外に何があるのでしょうか。

 C3 に入力して ENTER を押したら開始とありますが、今のつくりからは「開始」ボタンを
 置き、それを押したら処理を開始するのが良いように思います。
 ボタンの作成と、マクロの登録は出来ているようなので。

 Sub 時間計測()
 Sub タイム表示()
 Sub タイマー開始()

 の三段構えは冗長なので「開始」ボタンを作成して、そこに「タイマー開始」を登録して、
 後の二つは削除してよいと思います。

 時間を記録する A1 は見えるとカッコ悪いので、「非表示シート」というシート(名前は
 自由で良いです)を作成しておけば
     Worksheets("非表示シート").Range("A1").Value = Now + TimeValue("00:03:00")
     Application.OnTime Worksheets("非表示シート").Range("A1").Value, "セルの選択"
 のようにできます。
 シートは非表示にしておけばよいでしょう(処理上は問題ありません)。

 ですので、標準モジュールは

 Sub タイマー開始()
     Worksheets("非表示シート").Range("A1").Value = Now + TimeValue("00:03:00")
     Application.OnTime Worksheets("非表示シート").Range("A1").Value, "セルの選択"
 End Sub

 Sub セルの選択()
     MsgBox "計 算 や め"
     Worksheets("回数入力").Activate        → Sheet1 を変更しています
     Range("G2").Activate
 End Sub

 だけでよいでしょう。

(Mook) 2014/09/14(日) 17:43


 (Mook)さん 2014/09/14(日) 17:43

 ◎ いつも迅速にご教示を頂いて、まるでチャットのような感じで修正作業をしています。 感謝です!

 > 全体のシート構成の説明が欲しいですね。

 「回数入力」のシート以外に何があるのでしょうか。 → 「回数入力」このシート1つです。

 ◎ 今回の詳細なご教示の中で、一つだけ我がままをお許しください。

 >  C3 に入力して ENTER を押したら開始とありますが、今のつくりからは「開始」ボタンを
 置き、それを押したら処理を開始するのが良いように思います。
 ボタンの作成と、マクロの登録は出来ているようなので。

 ◎ 今までにも「はじめ」と「やめ」のボタンで「経過タイム計測」はしていますが、今回は開始後3分で
 「やめ」が目的でした。今、ご指示の方法も良いのですが、「不正行為」が出来てしま
 います。(計算を始  めておいて途中で「はじめ」ボタンをクリックなどが可能になら
 ないか?)

 ◎ 折角、詳細に書いて頂いておりますので、これからこの方法で「別ファイル」で作
 成してみます。

 >  時間を記録する A1 は見えるとカッコ悪いので、「非表示シート」というシート(名前は自由で良いで
 す)を作成しておけば

 ◎ 当該方法は、のちの為にも印刷して保存しておきます。実は、計算問題を作成していて回答セルの「文
 字色を白色」にするワザ?を利用していますので、この度も「A1セル」は、白色で見えなくしました。

 引き続きよろしくお願いします。

(やま) 2014/09/15(月) 09:03


 一シートしかないのであれば
 >    Worksheets("回数入力").Activate        → Sheet1 を変更しています
 は不要です。このコードはシートを切り替えるために使用するものなので。
 今後の課題は、現在使用しているコードの一文一文の理解でしょうか。

 時間を指定して処理をする、というのが終わったのであれば、他の問題は別に質問を建て
 てはと思います。
 後から参考にする人(将来のご自身)にとっては、延々と質問が続くより、リンクを置いて
 一問一葉のほうが見やすいと思います。

 もし次の問題が
 >C3 に入力して ENTER を押したら開始
 ということでしたら、まずはこのあたりをあたりに目を通してください。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html
 「ボタンにした方が良い」とお勧めしたのは、このあたりの敷居がちょっと高いの
 ではと懸念したこともあります。

 現在は数式で問題を表示しているためにそうなっていると思いますが、
 マクロ処理をしているのであれば、ボタンを押したタイミングで問題を転記する、
 あるいは数式を設定する、といったことも可能です。

 どちらが簡単かは、どっちもどっちですけれど。

 以下質問に直接関係のない雑感ですけれど、
 >今までにも「はじめ」と「やめ」のボタンで「経過タイム計測」はしていますが、
 ・「やめ」をなくしてしまうと、指定時間より早く終わった場合はどうするのでしょう。
   ・時間は1律3分で記録されるのですか?
   ・途中で終わっても3分待たなければいけないのですか?

 ・複数問題があるようですが、個別に3分ということでしょうか?
   ・その場合それぞれに時間記録は個別にできるようになっていますか?
   ・同じ番号を指定して、同じ問題を再度解ける場合、これは「不正」ですか?

 処理を複雑にすると、いろいろな懸念が発生します。
 そのあたりを勘案して、「シンプル」に作成して運用に依存するのも一つの方法だと
 思います。
(Mook) 2014/09/15(月) 11:40

 (Mook)さん 2014/09/15(月) 11:40

 あれ! 当方の送信と時間がバッティング? 送れていないのならば、再度かきますが。
 ボタンの方法で WinXP Excel2003Pc で 成功しましたの「報告」とタイムスケジュール解除の件 
(やま) 2014/09/15(月) 11:58

 (Mook)さん 2014/09/15(月) 11:40

 ◎ やはり、同時だったんですね!再度書きます。

 ボタンでの方法では、成功しました。の報告と、タイムスケジュールの解除についての確認でした。
 A1に表示されているタイム前に、コードの記述をする事と解釈。タイムを3分に変更した際に、時間計測の
 マクロ実行して、コードを記述しました。下記でよろしいでしょうか? この確認だけお願いします。

 ◎ なお、直前にご提示いただきました件は、ゆっくり勉強させて頂きます。
 ◎ 長期にわたるご親切なアドバイスに感謝しております。1を聞いて10を知るの真逆の○○高齢者を
 相手に、よくぞご指導をくださいました。それでは、最後の1件のみお願いします。

  
(やま) 2014/09/15(月) 12:16


 うん? コードはどこでしょうか。
 OnTime に関する質問はここで継続した方が良いですね。

 解除は、先にも提示したかな、と思いますが、
 >     Application.OnTime Range("A2").Value, "タイム表示",, False
 設定した時間を指定して、第4引数に False を追加すれば、解除になります。

 ただ設定した時間を経過した場合、意味がないので

 Sub 途中終了()
    If Now >  Range("A2").Value Then
        Application.OnTime Range("A2").Value, "タイム表示",, False
    End If
 End Sub

 か、あまり推奨はしませんが
 Sub 途中終了()
    On Error Resume Next '// エラーが出ても無視する:意図しないエラーは見つからないので非推奨
        Application.OnTime Range("A2").Value, "タイム表示",, False
    On Error Goto 0
 End Sub
 ということもできます。

(Mook) 2014/09/15(月) 12:47


(Mook)さん 2014/09/15(月) 12:47

 >うん? コードはどこでしょうか。

 ◎ 失礼しました。急いで書き直しでコピペを忘れてしまいましたね。

 Sub タイマー開始()
 Range("A1").Value = Now + TimeValue("00:03:00")
    Application.OnTime Range("A1").Value, "セルの選択"
    Application.OnTime Range("A1").Value, "セルの選択", , False

 End Sub

 ◎ 「開始」ボタンをクリック 3分後の「計算やめ」のmsgBoxが出現して、そのまま、放置しておくと
 再度MsgBoxが出現しなければ、解除はエラーでは無いと言う事でよろしいでしょうか? 現況=OK
 ◎ 色々と 勉強になりました。感謝です!
(やま) 2014/09/15(月) 14:02

 解除しなければ処理されて、解除すれば処理がされないのであれば、期待通りの処理になった
 と思います。

 今回は同じ処理の中でやってしまっていますが、これを分けて必要に応じて「解除だけ」と
 して使用できるようにすれば目的は達せられると思います。
(Mook) 2014/09/16(火) 10:07

 (Mook)さん 2014/09/16(火) 10:07

 ◎ 何度も、ご丁寧なご教示をいただき有り難うございました。お陰でファイルの完成をみました。
(やま) 2014/09/16(火) 14:42

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.