Excel VBA質問箱 IV

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

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


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

【68113】ループが止まってしまう(Office 200)。 ぴこ 11/2/3(木) 9:28 質問[未読]
【68116】Re:ループが止まってしまう(Office 200)。 neptune 11/2/3(木) 10:15 発言[未読]
【68118】Re:ループが止まってしまう(Office 200)。 UO3 11/2/3(木) 10:37 発言[未読]
【68122】Re:ループが止まってしまう(Office 200)。 neptune 11/2/3(木) 11:41 発言[未読]
【68120】Re:ループが止まってしまう(Office 200)。 Jaka 11/2/3(木) 11:20 発言[未読]
【68139】Re:ループが止まってしまう(Office 200)。 ぴこ 11/2/4(金) 20:52 お礼[未読]

【68113】ループが止まってしまう(Office 200)。
質問  ぴこ  - 11/2/3(木) 9:28 -

引用なし
パスワード
   標準モジュールとして、下記のコードを書き、実行させます。

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

Sub MainLoop()
  Dim i As Long
  For i = 0 To 500
    Call Sleep(10)
    DoEvents
    Sheet1.Cells(1, 1).Value = Cells(1, 1).Value + 1
  Next i
End Sub

この間、エクセルの操作を何もしなければ、
セル(1, 1)に501と表示し、正常に終了します。

しかし、実行中に、セル(2, 1)に文字を書き込もうとして、
セル(2, 1)をダブルクリックすると、セル(1, 1)の値が増えなくなり、
ループが途中で終了してしてしまいます。

なぜ、このような現象が発生するのでしょうか?
また、途中で終了しないようにするには、
どのような対策をすれば良いのでしょうか?

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

【68116】Re:ループが止まってしまう(Office 200)。
発言  neptune  - 11/2/3(木) 10:15 -

引用なし
パスワード
   ▼ぴこ さん:
>    Call Sleep(10)

    'Call Sleep(10)
としてやってみて下さい。はっきり言って10msecなんて殆ど意味をなさないし、
sleepの弊害に待機中のイベントは無視されるってのがあります。

>なぜ、このような現象が発生するのでしょうか?
↑でダメなら
もしかしたらdoeventsのいたずらかもしれません。・・可能性は低いとは思いますが。

ここにsleepとdoeventsの弊害について詳しく説明されていますので
読んでみて下さい。
ht tp://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200808/08080010.txt

>どのような対策をすれば良いのでしょうか?
500個のセルなんてそれほど多くないから画面更新を止めて処理するか、
メモリ上で処理して、最後に結果だけ出力するか等の工夫を検討しては
如何?

【68118】Re:ループが止まってしまう(Office 200)。
発言  UO3  - 11/2/3(木) 10:37 -

引用なし
パスワード
   ▼ぴこ さん:

こんにちは
このループの意味がよくわからないのですが、もしかしたら
セルの数値が「自動的に」増えていく、その【視覚的な効果】を狙っておられるのでしょうか?

であれば、DoEvents を消してはいかがでしょう。
DoEvents があるということは、その瞬間、別のこと(セルのダブルクリック等)が
できるということです。で、ダブルクリックするとセルが編集モードになりますね。
編集モード下では(通常では)マクロ実行ができないというか、編集状態に入った瞬間に
エクセルが【デザインモード】になり、マクロ実行が【とまる】というか【きえてしまう】
ということなんだろうと思います。

【68120】Re:ループが止まってしまう(Office 200)。
発言  Jaka  - 11/2/3(木) 11:20 -

引用なし
パスワード
   図形の方の「Text Box 2」を作って実行。
セルに文字は入力できるけど、まともには入力できません。
何でなのか原因は全く解りません。
尚、シートのコードネームを記載されたように使うのは疑問があるので使ってません。


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

Sub MainLoop()
  Dim i As Long
  ActiveSheet.Shapes("Text Box 2").TextFrame.Characters.Text = 0
  For i = 0 To 500
    Call Sleep(30)
    DoEvents
    'Sheet1.Cells(1, 1).Value = Cells(1, 1).Value + 1
    With ActiveSheet.Shapes("Text Box 2").TextFrame.Characters
      .Text = .Text + 1
    End With
  Next i
End Sub

【68122】Re:ループが止まってしまう(Office 200)。
発言  neptune  - 11/2/3(木) 11:41 -

引用なし
パスワード
   ▼UO3 さん:
>できるということです。で、ダブルクリックするとセルが編集モードになりますね。
>編集モード下では(通常では)マクロ実行ができないというか、編集状態に入った瞬間に
>エクセルが【デザインモード】になり、マクロ実行が【とまる】というか【きえてしまう】
>ということなんだろうと思います。
あ〜そういうのもありますねぇ〜。むしろこちらが正解のような???

>UO3さん
いつも助けて頂いております。ありがとうございます。

【68139】Re:ループが止まってしまう(Office 200)。
お礼  ぴこ  - 11/2/4(金) 20:52 -

引用なし
パスワード
   皆様、ありがとうございました。

使用目的を書いておらず、混乱された方おられたようで、すみません。

外部から受信したデータをエクセルに表示し、モニタするプログラムを
作成しております。そのため、無限ループの中で、データを受信したら
エクセルに表示する作りにしていたのですが、今回質問させていただい
たような問題が発生しましたので、原因が知りたく、質問させて頂きました。

今回は、スタート/ストップボタンを用意し、
手動でセルにデータを書き込む場合は、
ストップボタンを押し、無限ループをストップしてから、データを書き込み、
モニタを再開したい場合は、
スタートボタンを押し、無限ループを再スタートし、モニタを再開する作りにしました。

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