Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6831 / 13646 ツリー ←次へ | 前へ→

【42838】エクセルで作業中MsgBox表示 まーくん 06/9/23(土) 1:45 質問[未読]
【42842】Re:エクセルで作業中MsgBox表示 ichinose 06/9/23(土) 10:06 発言[未読]
【42848】Re:エクセルで作業中MsgBox表示 まーくん 06/9/23(土) 11:21 発言[未読]
【42847】Re:エクセルで作業中MsgBox表示 ハチ 06/9/23(土) 11:18 発言[未読]
【42849】Re:エクセルで作業中MsgBox表示 まーくん 06/9/23(土) 11:27 発言[未読]
【42860】Re:エクセルで作業中MsgBox表示 まーくん 06/9/23(土) 14:59 発言[未読]
【42862】Re:エクセルで作業中MsgBox表示 まーくん 06/9/23(土) 15:41 発言[未読]
【42863】Re:エクセルで作業中MsgBox表示 Kein 06/9/23(土) 15:59 回答[未読]
【42867】Re:エクセルで作業中MsgBox表示 まーくん 06/9/23(土) 16:33 発言[未読]
【42870】Re:エクセルで作業中MsgBox表示 Kein 06/9/23(土) 17:24 発言[未読]
【42872】Re:エクセルで作業中MsgBox表示 まーくん 06/9/24(日) 1:34 お礼[未読]

【42838】エクセルで作業中MsgBox表示
質問  まーくん  - 06/9/23(土) 1:45 -

引用なし
パスワード
   皆さん よろしくお願いします。
作業中(仕事中)にMsgBox表示
[#42826] に関連するような内容ですが
例として
10:00に"休憩時間ですよ"
11:55に"そろそろ昼食の時間です"とか
15:00に"お茶の時間ですよ"とか
出したいのですができますか。

【42842】Re:エクセルで作業中MsgBox表示
発言  ichinose  - 06/9/23(土) 10:06 -

引用なし
パスワード
   ▼まーくん さん:
おはようございます。

最近は、歳のせいか週末は寝るのが早くて・・・。

>時間変更の場合を聞きたいのですが(420, 600, 1020, 1200)は
>どういう意味ですかまた、Arrayの意味も?ヘルプだとHasArray、FormulaArray
>CurrentArray、IsArrayただArrayというのは出てきませんが?

↑これについては、
Array()は、配列を作成する関数です。
中の420,600,・・・・は、時刻を分単位に換算した数値です。
8:00------>420分
10:00----->600分

もっともこれは例題としてのコードだったので
Array関数を使って配列を作成しましたが、この配列の数が多い場合や
変更や追加が予想される場合は、このArray関数は使いません。
だって、変更や追加があった場合、コードを直さなければならないですからね!!

変更や追加が予想される場合は、データをコードの外に置きます。
Excelには、シートという便利なデータ領域があるものね!!

例えばアクティブシートのA列及びB列(書式は、共に標準)に
以下のようなデータ配置します。

       A      B
 1     8:00     おはようございます
 2     10:00    休憩時間ですよ
 3     11:55    そろそろ昼食の時間です
 4     15:00    お茶の時間ですよ
 5     17:00    もうかえるよ
 6     20:00    まだ頑張ってるの


標準モジュールに

'========================================================
Sub test()
  Dim rng As Range
  Dim ans As Variant
  Set rng = Range("a1", Cells(Rows.Count, "a").End(xlUp))
  ans = Application.Match(CDbl(Time), rng, 1)
  If IsError(ans) Then ans = rng.Row + rng.Rows.Count - 1
  MsgBox Range("b1").Cells(ans).Value
End Sub

とすれば、時刻やメッセージに変更や追加があっても
シートにデータを変更・追加するだけでコードの変更が要りません。

試してみてください。

【42847】Re:エクセルで作業中MsgBox表示
発言  ハチ  - 06/9/23(土) 11:18 -

引用なし
パスワード
   ▼まーくん さん:
>皆さん よろしくお願いします。
>作業中(仕事中)にMsgBox表示
>[#42826] に関連するような内容ですが
>例として
>10:00に"休憩時間ですよ"
>11:55に"そろそろ昼食の時間です"とか
>15:00に"お茶の時間ですよ"とか
>出したいのですができますか。

横から失礼致します。

これは、
「普通にExcelを操作していて規定の時間になったらメッセージを表示したい」
って意味ですか?

であれば、
定期的に時間をチェックするロジックorOnTimeでスケジュールするとか
必要になってきますのでExcelVBAで実現するには難易度はグッと上がりますよ。

Windowsのタスクのスケジュール機能とかを使ったほうが良いような・・・

検討違いだったら、無視しちゃってください。

【42848】Re:エクセルで作業中MsgBox表示
発言  まーくん  - 06/9/23(土) 11:21 -

引用なし
パスワード
   ▼ichinose さん:
返事ありがとうございます。
時間が来たら表示するには
Sub test()→Sub Auto_Open()で
いいのですか。それとも
Application.OnTime記述方法がわかりません。
よろしくお願いします。
それと下記条件でVBAだけで処理するコードも
教えていただけますか。(シートを使わない方法)
>       A      B
> 1     8:00     おはようございます
> 2     10:00    休憩時間ですよ
> 3     11:55    そろそろ昼食の時間です
> 4     15:00    お茶の時間ですよ
> 5     17:00    もうかえるよ
> 6     20:00    まだ頑張ってるの


>>時間変更の場合を聞きたいのですが(420, 600, 1020, 1200)は
>>どういう意味ですかまた、Arrayの意味も?ヘルプだとHasArray、FormulaArray
>>CurrentArray、IsArrayただArrayというのは出てきませんが?
>
>↑これについては、
>Array()は、配列を作成する関数です。
>中の420,600,・・・・は、時刻を分単位に換算した数値です。
>8:00------>420分
>10:00----->600分
>
>もっともこれは例題としてのコードだったので
>Array関数を使って配列を作成しましたが、この配列の数が多い場合や
>変更や追加が予想される場合は、このArray関数は使いません。
>だって、変更や追加があった場合、コードを直さなければならないですからね!!
>
>変更や追加が予想される場合は、データをコードの外に置きます。
>Excelには、シートという便利なデータ領域があるものね!!
>
>例えばアクティブシートのA列及びB列(書式は、共に標準)に
>以下のようなデータ配置します。
>
>       A      B
> 1     8:00     おはようございます
> 2     10:00    休憩時間ですよ
> 3     11:55    そろそろ昼食の時間です
> 4     15:00    お茶の時間ですよ
> 5     17:00    もうかえるよ
> 6     20:00    まだ頑張ってるの
>
>
>標準モジュールに
>
>'========================================================
>Sub test()
>  Dim rng As Range
>  Dim ans As Variant
>  Set rng = Range("a1", Cells(Rows.Count, "a").End(xlUp))
>  ans = Application.Match(CDbl(Time), rng, 1)
>  If IsError(ans) Then ans = rng.Row + rng.Rows.Count - 1
>  MsgBox Range("b1").Cells(ans).Value
>End Sub
>
>とすれば、時刻やメッセージに変更や追加があっても
>シートにデータを変更・追加するだけでコードの変更が要りません。
>
>試してみてください。

【42849】Re:エクセルで作業中MsgBox表示
発言  まーくん  - 06/9/23(土) 11:27 -

引用なし
パスワード
   ▼ハチ さん:
返事ありがとうございます。
下記の通り作業中時間が来たら表示させたいのですよね。
難しいことなんですか?
ヘルプを調べた結果 Application.OnTime
ではないかと思ったのですが例が少なく
よく解りませんでした・・・
お解りであれば教えて下さい。よろしくお願いします。

>
>横から失礼致します。
>
>これは、
>「普通にExcelを操作していて規定の時間になったらメッセージを表示したい」
>って意味ですか?

はい、その通りです。

>であれば、
>定期的に時間をチェックするロジックorOnTimeでスケジュールするとか
>必要になってきますのでExcelVBAで実現するには難易度はグッと上がりますよ。
>
>Windowsのタスクのスケジュール機能とかを使ったほうが良いような・・・
>
>検討違いだったら、無視しちゃってください。

【42860】Re:エクセルで作業中MsgBox表示
発言  まーくん  - 06/9/23(土) 14:59 -

引用なし
パスワード
   ▼ハチ さん:
▼ichinoseさん:
▼かみちゃんさん:
いろいろありがとうございます。
自分なりに考えてみたのですが
Sub Sample1()
  Application.OnTime Now() + TimeValue("00:00:05"), "おはようございます"
End Sub

Sub おはようございます()
  MsgBox "おはようございます"
End Sub

作業中(仕事中)に時間が来たらMsgBox表示
例として
10:00に"休憩時間ですよ"
11:55に"そろそろ昼食の時間です"とか
15:00に"お茶の時間ですよ"とか
出したいのですができますか。

ちょっと上記コードだと違うようなきがすのです


>横から失礼致します。
>
>これは、
>「普通にExcelを操作していて規定の時間になったらメッセージを表示したい」
>って意味ですか?
>
>であれば、
>定期的に時間をチェックするロジックorOnTimeでスケジュールするとか
>必要になってきますのでExcelVBAで実現するには難易度はグッと上がりますよ。
>
>Windowsのタスクのスケジュール機能とかを使ったほうが良いような・・・
>
>検討違いだったら、無視しちゃってください。

【42862】Re:エクセルで作業中MsgBox表示
発言  まーくん  - 06/9/23(土) 15:41 -

引用なし
パスワード
   ▼まーくん さん:
▼ハチ さん:
▼ichinoseさん:
見よう見まねで下記作ってみたのですが
時間に表示はするのですが10秒経過したら閉じて
作業中のシートをアクティブにするをやりたいのですがうまくいきません。
またコードを少しシンプルにしたいのですが出来るでしょうか。
よろしくお願いします。

Option Explicit
Sub Auto_Open()
  Application.OnTime TimeValue("08:35:00"), "おはようございます"
  Application.OnTime TimeValue("11:55:00"), "そろそろ昼食の時間です"
  Application.OnTime TimeValue("15:10:00"), "こんにちわ"
  Application.OnTime TimeValue("15:15:00"), "休憩終了です"
  Application.OnTime TimeValue("16:30:00"), "終了時間です"
End Sub

Sub おはようございます()
  MsgBox "おはようございます"
  Application.Wait Now + TimeValue("00:00:10")
End Sub
Sub こんにちわ()
  MsgBox "こんにちわ"
  Application.Wait Now + TimeValue("00:00:10")
End Sub
Sub そろそろ昼食の時間です()
  MsgBox "そろそろ昼食の時間です"
  Application.Wait Now + TimeValue("00:00:10")
End Sub
Sub 休憩終了です()
  MsgBox "休憩終了です"
  Application.Wait Now + TimeValue("00:00:10")
End Sub
Sub 終了時間です()
  MsgBox "終了時間です"
  Application.Wait Now + TimeValue("00:00:10")
End Sub

【42863】Re:エクセルで作業中MsgBox表示
回答  Kein  - 06/9/23(土) 15:59 -

引用なし
パスワード
   ブックを起動したとき、スケジュールを重複設定しないためと、
処理時間をチェックするためのフラグを、先頭シートのIV1:IV3セル
に入力します。また、エクセルのMsgBoxではいちいちボタンを押すか
Enterキーを押さないと消えないので、万が一消し忘れても大丈夫
なように、WSHのPopUpメソッドを使って"7秒後に自動的に消える"
タイマー付きメッセージにしてみました。(表示時間は、Popupメソッドの
第二引数で設定します。ただし、あまり正確ではないようです。)

Sub Auto_Open()
  Dim MyR As Range

  Set MyR = Worksheets(1).Range("IV1:IV3")
  With Application
   If .Count(MyR) > 0 Then GoTo ELine
   If IsEmpty(MyR.Cells(1)) And _
   Time < TimeValue("10:00:00") Then
     .OnTime TimeValue("10:00:00"), "MyScd"
     MyR.Cells(1).Value = "10:01:00"
   End If
   If IsEmpty(MyR.Cells(2)) And _
   Time < TimeValue("11:55:00") Then
     .OnTime TimeValue("11:55:00"), "MyScd"
     MyR.Cells(2).Value = "11:56:00"
   End If
   If IsEmpty(MyR.Cells(3)) And _
   Time < TimeValue("15:00:00") Then
     .OnTime TimeValue("15:00:00"), "MyScd"
     MyR.Cells(3).Value = "15:01:00"
   End If
  End With
ELine:
  Set MyR = Nothing
End Sub

Sub MyScd()
  Dim WshShell As Object

  Set WshShell = CreateObject("WScript.Shell")
  With Worksheets(1)
   If Time < .Range("IV1").Value Then
     WshShell.Popup "休憩時間ですよ", 7, , 64
     .Range("IV1").Clear
   ElseIf Time < .Range("IV2").Value Then
     WshShell.Popup "そろそろ昼食の時間です", 7, , 64
     .Range("IV2").Clear
   ElseIf Time < .Range("IV3").Value Then
     WshShell.Popup "お茶の時間ですよ", 7, , 64
     .Range("IV3").Clear
   End If
  End With
  Set WshShell = Nothing
End Sub

【42867】Re:エクセルで作業中MsgBox表示
発言  まーくん  - 06/9/23(土) 16:33 -

引用なし
パスワード
   ▼Kein さん:
返事ありがとうございます。
おぉ急に難しくなりましたね。
ちょっと理解不能状態ですときに
早速時間を変えて試したのですが"7秒後に自動的に消える"
が消えません。どうしてなんでしょうか。
約2分待ちましたが消えません。
いかがでしょうか・・・・・
ちなみに下記で実行しました。
Sub Auto_Open()
  Dim MyR As Range

  Set MyR = Worksheets(1).Range("IV1:IV4")
  With Application
   If .Count(MyR) > 0 Then GoTo ELine
   If IsEmpty(MyR.Cells(1)) And _
   Time < TimeValue("10:00:00") Then
     .OnTime TimeValue("10:00:00"), "MyScd"
     MyR.Cells(1).Value = "10:01:00"
   End If
   If IsEmpty(MyR.Cells(2)) And _
   Time < TimeValue("11:55:00") Then
     .OnTime TimeValue("11:55:00"), "MyScd"
     MyR.Cells(2).Value = "11:56:00"
   End If
   If IsEmpty(MyR.Cells(3)) And _
   Time < TimeValue("15:00:00") Then
     .OnTime TimeValue("15:00:00"), "MyScd"
     MyR.Cells(3).Value = "15:01:00"
   End If
   If IsEmpty(MyR.Cells(4)) And _
   Time < TimeValue("16:25:00") Then
     .OnTime TimeValue("16:25:00"), "MyScd"
     MyR.Cells(4).Value = "16:26:00"
   End If
  End With
ELine:
  Set MyR = Nothing
End Sub

Sub MyScd()
  Dim WshShell As Object

  Set WshShell = CreateObject("WScript.Shell")
  With Worksheets(1)
   If Time < .Range("IV1").Value Then
     WshShell.Popup "休憩時間ですよ", 7, , 64
     .Range("IV1").Clear
   ElseIf Time < .Range("IV2").Value Then
     WshShell.Popup "そろそろ昼食の時間です", 7, , 64
     .Range("IV2").Clear
   ElseIf Time < .Range("IV3").Value Then
     WshShell.Popup "お茶の時間ですよ", 7, , 64
     .Range("IV3").Clear
   ElseIf Time < .Range("IV4").Value Then
     WshShell.Popup "終了時間ですよ", 7, , 64
     .Range("IV4").Clear
   End If
  End With
  Set WshShell = Nothing
End Sub


>ブックを起動したとき、スケジュールを重複設定しないためと、
>処理時間をチェックするためのフラグを、先頭シートのIV1:IV3セル
>に入力します。また、エクセルのMsgBoxではいちいちボタンを押すか
>Enterキーを押さないと消えないので、万が一消し忘れても大丈夫
>なように、WSHのPopUpメソッドを使って"7秒後に自動的に消える"
>タイマー付きメッセージにしてみました。(表示時間は、Popupメソッドの
>第二引数で設定します。ただし、あまり正確ではないようです。)
>
>Sub Auto_Open()
>  Dim MyR As Range
>
>  Set MyR = Worksheets(1).Range("IV1:IV3")
>  With Application
>   If .Count(MyR) > 0 Then GoTo ELine
>   If IsEmpty(MyR.Cells(1)) And _
>   Time < TimeValue("10:00:00") Then
>     .OnTime TimeValue("10:00:00"), "MyScd"
>     MyR.Cells(1).Value = "10:01:00"
>   End If
>   If IsEmpty(MyR.Cells(2)) And _
>   Time < TimeValue("11:55:00") Then
>     .OnTime TimeValue("11:55:00"), "MyScd"
>     MyR.Cells(2).Value = "11:56:00"
>   End If
>   If IsEmpty(MyR.Cells(3)) And _
>   Time < TimeValue("15:00:00") Then
>     .OnTime TimeValue("15:00:00"), "MyScd"
>     MyR.Cells(3).Value = "15:01:00"
>   End If
>  End With
>ELine:
>  Set MyR = Nothing
>End Sub
>
>Sub MyScd()
>  Dim WshShell As Object
>
>  Set WshShell = CreateObject("WScript.Shell")
>  With Worksheets(1)
>   If Time < .Range("IV1").Value Then
>     WshShell.Popup "休憩時間ですよ", 7, , 64
>     .Range("IV1").Clear
>   ElseIf Time < .Range("IV2").Value Then
>     WshShell.Popup "そろそろ昼食の時間です", 7, , 64
>     .Range("IV2").Clear
>   ElseIf Time < .Range("IV3").Value Then
>     WshShell.Popup "お茶の時間ですよ", 7, , 64
>     .Range("IV3").Clear
>   End If
>  End With
>  Set WshShell = Nothing
>End Sub

【42870】Re:エクセルで作業中MsgBox表示
発言  Kein  - 06/9/23(土) 17:24 -

引用なし
パスワード
   メッセージはちゃんと出ているのに、自動的に消えないのでしょーか ?
残念ながらそれだと原因は分かりません。バグとしか言いようがないので。
いちおう↓のマクロでテストしてみて下さい。これはSet_Scdを任意の
タイミングで実行できます。実行してから30秒後にMyScd2が呼び出されます。

Sub Set_Scd()
  Application.OnTime Time + TimeValue("00:00:30"), "MyScd2"
  Worksheets(2).Range("IV1").Value = Time + TimeValue("00:00:40")
End Sub

Sub MyScd2()
  Dim WshShell As Object

  Set WshShell = CreateObject("WScript.Shell")
  With Worksheets(2).Range("IV1")
   If Time < .Value Then
     WshShell.Popup "終了時間ですよ", 7, , 64
   End If
   .Clear
  End With
  Set WshShell = Nothing
End Sub

こちらでテストしたかぎりでは、問題なく動作しましたが。

【42872】Re:エクセルで作業中MsgBox表示
お礼  まーくん  - 06/9/24(日) 1:34 -

引用なし
パスワード
   ▼Kein さん:
返事遅くなりましてすみません。
できました。ありがとうございました。
わたしにはとても思いつかないコードです。
また解らないこと相談にのって下さい。

>メッセージはちゃんと出ているのに、自動的に消えないのでしょーか ?
>残念ながらそれだと原因は分かりません。バグとしか言いようがないので。
>いちおう↓のマクロでテストしてみて下さい。これはSet_Scdを任意の
>タイミングで実行できます。実行してから30秒後にMyScd2が呼び出されます。
>
>Sub Set_Scd()
>  Application.OnTime Time + TimeValue("00:00:30"), "MyScd2"
>  Worksheets(2).Range("IV1").Value = Time + TimeValue("00:00:40")
>End Sub
>
>Sub MyScd2()
>  Dim WshShell As Object
>
>  Set WshShell = CreateObject("WScript.Shell")
>  With Worksheets(2).Range("IV1")
>   If Time < .Value Then
>     WshShell.Popup "終了時間ですよ", 7, , 64
>   End If
>   .Clear
>  End With
>  Set WshShell = Nothing
>End Sub
>
>こちらでテストしたかぎりでは、問題なく動作しましたが。

6831 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free