芸人が音声解説 「オレたちの甲子園」

こんにちは。わかる方教えて下さい。

Excelで作成したいのですが、セルA1とA2に時間(例:13:00と14:00)をそれぞれ入力。
その時刻になったら音を鳴らして知らせるようにしたいと思っています。

いろいろサイトをみていますが初心者なのでよくわかりません。

OnTimeを使用したらよいと記載されているサイトが多いのですが、使い方がいまいちです。

どのようにしたらよいのか教えていただけないでしょうか。

また、それぞれその時間になったらセルA1とA2に色がつくようにできますかよろしくお願いいたします。
参考URL
http://excel-ubara.com/excelvba5/EXCEL104.html

を試してみましたがうまくいきませんでした。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

#1です。



「これとは別に・・・」
何を言っているやら。

ちゃんと色も変わるように作ってあるはずだが、何が不足なんでしょうね。

誰かが作ったものをそのまま使うということではなくて、それを参考にして自分で調べ、考えるのでなければ、思うようなことはできないね。全部誰かに作ってもらうというのであれば、それ相当の対価が必要と思うが。
    • good
    • 0

自動的に実行されるように、A1,A2のあるシートのWorkSheetモジュールに次のChangeイベントを書く。



Private Sub Worksheet_Change(ByVal Target As Range)

If Target = Range("A1") Or Range("A2") Then
SetOnTime
End If

End Sub

標準モジュールに次のようにを書く。始めのPublic Declare は、Beep関数を使えるようにするため。

Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long


Sub SetOnTime()

On Error Resume Next

Application.OnTime Range("A1"), "CallBeep", , False
Application.OnTime Range("A2"), "CallBeep", , False

Application.OnTime Range("A1"), "CallBeep"
Application.OnTime Range("A2"), "CallBeep"

End Sub


Sub CallBeep()

If TimeValue(WorksheetFunction.Text(Now, "h:mm")) = Range("A1") Then
Call Beep(500, 500)
Range("A1").Interior.ColorIndex = 3
End If

If TimeValue(WorksheetFunction.Text(Now, "h:mm")) = Range("A2") Then
Call Beep(1000, 500)
Range("A2").Interior.ColorIndex = 4
End If


End Sub
    • good
    • 1
この回答へのお礼

ご回答いただきありがとうございます。参考にして使用させていただきます。

これとは別に指定した時間(例:13:00)に自動でセルの色を変えることは可能でしょうか。

お礼日時:2014/09/19 23:45

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q時間がきたらポップアップ表示してくれるサービス

12:00、14:00、16:30などの時間が着たら、パソコン(PC)の画面上にホップアップ表示してくれる、無料のWebサービスを探しています。Googleカレンダー以外でシンプルに使えるサービスはないでしょうか?

Aベストアンサー

Windowsに標準で入っているタスクスケジューラでも、単純にメッセージを表示する事は可能です。
こちらのサイトの説明は分かりやすいです。

Epson Direct SHOP - ユーザーサポート - [010662]「タスク スケジューラ」を使用して、指定時間に任意の項目を実行させる(Windows Vista / Windows 7)
http://faq.epsondirect.co.jp/faq/edc/app/servlet/relatedqa?QID=010662

[7]の手順でメッセージの表示を選択します。

最初から入ってるサービスですし、余計なプログラムをインストールしてのトラブルは無いです。

QエクセルVBAにおけるON TIMEメソッドの解除方法について

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマンドボタンがついているフォームを表示する

End Sub

マクロは大まかに記述しましたが以上のようにすると、一度はマクロの作成が成功したように終了するのですが、ブックを開けたままでいると1時間後に自動的にuserform1が表示されてしまいます。また、ブックを閉じていても自動的にオープンし、(マクロを有効にする)をONにするとデバック状態となります。
変数のtimekpを初期化する事で凌げると思ったのですが、うまくいきません。
以前マクロのヘルプを操作している時にON TIMEメソッドを解除する方法が掲載されていたように思うのですが、探し方がマズイのか見つけられませんでした。
マクロの記述方法がマズイのでしょうか?ON TIMEメソッドを解除しない限り、いつまでもこのメソッドは効力を発揮するのでしょうか?
また、ON TIMEメソッドを解除できるメソッドや良い解決方法がありましたら入門書等を片手にマクロを作成している素人にご教授の程お願い致します。

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマ...続きを読む

Aベストアンサー

>ON TIMEメソッドを解除
OnTimeのヘルプはごらんになられましたか?
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Schedule にfalseを設定することで、直前の実行指定を解除することができます。
具体的には
Application.OnTime timekp + TimeValue("1:00:00"),"endform",,false
とでもすればいいです。

QVBAを時間指定で自動実行

就業時間内(9時~6時)でエクセルVBAを指定時間に自動実行させたいです。
エクセルはパソコン起動した朝に、開いておきます。(バックグラウンド)
指定時間になったらVBAを自動実行させたいのです。
指定時間は例えば、
10時11分
10時16分
10時21分 などです。最初の時間から5分間隔で実行。
こういう事はできるのでしょうか?VBAでできるのか?
それ以外の方法があるのか?よくわかりません。
詳しく教えてください。

Aベストアンサー

たとえば、こんなことか。
下記は、1度testを実行すると、15秒たつとtest1を実行し、以後10秒ごとにtest2を実行するというもの。
test1もtest2も単にmsgboxを表示するだけ。

Dim gotime1, gotime2
Sub test()

gotime1 = Time + TimeValue("00:00:15")
gotime2 = gotime1
Application.OnTime gotime1, "test1"
gotime2 = gotime2 + TimeValue("00:00:10")

While gotime2 < gotime1 + TimeValue("00:01:00")
Application.OnTime gotime2, "test2"
gotime2 = gotime2 + TimeValue("00:00:10")
Debug.Print gotime1, gotime2
Wend
MsgBox "start " & Time
End Sub

Sub test1()
MsgBox "test1 " & Time
End Sub

Sub test2()
If Time >= gotime1 + TimeValue("00:01:00") Then
MsgBox "end " & Time
Else
MsgBox "test2 " & Time
End If
End Sub

たとえば、こんなことか。
下記は、1度testを実行すると、15秒たつとtest1を実行し、以後10秒ごとにtest2を実行するというもの。
test1もtest2も単にmsgboxを表示するだけ。

Dim gotime1, gotime2
Sub test()

gotime1 = Time + TimeValue("00:00:15")
gotime2 = gotime1
Application.OnTime gotime1, "test1"
gotime2 = gotime2 + TimeValue("00:00:10")

While gotime2 < gotime1 + TimeValue("00:01:00")
Application.OnTime gotime2, "test2"
gotime2 = gotime2 + TimeValue("00:...続きを読む

QExcelで一定時間が経ったらメッセージを出したい

現在数名で、あるエクセルファイルを使用しています。毎日全員が使うファイルで編集が必要な人以外は読み取り専用で開きますが編集をした人が読み取り専用に戻すのを忘れ次に編集をしたい人がなかなか編集できずに困ることがあります。そこである程度の時間が来たら注意を促すメッセージを画面に表示させる事などはエクセルで出来ますでしょうか?またそれ以外でもこの様な事をうまく処理できる方法はございますでしょうか?お分かりになります方、どうぞよろしくお願いいたします。

Aベストアンサー

Workbookのモジュールに以下マクロを設定
Workbook_Open のとき ReadOnlyなら 起動時刻 利用制限時間(分)後に 利用制限ご注意 の メッセージボックスを表示 :必要なら Msgboxをモーダルにする。

↓Workbookのモジュール↓


Dim 利用制限時間 As Integer

Private Sub Workbook_Open()

If Not ThisWorkbook.ReadOnly Then
利用制限時間 = 10 '分 + 起動時刻:Now
警告時刻 = Now + 利用制限時間 * TimeValue("00:01:00") '分に変換
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意"
End If
End Sub


Private Sub 利用制限ご注意()
警告文 = "共用ファイル「 " + ThisWorkbook.FullName + "」" + vbCrLf
警告文 = 警告文 + " 利用制限時間 " + CStr(利用制限時間) + " 分 を経過しました。" + vbCrLf
警告文 = 警告文 + "保存して、閉じて、読出専用で開いてご利用ください。"
MsgBox 警告文, vbCritical, "共用ファイルの利用について"

End Sub

Workbookのモジュールに以下マクロを設定
Workbook_Open のとき ReadOnlyなら 起動時刻 利用制限時間(分)後に 利用制限ご注意 の メッセージボックスを表示 :必要なら Msgboxをモーダルにする。

↓Workbookのモジュール↓


Dim 利用制限時間 As Integer

Private Sub Workbook_Open()

If Not ThisWorkbook.ReadOnly Then
利用制限時間 = 10 '分 + 起動時刻:Now
警告時刻 = Now + 利用制限時間 * TimeValue("00:01:00") '分に変換
Application.OnTime 警告時刻, "ThisWorkbook.利...続きを読む

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QEXCELのセルへ、デジタル時計を表示できますか?

excelのセルへリアルタイムの時計を表示することは
できるのでしょうか?
=now()では入力時の時刻が落ちるだけですよね・・・

HPではjavascriptなどで比較的簡単のようですが
エクセルでは難しいのでしょうか??

Aベストアンサー

以下の手順でやってみてください。
ワークシートを開き、

1.AltキーとF11キーをいっしょに押してVisualBasicEditorを呼び出します。
2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

Sub test01()
With Sheets("Sheet1").Range("A1")
.Value = Time
.NumberFormatLocal = "h:mm:ss"
End With
Application.OnTime Now + TimeValue("0:00:01"), "test01"
End Sub

3.Alt+F11キーでワークシートへもどります.
4.メニューから、ツール、マクロ、マクロで出てきたマクロ名(test01)を選択して実行します。

これでSheets("Sheet1")のA1に毎秒ごとに時刻が表示されます。

QExcel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい

ExcelでVBAを使いアプリをつくっています。
プログラムを実行させるボタンはもちろんつくれるのですが、
プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。

ボタンに登録できるのはひとつのプロシージャですよね。
とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?

Aベストアンサー

s_husky です。

状況が判明したので再回答!

Public StopNow As Boolean

Public Sub Test()
  Do Until StopNow
    Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1
    Pause 10
  Loop
  If StopNow Then
    MsgBox "Test の実行をストップしました。"
  End If
End Sub

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

Private Sub CommandButton2_Click()
  StopNow = True
End Sub

Private Sub CommandButton1_Click()
  Test
End Sub

起動したプロシージャを止める必要があるということはループ処理と理解。
ならば、ループの条件を操作すれば宜しいかと。
CommandButton1 で起動した Test は CommandButton1 で止めれます。

Application.OnTime TimeValue("16:30:00"), "Test"

で起動しようと同じ理屈。

Application.OnTime は、一種の起動ツール。
当然に停止機能もあるが、停止を制御するには上記のような仕掛けが必要と思います。

s_husky です。

状況が判明したので再回答!

Public StopNow As Boolean

Public Sub Test()
  Do Until StopNow
    Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1
    Pause 10
  Loop
  If StopNow Then
    MsgBox "Test の実行をストップしました。"
  End If
End Sub

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

P...続きを読む


人気Q&Aランキング