『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

まず10秒たってからtest2222と表示させて、次にtestと表示させるプログラムを以下のように作成したのですが、なぜか先にtestが表示されて、次にtest2222が表示されます。
なぜなのでしょうか?
分かる方がいれば教えてください。
よろしくお願いします。

Sub aa()

Application.OnTime Now + TimeValue("00:00:10"), "kara"

MsgBox "test"

End Sub

Sub kara()
MsgBox "test22222"
End Sub

A 回答 (2件)

OnTime は実行を予約するだけで直ぐに次の行に移るようです。


実行を遅らせたいなら Timer を使えば良いかと思います。
    • good
    • 0

こんばんは。



Application.OnTimeで実行がストップはしないので次の行が実行されて表示されるのです。

MsgBox "test" を Sub kara() の MsgBox "test22222" の次に入れるといいのでは?
    • good
    • 0

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

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

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

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

QVBAでのタイマー使用例

お世話になります。

Office2003のエクセルVBAでの質問です。
シートにボタンがあり、ボタンをクリックしたらタイマーが動き出してセル内の数字のカウントアップが始まるってような事を行いたいと考えております。

ボタンを押したらタイマーが動きだし、そのタイマーイベントの中でセル内の数字をカウントアップすると考えたのですが、タイマーの使い方がわかりません。

タイマーを使った簡単なサンプルを教えていただけないでしょうか?

Aベストアンサー

こんにちは。

>VBAではJavaでいうスレッドのようにバックで動くクラスは無いのでしょうか?

Excel VBAの場合は、そういう機能に対するものは、おそらくはクラスとは言わないですが、厳密にはありませんね。

>これだと毎5秒ごとにマクロを実行ができないですよね。なのでスレッドを考えました。

それは出来ますが、ワークシートの作業に対して、完全にバックで動かし、影響をなくすのは難しいです。実際は、以下でいう、'指定時刻に実行するマクロ名' マクロの内容にも依存してきます。このマクロ側が、どういう性格なものか分からないと、ちょっと難しいですね。ここのカテゴリで一番良くある例としては、楽天のRSSがあります。

お礼側に出ていコードに手を加えてみました。

'おそらく、標準モジュールのほうがよいでしょう。

Private MacroStop As Boolean
Sub 指定時刻にマクロを実行する()
Dim myWait As Integer
Dim 指定時刻 As Date
  myWait = 5 '秒
  指定時刻 = Now + TimeSerial(0, 0, myWait)
  If MacroStop = False Then
    Application.OnTime 指定時刻, "指定時刻にマクロを実行する"
    Call 指定時刻に実行するマクロ名
  Else
    MacroStop = False
    End
  End If
End Sub

Sub 指定時刻に実行するマクロ名()
  Cells(1, 1).Value = Cells(1, 1).Value + 1
  
End Sub
Sub タイマー停止()
   MacroStop = True
End Sub

こんにちは。

>VBAではJavaでいうスレッドのようにバックで動くクラスは無いのでしょうか?

Excel VBAの場合は、そういう機能に対するものは、おそらくはクラスとは言わないですが、厳密にはありませんね。

>これだと毎5秒ごとにマクロを実行ができないですよね。なのでスレッドを考えました。

それは出来ますが、ワークシートの作業に対して、完全にバックで動かし、影響をなくすのは難しいです。実際は、以下でいう、'指定時刻に実行するマクロ名' マクロの内容にも依存してきます。このマクロ側が...続きを読む

QOnTimeの取り消しについて

ヘルプには次のように記述がありますが、指定時刻に
実行させるプロシージャーの取り消しはサンプルの手順
で動作しますが、何秒後・・・を指定した場合のサンプル
はうまく取り消せません。"実行時エラー '1004'"と
なります。

この場合、どのように記述すればいいのでしょうか?

使用例
次の使用例は、現在から 15 秒後に my_Procedure を実行します。

Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"
次の使用例は、午後 5 時に my_Procedure を実行します。

Application.OnTime TimeValue("17:00:00"), "my_Procedure"
次の使用例は、前の使用例で設定した OnTime メソッドの設定を取り消します。

Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
Procedure:="my_Procedure", Schedule:=False

ヘルプには次のように記述がありますが、指定時刻に
実行させるプロシージャーの取り消しはサンプルの手順
で動作しますが、何秒後・・・を指定した場合のサンプル
はうまく取り消せません。"実行時エラー '1004'"と
なります。

この場合、どのように記述すればいいのでしょうか?

使用例
次の使用例は、現在から 15 秒後に my_Procedure を実行します。

Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"
次の使用例は、午後 5 時に my_Procedure を実行します。

Application.On...続きを読む

Aベストアンサー

こんばんは。

サンプルを作ってみました。
このように、共通の時刻を、モジュール・スコープの変数を置けばよいかと思います。
これは、サンプルですから、MsgBox を使用していますが、ふつうは必要ありませんね。複数ある場合は、モジュール・スコープの変数を配列にすればよいのではないかと思います。


Dim m_Now As Variant
Sub OnTimeRoutine()
m_Now = Now()
Application.OnTime m_Now + TimeValue("00:00:15"), _
          Procedure:="my_Procedure"
End Sub

Sub my_Procedure()
 MsgBox Format$(Now, "hh:nn:ss")
End Sub

Sub OnTimeSettingOff()
  If Not IsEmpty(m_Now) Then
   On Error Resume Next
   Application.OnTime m_Now + TimeValue("00:00:15"), _
            Procedure:="my_Procedure", _
             Schedule:=False
   
   If Err.Number = 0 Then
     MsgBox "取り消しました。", vbInformation
     Else
     MsgBox "取り消しできませんでした。", vbExclamation
   End If
   On Error GoTo 0
   m_Now = Empty
  Else
   MsgBox "設定されていないか、設定が残っていません。", vbInformation
  End If
End Sub


なお、m_Now 変数の型は、なぜ、Variant か意味が分りますか?Date型を使いませんでした。

こんばんは。

サンプルを作ってみました。
このように、共通の時刻を、モジュール・スコープの変数を置けばよいかと思います。
これは、サンプルですから、MsgBox を使用していますが、ふつうは必要ありませんね。複数ある場合は、モジュール・スコープの変数を配列にすればよいのではないかと思います。


Dim m_Now As Variant
Sub OnTimeRoutine()
m_Now = Now()
Application.OnTime m_Now + TimeValue("00:00:15"), _
          Procedure:="my_Procedure"
End Sub

Sub my_Procedure...続きを読む

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

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:...続きを読む

Qパワポスライドショー実行時のリンクデータ自動更新

パワーポイントでエクセルのデータをリンク貼り付けし、リアルタイムのデータ表示をしています。
しかしスライドショーを実行するとデータが自動更新しません。
ちなみにエクセルデータは随時変動し、パワーポイントでは何枚かのシートを順繰り表示させています。
よい方法はないでしょうか。ご教授よろしくお願いします。
※3/2office系カテゴリーで同内容を質問させていただいています。回答が無いもので…。

Aベストアンサー

「アニメの追加」 → OLEアクションの動作 → どれかを設定し、「直前の動作と同時」にしておきます。

 スライドショー中にエクセルが自動で開きますが
(あらかじめ小さなウィンドウにしておくなどしておき、)
閉じればその後は自動で変更されます。

エクセルを完全に見えない状態にしたいときはExcelVBAとPowerPoint VBAを勉強してください。

Qマクロで待機時間を作りたい

Access2000を使用しております。
AutoExecでマクロ使用時に一つ一つのマクロが移動するまでの時間が早すぎるので、次のマクロを処理するまでの間に待機時間を持たせたいのですが、どのようにするのがよいでしょうか。VBAは詳しくないので、できればマクロで完結できないものでしょうか。

Aベストアンサー

APIのsleepではどうでしょう?
下記の宣言をして、
Sleep n
で、処理を n/1000秒 ストップできます。


Private Declare Sub Sleep Lib "kernel32"
      (ByVal dwMilliseconds As Long)

Sub Main

MsgBox "A"
Sleep 1000 '1秒ストップ
MsgBox "B"

End Sub

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qエクセル VBA セルの個数を所得する

いつも皆様には大変お世話になっております。

早速の質問ですが、

    A    B     C     D     E
1
2       123
3       123
4       123
5       123
6
7       123
とエクセルのセルがなっている場合の
上のB2から下のB7までのセルの個数を所得したいのです
B8以降にも数字が入る場合があるのと間に空白が入る場合があるので
困っています。
B2のセルは固定となっているのでB2からの判別で問題ない状況です。
どうぞ皆様お知恵をお借りしたく思っておりますのでよろしくお願いいたします。

Aベストアンサー

質問が非常に不明確なのですが・・・

所得?取得ですよね?

単にB2:B7のセルの個数をVBAで取得するなら
MsgBox Range("B2:B7").Count

B2:B7の空白でないセルの個数なら
MsgBox Application.CountA(Range("B2:B7"))

B7まででなくB2からB列のデータがある最後までのセル個数なら
MsgBox Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Count

B2からB列のデータがある最後までの空白でないセル個数なら
MsgBox Application.CountA(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row))

QOnTime 使用時のプロシージャへの引数の与え方、その記述方法を教えて下さい。

初心者ですが、宜しくお願いします。

Application.OnTime EarliestTime:=TimeValue(time_ptn), Procedure:="my_func"

上記コードの、末尾のプロシージャの指定において、

Dim prm1 As String, prm2 As Long

Function my_func(prm1,prm2)
   ~内容~
End Function

または、

Sub my_func(prm1,prm2)
   ~内容~
End Sub

というプロシージャを指定したいのですが、
末尾の書き方が分からず困っております。

「Procedure:="my_func(prm1,prm2)"」
「Procedure:= my_func(prm1,prm2)」

のようにやっても、うまくいきません。
正しい書き方をどなたか教えて下さい。

Aベストアンサー

Option Explicit

Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  'MsgBox x
  'Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:=x
  
End Sub

Sub my_func(prm1 As String, prm2 As Long, prm3 As Long)
  MsgBox prm1 & prm2 & prm3
End Sub

Option Explicit

Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  '...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング