こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

タイマー残り時間をExcel Vbaから利用したい

情報処理検定(表計算)用のタイマー付き模擬試験の教材を作りたいと考えています。
大まかなイメージは次のようになります。
生徒がタイマー(自作する)で制限時間を設定し、スタートボタンを押すと作業を開始することができる。制限時間が過ぎるとメッセージを出し、作業は続けることができなくなる。
タイマーの残り時間をExcelのVbaから参照するにはどのような方法があるのか、どなたか教えていただけませんでしょうか。

これに関連しそうなことで、今までに次のことやりました。
(1)Vbaでタイマーを作りました。
時間を設定し、スタートボタンを押すと、残り時間を1秒単位で更新する。残り時間が0になるとメッセージを表示して終了する。
  授業では全く使っていません。タイマーが必要な時は他のフリーのソフトを使っています。

(2)Vbaで制限時間付き英単語入力教材を作りました。
 生徒が制限時間を設定し、スタートボタンを押すと作業を開始でき、英単語が表示され、同じ単語を入力セルに入力、確定すると次の英単語を表示する。以下残り時間が0になるまで作業する。入力したタイミングで残り時間を参照し、0以下になっていれば作業を終了させて、入力数と正解数を記録する。
これは授業で使っています。特に問題はないのですが、残り時間を刻々と表示するタイマーではないので緊迫感に欠けます。

(2)の中で(1)を実現しようと努力はしたのですが、うまくできませんでした。

(3)VisualBasicでタイマーを作りました。
「日経ソフトウエア」2015年8月号の記載のコードを入力しただけですが。

現在は次のようなことができれば、うまくいくのではないかと思い、その方法を探しています。
「自作タイマーとExcelを起動する。タイマーはあるタイミングで共通領域?(ファイル、メモリー、変数?)に残り時間を書き込む。Excel Vbaからあるタイミングで共通領域の値を参照する。」
 全く手探り状態で、つぎのことを調べました。
(4)MSDNで「.NET Framework でのパイプ操作」
「方法: ローカルのプロセス間通信で匿名パイプを使用する」
「方法: ネットワークのプロセス間通信で名前付きパイプを使用する」
に記載されたコードをコピーし、働きを確認できたのですが、それをどう利用したらいいのか今のところよく分かりません。(言語はC#、環境はVisual Studio 2015 Community、OSはWindows 10)

基本的な知識が不足していて、どこから手をつけたらいいのか全く分からない状況です。
ともかく今は、プロセス間通信について調べています。またC#について勉強しています。「独習 C# 第3版」第7章まできました。サンプルコードを入力して確認しているだけですが。

 よろしくお願いします。

投稿日時 - 2016-08-29 10:39:27

QNo.9221720

困ってます

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

こんばんは
どのように組み込めばいいのか分かりませんが、
ユーザーフォームを用意して、
ラベルを一つ、ボタンを3つ用意して、ユーザーフォームのコードに
Option Explicit
Private Sub CommandButton1_Click()
  Dim i As Long
  ' スタートボタンが押された。
  Call Initial
  QIventer = "EWordChoose"
  Range("問題").Value = EwordChoose
  s = Timer
  i = 1
  Do Until Timer - s > t
    Me.Label1.Caption = "残り" & Format(t - Timer + s, "#0.0") & "秒"
    DoEvents
  Loop
End Sub
Private Sub CommandButton2_Click()
  s = Timer - t
End Sub
Private Sub CommandButton3_Click()
  Unload Me
End Sub
こんな感じにコードセットして、標準モジュールの方で、
Public s As Single
Public Const t As Long = 30
Sub test()
  UserForm1.Show 0
End Sub
として、
Private Sub CommandButton1_Click()
  Call test
End Sub
のようにボタンでユーザーフォームを起動します。
ボタン1でタイマーを残り(定数t)30秒からカウントダウンします。
途中で止めるときはボタン2で、閉じる時はボタン3で。
ユーザーフォームをUserForm1.Show 0 で起動すると、表示された状態で
セルに入力出来ます。
Public Sub Initial の中のタイマー関連の設定は外します。
入力シートの
Private Sub Worksheet_Change(ByVal Target As Range)
の中で何をしているのかはっきり分からないですが、タイマーが0になった時の
処理を組み込まないとダメかと思います。

投稿日時 - 2016-09-01 21:17:38

お礼

ushi2015さん、ありがとうございました。
うまく目的を果たすことができました。アドバイスの通りユーザーフォームを作成しました。後、ご指摘の
(1)「Public Sub Initial の中のタイマー関連の設定は外します。」
(2)「入力シートの
Private Sub Worksheet_Change(ByVal Target As Range)
の中で何をしているのかはっきり分からないですが、タイマーが0になった時の
処理を組み込まないとダメかと思います。」
の2か所を変更すれば期待通りに動きました。
(1)その通りにしました。
(2)条件判定の1行だけの変更でOKでした。
本当に助かりました。制限時間付き教材を作るとき是非利用したいと思います。Microsoft Officeのvbaで使えることが分かりましたので、次はWordで試します。

投稿日時 - 2016-09-05 09:45:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

こんにちは
(2)はどのようなマクロになっていますか?

投稿日時 - 2016-08-29 16:01:41

補足

 タイマー関連(といっても終了時刻だけをチェック)のコードを示しました。
 スタート時点で開始時刻と終了時刻を設定し、シート「入力」の二つのセルの更新イベントを使って処理を進めています。
不満な点はタイマーのように残り時間を刻々と表示しないことです。設定作業時間を表示したままなので。

'1 「スタート」ボタンのマクロ ※シート「入力」にある
Private Sub CommandButton1_Click()
' スタートボタンが押された。
Initial

QIventer = "EWordChoose"
Range("問題").Value = EwordChoose
End Sub

'2 終了時刻等を初期設定
Public Sub Initial()
' 処理の最初に必ず実行
Dim tempTime As Date
Dim IsHogoOk As Boolean 'シートが保護できるか

'*** タイマー関連 ***
'終了時刻設定
StartTime = Time
tempTime = DateAdd("n", Range("分"), StartTime)
EndTime = DateAdd("s", Range("秒"), tempTime) '終了時刻
'*** タイマー関連 ***

Set shtAnswer = ActiveWorkbook.Sheets("入力")
Set shtWords = ActiveWorkbook.Sheets("英単語帳") '変わる可能性ある
Set shtScores = ActiveWorkbook.Sheets("英単語タイピング成績") '変わる可能性ある
' sheets("入力")の「change」イベントを引き起こす(呼び出す)オブジェクト、処理名
' イベントを起こす側で、起こす前に値を設定する。フラッグとして利用する
QIventer = "EWordChoose" ' "Cleaner", 他にあれば
AIventer = "User" ' "Cleaner", 他にあれば

'各フラッグ、パラメータ設定
With shtAnswer
.Range("正答数").Value = 0
.Range("解答数").Value = 0
End With
'

'シートの保護
IsHogoOk = Sheet_Protect("入力", "Gauss")
If IsHogoOk = True Then
' MsgBox prompt:="シート「入力」が保護されました。", Buttons:=vbOKOnly
Else
' MsgBox prompt:="シート「入力」が保護できませんでした。", Buttons:=vbOKOnly
End If

IsHogoOk = Sheet_Protect("英単語タイピング成績", "Gauss")
If IsHogoOk = True Then
' MsgBox prompt:="シート「英単語タイピング成績」が保護されました。", Buttons:=vbOKOnly
Else
' MsgBox prompt:="シート「英単語タイピング成績」を保護できませんでした。", Buttons:=vbOKOnly
End If

IsHogoOk = Sheet_Protect("英単語帳", "Gauss")
If IsHogoOk = True Then
' MsgBox prompt:="シート「英単語帳」が保護されました。", Buttons:=vbOKOnly
Else
'' MsgBox prompt:="シート「英単語帳」が保護できませんでした。", Buttons:=vbOKOnly
End If
'

' 日本語訳の表示チェック
' CheckBox1.Value = True

' 入力シート表示
shtAnswer.Activate

End Sub

'3 シート「入力」のChange イベント
Private Sub Worksheet_Change(ByVal Target As Range)
'
' 変更されたセルが問題、解答、それ以外によって処理を分岐する
' 問題(のセル内容)はプログラムからのみ変更可
' 生徒が変更できるのは解答のセル内容のみ
' それ以外のセルはプログラムからのみ変更可
'
Dim score, Qnum As Integer
Dim restTime As Single
Dim IsHogoOk As Boolean 'シートが保護できるか

On Error Resume Next
' Debug.Print Target.Address
' MsgBox prompt:=Target.Address & QIventer & AIventer & "セルが変更されました。", Buttons:=vbOKOnly

Select Case Target.Address
Case Range("問題").Address '問題セルがクリアされたか、または問題が更新された。
' MsgBox prompt:="QIventer=" & QIventer & " AIventer=" & AIventer & "問題セルが更新された。", Buttons:=vbOKOnly

Select Case QIventer
Case "EWordChoose" 'QIventer = "EWordChoose"
' MsgBox prompt:="解答セルが更新されます。By EWordChoose", Buttons:=vbOKOnly
If CheckBox1.Value = True Then
Sheets("入力").Range("日本語訳").Value = JWord '日本語訳更新
Else
'No operation
End If
Sheets("入力").Range("解答").Select '解答にフォーカス
AIventer = "Cleaner"
Sheets("入力").Range("解答").Value = "" '解答をクリア、後このイベントが発生
Case "Cleaner" 'QIventer = "Cleaner"
' MsgBox prompt:="問題セルがクリアされた。By Cleaner", Buttons:=vbOKOnly
Case "Closer"
' MsgBox prompt:="問題セルがクリアされた。By Closer", Buttons:=vbOKOnly
AIventer = "Closer"
Sheets("入力").Range("解答").Value = "" '解答をクリア、後このイベントが発生
Case Else
'No Operation
End Select


Case Range("解答").Address '解答セルがクリアされたか、または生徒が解答を入力した。
' MsgBox prompt:="QIventer=" & QIventer & " AIventer=" & AIventer & " 解答セルが更新された。", Buttons:=vbOKOnly

Select Case AIventer
Case "Cleaner" 'AIventer = "Cleaner"
' MsgBox prompt:="解答セルが更新された。By Cleaner", Buttons:=vbOKOnly
Sheets("入力").Range("解答").Select '解答にフォーカス
AIventer = "User"
Case "User" 'AIventer = "User"
' MsgBox prompt:="解答セルに入力された。By User", Buttons:=vbOKOnly

投稿日時 - 2016-09-01 17:18:27

お礼

補足が遅くなって申しわけありません。タイマーに関係しそうなところだけを簡単に分かりやすく示すことができたか分かりませんが、よろしくお願いします。話はそれますが英単語ピングの説明用にpdfファイルとWordファイルを作ったのですが画像が入っています。OKWAVEでのやりとりで使えますか。

投稿日時 - 2016-09-01 17:30:15

あなたにオススメの質問