VBA一定間隔beepプログラム表示が更新されなく

このQ&Aのポイント
  • VBAを使用して、セルにセットした時間の間隔でbeepを鳴らすプログラムを作成しました。しかし、beepは正常に鳴りますが、現在時間をセットしているセルの表示が途中から更新されなくなってしまいます。どのような対策が考えられるでしょうか。
  • VBAを使用して、セルにセットした時間の間隔でbeepを鳴らすプログラムを作成しました。beepは最後まで鳴りますが、現在時間をセットしているセルの表示が途中から更新されなくなってしまいます。自動計算はOFFになっています。この問題をどのように解決すればよいでしょうか。
  • VBAを使用し、セルにセットした時間の間隔でbeepを鳴らすプログラムを作成しました。しかし、beepは最後まで正常に鳴りますが、現在時間をセットしているセルの表示が途中から更新されなくなってしまいます。自動計算はOFFになっています。どのように修正すれば良いでしょうか。
回答を見る
  • ベストアンサー

VBA一定間隔beepプログラム表示が更新されなく

セルにセットした時間の間隔でbeepを鳴らすプログラムを作りました. beepは最後まで鳴りますが,現在時間をセットしているセルの表示が途中から更新されなくなってしまいます.それ前に砂時計マーク(くるくるマーク)が出ます.beepだけは最後まで正常になります.一応,自動計算はOFFにしています.何か対策はないものでしょうか. Sub timenotice() 'B3セルの時間(秒)置きに,C3セルの時間まで繰り返してBeepを鳴らす '簡略化のため,日をまたぐ時刻には実行しないことを前提にする '現在時刻はD3に,次にならす時間をE3に表示する Dim t, t0 As String '現在時刻,スタート時刻(文字列) Dim tv, tv0, tv1, delt, stept, endt '現在時間,スタート時間,次にならす時間,経過時間,beep間隔,終了時間(sec) Application.Calculation = xlCalculationManual stept = Range("B3").Value 'beep間隔を得る endt = Range("C3").Value '終了時間を得る t0 = time 'スタート時刻を得る tv0 = 60 * (60 * Hour(t0) + Minute(t0)) + Second(t0) 'スタート時刻を秒に変換 For delt = 0 To endt Step stept 'beep間隔ごとに次にならす時間を繰り返す tv1 = tv0 + delt '次に鳴らす時間をセット Range("E3").Value = tv1 - tv0 '経過時間とセルに表示 t = time '現在時刻をセット tv = 60 * (60 * Hour(t) + Minute(t)) + Second(t) '現在時刻を秒に変換 Do While tv < tv1 '次にbeepを鳴らす時間を待つ t = time '現在時刻を得る tv = 60 * (60 * Hour(t) + Minute(t)) + Second(t) '現在時刻を秒に変換 Range("D3").Value = tv - tv0 '現在時間をセルに表示 Loop '時間待ちの繰り返し Beep 'beepを鳴らす Next delt '次のbeep時間に進む Application.Calculation = xlCalculationAutomatic MsgBox "時間カウントを終了しました" End Sub

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

  • ベストアンサー
  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

砂時計マークを改善するには「DoEvents」というのを入れて下さい。 Beep 'beepを鳴らす の文の直前に入れてみてください、それで砂時計マークは改善します。

furafurax
質問者

お礼

うまくいきました.ありがとうございました.あわせてDoEventsの役割も理解できました.

関連するQ&A

  • 一定間隔の時間で鳴って止まるアラーム、タイマー

    任意の時刻からスタートさせて、あらかじめ設定した一定間隔の時間でアラームが鳴るリマインダー、タイマーのようなアプリやハードウェアをさがしています。 毎日決まった時刻ならその数だけアラームを携帯やら時計やらで設定しておけば良いのですが、スタート時刻が毎日マチマチな任意の時刻からにしたいので、例えばiphone5付属のリマインダーだと、その都度毎日8~9個を設定するのが面倒なため、スタートボタンを押すだけであとはそこから2時間ごとに鳴ってくれるとありがたいのです。 例えば「2時間」と設定しておいて 7時25分スタート ↓ 9時25分に1回鳴って自動で止まる ↓ 11時25分に1回鳴って自動で止まる ↓ ↓ 2時間ごとに23時25分まで繰り返し というカンジです。 7時25分というのが、ある日は8時40分だったり6時5分だったり、そこからの2時間ごとという事です。 且つ、何秒か鳴った後に自動で止まってくれるとありがたいです。 スタートさせるのは手動スタート or あらかじめ時刻設定しておく、どちらでも選べると良いのですが。 何か情報お持ちの方、よろしくお願いします。

  • Excel VBA 一定の数値以下で音を鳴らす

    一つのセル内の数値(VBAにより、1秒ごとに更新される流動的な数値です)において、-2以下になるとすぐにBEEP音が鳴る設定をしたいのですが、何故か1分ごとにしか鳴りません。 今のモジュールは、標準モジュールに Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Sheet1に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Range("Q6") < -2 Then Call Beep(2000, 500) Call Beep(2000, 500) End If End If End Sub と入力しています。 改善方法をどうかご教授願います。

  • 指定した時刻と時間間隔を表示するVBA

    'カレンダーフォームのVBA If Intersect(Target, Range("BP1")) Is Nothing Then Exit Sub If MsgBox("日付を記入するためカレンダーを表示させます、よろしいでしょうか?", vbYesNo) = vbNo Then Exit Sub Else End If ' カレンダーフォームを起動する Call ShowCalendarFromRange2(Target) End Sub セルBP1を選択するとあらかじめ作成していたカレンダーフォームが起動され指定した日付を選択出来るVBAが入っています。 質問ですがカレンダーで日付を選択した後に直ぐinput boxを使用し「指定した時間(〇〇:〇〇)を入力して下さい。」と表示させ、指定した時間をCO14に表記させます。(例えば8:00と入力したらCO14に8:00と表示される様にします。) 次にもう一度input boxを使用し今度は「先ほど指定した時刻からの時間間隔(〇〇分)を入力して下さい。」と表示させ、CO15~CO37に指定した時間間隔を自動で表示させます。(例えば5分と入力したらCO15には8:05、CO16には8:10・・・とinput boxでしていた時間間隔を自動で表示させます。) この様なVBAはどの様にすれば宜しいでしょうか?

  • VBA 5分間間隔でデータ記録

    こんにちわ。 いつも諸先輩方に教えて頂きありがとうございます。 感謝しております。 早速ですが以下のようなVBを教えてもらいまして、 C3のセルにリアルタイムで変化する数字があります。 それを、3秒おきに時間とともにC6から順に記録して 1分間溜まったら、 E6に時間、 F6その1分間の最初の値、 G6にその1分間での最高値 H6にその1分間での最低値 I6にその1分間での最後の値 が順番に記録されるようになっております。    このマクロを改正して、  (1)1秒感覚でC3から下へ順に記録。  (2)5分間隔でE6^I6に4種の値を下へ順に記録   (このデータはずっと起動している間は下へ記録し続けたいです)   というように変更したいのですがうまくいかず、四苦八苦しておりました。 お忙しいところ申し訳ありませんが、 ヒントなるものでも結構ですので教えて頂ければ幸いです。 以上宜しくお願いいたします。       UNO     ========================================================= Option Explicit Public STOP_B As Boolean Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub ストップ() STOP_B = False End Sub Sub スタート() Dim i As Integer Dim t As Integer Dim n As Integer Dim R As Range Dim timenow As Variant i = 6 n = 6 STOP_B = True Do While True t = 0 timenow = Format(Now(), "HH:mm") While t < 300 Call Sleep(10) DoEvents t = t + 1 Wend If timenow = Format(Now(), "HH:mm") Then Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 Else Sheet1.Cells(n, 5).Value = timenow Sheet1.Cells(n, 6).Value = Sheet1.Cells(6, 3).Value Set R = Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)) Sheet1.Cells(n, 7).Value = WorksheetFunction.Max(R) Sheet1.Cells(n, 8).Value = WorksheetFunction.Min(R) Sheet1.Cells(n, 9).Value = Sheet1.Cells(i - 1, 3).Value Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)).Clear i = 6 Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 n = n + 1 End If If STOP_B = False Then Exit Sub End If Loop End Sub Function xSleep(ByVal dwMilliseconds As Long) Call Sleep(dwMilliseconds) End Function =====================================================

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • 外部linkのセル時間値が0.125 などで 

    外部linkの 時間値が 0.125 と言うデータです。 これに対して If Minute(Me.Range("$b$2").Value) / 5 = Int(Me.Range("$b$2").Value) / 5) これだと、変数の型が一致しない エラー13 となります。 Dim linkdate As Date linkdate = Me.Range("$b$2").Value If Minute(linkdate) / 5 = Int(linkdate) / 5) でも 同じエラーです。 LINKのセル表示は 普通の時間に変えてはあるのですが、持ってくる値は 0.125 などの数値になります。 ご教示いただけると助かります。よろしくどうぞ

  • Excel:列中に特定の文字列を表示するセルが出たらBeep音を鳴らす

    商品の品番の確認作業にエクセルを使っています。 作業の効率化にエクセルVBAを使いたいのですが、うまくいきません。 具体的な使用目的は以下の通りです。  納品された商品には製造メーカーのバーコードがついています。それをエクセルに読み込んで予定通りの商品であるか確認作業を行います。  まず、エクセルシートのA列にメーカーコードを入力しておきます、B列のセルをアクティブにした状態でメーカーのバーコードを読み取ります。するとセルにメーカーコードが自動入力されます。この文字列がA列の文字列と一致した場合にはC列のセルにOKの文字が出るように設定しています。コードが一致しない場合はNGが出ます。  現在はOKかNGかを目で確認しているのですが、商品数が多いので、NGの場合にBeep音が出るようになっていれば作業が早くなります。  過去の質問例を調べて、VBAのAMI関数を使うとBeep音を鳴らせることはわかりました。たとえば、セルC1にNGと表示された場合にBeep音を鳴らす、というところまではできたのですが、列CのいずれかのセルにNGと表示された場合にBeep音を鳴らす、という設定ができません。  わかる方アドバイスお願いします。  ちなみに、セルC1にNGと表示された場合にBeep音を鳴らすには以下のように設定しました。 標準モジュール Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long シートのモジュール Private Sub Worksheet_Change(ByVal Target As Range) If Range("C1") = "NG" Then Call Beep(2000, 500) End If End Sub

  • VBAプログラムについて

    VBAプログラムを本を見ながら作成していますが、はっきりいって素人です。 本に載っていないこととなるとちんぷんかんぷんで、いくつかあるプロシージャのどのプロシージャ内に記入したら良いのか分からないし、新しいプロシージャをどこに記入して良いのか分かりません。 例えば、 ----------------------------------------------------------- Private Sub CommandButton1_Click() ActiveCell.Value = TextBox1.Value ActiveCell.Offset(0, 1).Value = TextBox2.Value ActiveCell.Offset(0, 2).Value = TextBox3.Value ActiveCell.Offset(0, 3).Value = TextBox4.Value ActiveCell.Offset(0, 4).Value = TextBox5.Value ActiveCell.Offset(0, 5).Value = TextBox6.Value ActiveCell.Offset(0, 6).Value = TextBox7.Value ActiveCell.Offset(0, 7).Value = TextBox8.Value ActiveCell.Offset(0, 8).Value = TextBox9.Value ActiveCell.Offset(1, 0).Activate End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub Label1_Click() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() Range("A2").Activate End Sub ---------------------------------------------------------- テキスト入力フォームをいくつか作っており、コマンドボタン1とコマンドボタン2で入力ボタンと閉じるボタンにしています。   このプログラムでは、入力ボタンをクリックすることでデータが入力されて、入力された列のすぐ次の列の最初のセルがアクティブな状態になります。 (1)データ入力済みのエクセルシートにおいて、アクティブな状態にしたセルや列を削除したい場合、どこにどのように書けば良いのでしょうか? (2)データ入力が一度に終わらない時、途中の任意の列から入力を始めたい場合はどこにどのように書けば良いのでしょうか? 本に書かれていることは丸写しできますが、ちょっとでも違うと壁にぶつかってしまいます。 独学で勉強する時に良いと思われる方法はどんな方法なのでしょうか? おこがましいですが素人も分かりやすい説明をして頂けると助かります。 宜しくお願いします。

  • 指定したセルに条件で次の日を表示させるVBAなど

    セルCL4には日付が表示されています。表示形式は〇〇〇〇年〇〇月〇〇日です。(画像参照) 次にセルCL5~CL76には8:00から10分毎の時間が表示されています。表示形式は〇〇:〇〇です。(画像参照) 時刻と時間間隔は固定ではなく任意で変えていきます。 そしてセルCM5~CM76にはCL4の日付とCL5~CL76の時間を一緒に表示させる計算式を入れています。 質問ですがCM6(画像で言えば8:10の右隣のセル)~CM76の範囲で、CL5~CL76の時刻が0:00になった(次の日の日付の時刻になる)か、CL5~CL76のセルに全て同じ時刻が表示(例えばCL5~CL76の時刻が全て8:00と表示)された場合、CM6~CM76に表示される日付と時刻がCM5の日付の次の日へと順番に表示されていく(画像で言えば質問の条件の時にCL6は2017年11月16日〇〇:〇〇、CL7は2017年11月17日〇〇:〇〇・・・。)計算式やVBAはどの様にすれば宜しいでしょうか?

  • 1秒未満間隔のファイル更新について

    皆様 下記のようなプログラム(Perl)で、1秒未満のファイル更新を試みております。sleep(1)として、待ち時間を1秒とすると、data.txtに時刻が更新されますが、sleep(0.8)、sleep(0.5)等として待ち時間を1秒未満にすると、プログラムは動作するのですが、data.txtはファイルとして作成されません。 これは、printf()関数のバッファリング、及びフラッシュに関する仕様に起因するものと思われますが、1秒未満の間隔でdata.txtを更新して時刻をdata.txtに書き込む処理は可能でしょうか? #強制フラッシュの"$| = 1;"を使い、sleep(0.8)としても駄目でした。 すみませんが、よろしくお願いします。 (コード) #use Time::HiRes; #$| = 1; while(){ ($sec, $min, $hour, $day, $mon, $year) = localtime(time); open(OUT, "> data.txt"); printf(OUT "%2s:%2s:%2s\n", $hour, $min, $sec); close(OUT); sleep(1); }

専門家に質問してみよう