忙しい現代人の腰&肩のお悩み対策!

Excel VBAに関するご質問です。2016を使っています。
プロシージャーをミリ単位の時間間隔で繰り返す方法はあるのでしょうか?

1秒間隔なら、例えば

Sub test1()
Application.OnTime Now() + TimeValue("00:00:01"), "test2"
End Sub

Sub test2()
MsgBox "テストです"
test1
End Sub

としてtest1を実行すれば、1秒ごとに「テストです」のメッセージが表示されることは分かるのですが、これを例えば0.2秒ごとに実行することなどはできるのでしょうか?

どなたかご存知の方いらっしゃったら、教えていただければ幸いです。
よろしくお願いします。

A 回答 (2件)

こんばんは!



検索してみると
>Application.Wait
を使う方法が出ていました。
まず標準モジュールに↓のコードを記載し、Sample1のマクロを実行してみてください。

Sub Sample1()
 Dim Tm As Long
  With Range("A1")
   .Value = .Value + 1
  End With
  Tm = 200
   Application.Wait [Now()] + Tm / 86400000
    Call Sample2
End Sub

Sub Sample2()
 If Range("A1") = 11 Then
  Range("A1").ClearContents
  Exit Sub
 End If
  MsgBox "テストです。"
  Call Sample1
End Sub

これでSample1を実行してみてください。

※ Sample1とSample2を単純に呼び出すだけでは延々と無限に続いてしまいますので
A1セルをカウンタと使用し、10回で終わるようにしています。

※ コード内の「86400000」は
24*60*60*1000
で1日をミリ秒にした数値になります。

200ミリ秒=0.2秒 なので
Tmで200をセットしています。m(_ _)m
    • good
    • 0
この回答へのお礼

コードまで書いていただき、ありがとうございました。
Application.Waitでできました。

お礼日時:2018/06/14 00:18

windowsAPIのsleep関数を使用してください


提示の例はMsgboxで処理が止まるので1秒ごとには表示されません
    • good
    • 0
この回答へのお礼

ありがとうございました。
sleep関数でできました。

お礼日時:2018/06/14 00:18

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

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

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

QExcel コンマ以下の秒を表示したい

いつもお世話になっております。
エクセルでタイマーを作っているのですが、セルの書式設定の時刻だと何秒までしか表示できません。その次のコンマ以下(例 3.56秒)を表示させたいのですが
どうすればいいか教えて下さい。
よろしくお願いします。

Aベストアンサー

こんばんは。

>VBAでのGetTickCount関数等の使い方を具体的にご教授願えませんか?

実際は、以下のようにしても、動きが速くて何も見えません。今まで、同じような質問を受けましたが、せいぜい、1秒~2秒ぐらいの表示です。それに、セルに表示するときのロスが多少ありますので、100分の1のタイム自体をExcelで計るのは無理だと思います。

だから、
 If TimeDiff Mod 1000 = 0 Then  ~ End If
 
などを使って表示を遅らせたりします。以下は、標準数値です。時間表示ではありません。


Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub TimeCountCheck()
Dim StarTime As Long
Dim TimeDiff As Long
Dim TimeLimit As Long

TimeLimit = 10 '10秒 間
TimeLimit = TimeLimit * 1000
 StartTime = GetTickCount
 Do
  DoEvents
  TimeDiff = GetTickCount - StartTime
  Cells(1, 1).Value = TimeDiff / 1000
 Loop While TimeDiff < TimeLimit
End Sub

こんばんは。

>VBAでのGetTickCount関数等の使い方を具体的にご教授願えませんか?

実際は、以下のようにしても、動きが速くて何も見えません。今まで、同じような質問を受けましたが、せいぜい、1秒~2秒ぐらいの表示です。それに、セルに表示するときのロスが多少ありますので、100分の1のタイム自体をExcelで計るのは無理だと思います。

だから、
 If TimeDiff Mod 1000 = 0 Then  ~ End If
 
などを使って表示を遅らせたりします。以下は、標準数値です。時間表示ではありません。


Pri...続きを読む

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

Q1秒以下のApplication.Waitは可能ですか?

こんばんは。
ExcellのVBAで、ほかのアプリケーションを操作するときに、Waitを使って、Now+TimeValue("00:00:05")のような記述をするときに、1sec.以下の、たとえば0.5sec.のような時間設定をしたいときは、どうしたらいいのでしょうか。
どなたかご存知の方、いらっしゃれば是非、教えてください。よろしくお願いします。

Aベストアンサー

こんにちは。KenKen_SP です。

よく使われるのは、Timer 関数を使った方法か、Sleep API 関数を使った方法
です。Sleep API については #1 さんが既に回答されてますので、Timer 関数
を使った方法を紹介します。

【Excel VBA の Timer 関数】

' Wait処理 (Windows XP でインターバル 15 msec)
Sub Wait_Timer(ByVal lngMilliseconds As Long)

  Dim sngStart As Single
  sngStart = Timer
  While Timer > sngStart + lngMilliseconds
    DoEvents ’<-- DoEvents が必要かどうかはケースバイケース
  Wend

End Sub

API を含め時間処理系については 1/1000 秒単位など詳細な時間を指定できる
ものがありますが、どの命令を選択するか、あるいは OS 等の環境の違いにより、
その精度は異なります。

Excel VBA の Timer 関数や Sleep API 関数では、Windows XP 使用時のインター
バルは概ね 15 msec。つまり、それ以下の数値を指定しても約 15 msecで稼動
してしまいます。

数値測定など厳密な時間精度が必要な場合は、timeGetTime API を使いますが、
それ以外の通常の用途では、上記の方法で概ね問題ないと思います。

なお、Win32API 関数を Excel VBA で使う場合、Declare ステートメントが必須
になりますので、Excel 97 以降で使用可能となります。

こんにちは。KenKen_SP です。

よく使われるのは、Timer 関数を使った方法か、Sleep API 関数を使った方法
です。Sleep API については #1 さんが既に回答されてますので、Timer 関数
を使った方法を紹介します。

【Excel VBA の Timer 関数】

' Wait処理 (Windows XP でインターバル 15 msec)
Sub Wait_Timer(ByVal lngMilliseconds As Long)

  Dim sngStart As Single
  sngStart = Timer
  While Timer > sngStart + lngMilliseconds
    DoEvents ’<-- DoEvents が必要かどうか...続きを読む

QVBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。

マクロを含むエクセル(EXCEL2000)をHTMLのページからハイパーリンクで呼び出しています。そのエクセルでボタン操作に従い罫線やセルの着色を行っています。しかし、着色結果が更新されません。スクロールバー等で画面を移動すると正しく着色されています。このエクセルを通常に起動した場合は、問題なく動作するのですが、シート全体を更新する方法を教えて下さい。
各関数では、以下のスクリーンアップデータの処理を入れています。
Application.ScreenUpdating = False
    (処理)
Application.ScreenUpdating = False

Aベストアンサー

たぶん、EXCEL独特の問題だと思うのですが、HTML の場合、すでに色の部分を表面上で使用しているので、それでメモリが占有させているのではないかと私は思っています。

他にも、

 ActiveWorkbook.HTMLProject.RefreshDocument True

というのがありますね。
ホスト アプリケーション内のブックに含まれる HTML プロジェクトを更新する、というのがありますね。

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

QExcel vbaでキーの操作の入力

VBAでこのキーが押されるとこれを実行し、また別のキーを押すとまた別ののものを実行するようにしたいんですけど、キーを押されるっていうプログラムはどうやって書けばいいですか?

Aベストアンサー

> 学校の課題でVBAを使わなくてはいけないんですけど
> 同じようにしてできますか?

VBAの中でWindowsのAPIを呼び出しているだけですが…。

API使わずにって事だと、ExcelのVBAに標準でキー入力を受け付けるような関数は無かったと思いますが…。(だからこそ、わざわざAPIを使って実現してる。)
InputBoxで「A」が入力されたら分岐とか、そういうフォームやActiveXコントロールを表示した状態で処理とか、課題の内容を取り違っていませんか?

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

QエクセルVBAでタイマーコントロールは使えますか

エクセルVBAでタイマーコントロールは使えますか。

エクセルVBAで、ある時刻になったらマクロを実行させたいと思っています。
無限ループの中にTIME関数で時刻を呼び出し、それをIF文で判定して、
一定時刻にマクロを実行させるものは作りましたが、CPU負荷が高く、24時間
連続で動作させることに不安を感じています。

この他に、VBのタイマーコントロールのような機能を持つオブジェクトや
便利機能等があったら教えていただけませんか。
(一応、VBで時刻管理をするプログラムを作ってそこからエクセルVBAを呼
び出す方法やタスクスケジューラでエクセルVBAを呼び出す方法、ATコマンド
等も考えていますが、可能ならエクセルVBAで閉じて処理をしたい)。

尚、私はWindowsMe+エクセル2000でVBAを作成しています。
実際にVBAを動かすのは、WinsowNT4.0サーバー+エクセル2000を予定してい
ます。

Aベストアンサー

考え方としてですが
ループとIFでのチェックではなく、

毎日一回、指定時刻に実行なら

1.初回は開始時に、現在時刻から逆算して
開始時間までの秒数を設定

2.次回からは、開始時刻がきた時、起動と同時に
次の開始時刻を計算してセット
処理したらwaitして次回を待つ。

という形にしてループとIFでの時刻監視を
一切やめてしまうことをおすすめします。

#1さんのものでも同じだと思いますが
書かれたコードを単独で実行した時には
負荷はそれほどではないと思います。
OnTimeメソッドのループは不要だと思います。
開始時刻をセット済みなので。

時刻をセットして、監視の処理(ループ)
をはずす、という処理へ変更できませんか。

質問の内容と違っていましたらお手数ですが
質問ください。

QVBAでのMATCH関数の使用

現在,VBAにてシートの比較プログラムを行っておりますが,その中で検索範囲を示すRangeに名前を使用したいのですがエラーでうまくいきません。

エラーは
「実行時エラー:1004
WorksheetFunctionクラスのMatchプロパティが取得できません」
とでます。

記述は

Application.WorksheetFunction.Match(Cells(r, 132), Range("リース型具Key1"), 0)

としており,”リース型具Key1”が事前に名前登録してある名前です。

方法をご存知の方,よろしくお願いします。

Aベストアンサー

シートが異なるとは思ってもいませんでした。

例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。
シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。

Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0)


それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。

Sub myTest01()
  Dim shtNo As Integer
    shtNo = 2
  Dim ws2 As Worksheet
  Dim ws3 As Worksheet
    Set ws2 = Worksheets("Sheet" & shtNo)
    Set ws3 = Worksheets("Sheet3")

  On Error GoTo ErrorTrap
  
  MsgBox Application.WorksheetFunction.Match(ws2.Cells(2, 2), _
                       ws3.Range("リース型具Key1"), 0)
  '
  '// 色々な処理 //
  '
  Set ws2 = Nothing
  Set ws3 = Nothing

  Exit Sub

ErrorTrap:
  MsgBox ws2.Cells(2, 2) & "は見つかりません。"
  Resume Next
End Sub

シートが異なるとは思ってもいませんでした。

例えば、Cells(r, 132) が Sheet2 にあれば、下記のようにすればいいはずです。
シートを指定していなければ、マクロを実行したシートのCells(r, 132)になっているはずです。

Application.WorksheetFunction.Match(Worksheets("Sheet2").Cells(r, 132), Range("リース型具Key1"), 0)


それから、Match関数で結果が求まる場合は問題ありませんが、結果が求まらない場合の処理も考慮すべきでしょう。下記は参考例です。

Sub myTest01()
  Dim shtNo As...続きを読む

QVBとVBAの違い

お世話になります。

現在、ExcelVBAで機械設計の計算をさせようと思い勉強しているのですが、VBとVBAの違い(VBと比較したとき、VBAできること、できない事)の境目?がいまいち判りません。
まだまだ勉強中で困惑しております。このままExcelVBAを勉強していく物か、VBについて勉強していくか迷っています。このままExcelVBAを勉強してExcelVBAを理解すれば判断できるかと思うのですが、畑違いの勉強になってしまわないかと心配です。

やりたいことは、各種計算の簡略化です。
現在は、関数電卓で行っていますが、これをパラメータを入力すると計算結果が出る。このような物を作りたいと思っています。

長くなってしまったのでまとめると、
1、VBAとVBの違い
2、ExcelVBAで設計計算が可能か
あと、
プログラムにより計算させるときに、最適なプログラム(JavaとかPHPとかHTML等など・・・)お勧めのプログラムがありましたらアドバイス頂けたらと思います。

Aベストアンサー

1. VBAとVBの違い

VBは単体で動作するアプリケーションが作れますが、VBAはOfficeが必要です。
また、VBAはOfficeの環境が使えるので、Excel等を使った入出力の機能が既にできていますが、VBではある程度自分で作る必要があります。また、費用的な面でVBは購入しないと使えませんが、VBAはOfficeがあれば使えますので、既にExcelなどを導入されているならば、追加の費用が必要ありません。
もし、複数の人間で作ったプログラムを利用され、かつその中にOfficeを持っていない人が含まれるのであればVBAではできませんので、VBが必要です。

2. ExcelVBAで設計計算が可能か

可能です。また、多分VBAを使わなくてもExcelの関数でもある程度のことが可能だと思われます。お持ちの関数電卓の桁数にもよりますが、相当な高精度が必要でない限り大丈夫です。

文面からすると、プログラミング未経験のようですが、やりたいことが明確なので、Excelをお持ちであればVBAで始めてみてはいかがでしょうか。他の言語(Java, C, PHP...)でも可能でしょうが、中には環境を用意しなくてはならなかったり、本質である計算以外に気にしなくてはならないことが多く、初心者にはとっつきづらいのではないかと考えます。

VBAからVBへの移行、VBからVBAへの移行はどちらも可能ですし、VBAからVBへの移行は多少時間がかかるかもしれませんが、VBよりVBAから始める方が楽なので、どちらに優越があるとは一概に言えないと思います。一人でちょっと使う程度や勉強用なら、ExcelVBAをお勧めします。
しばらくすると、ExcelVBAの限界を感じるようになると思うので、そこからVBに移行するというのでも悪くないと思います。

1. VBAとVBの違い

VBは単体で動作するアプリケーションが作れますが、VBAはOfficeが必要です。
また、VBAはOfficeの環境が使えるので、Excel等を使った入出力の機能が既にできていますが、VBではある程度自分で作る必要があります。また、費用的な面でVBは購入しないと使えませんが、VBAはOfficeがあれば使えますので、既にExcelなどを導入されているならば、追加の費用が必要ありません。
もし、複数の人間で作ったプログラムを利用され、かつその中にOfficeを持っていない人が含まれるのであればVBAではで...続きを読む


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

人気Q&Aランキング