ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュの画面表示の更新

  • mixiチェック
  • このエントリーをはてなブックマークに追加
次のプログラムを実行すると、途中で画面の更新が止まったり、表示間隔が数十回に一回となったりします。
これを確実にループ一回ごとに表示させるようにする方法はありませんでしょうか。
よろしくお願いします。

Sub TEST01()

Dim i As Long
Dim x As Long
Dim y As Long
Dim myArg(1 To 100, 1 To 100) As Long

For i = 1 To 1000
  For x = 1 To 100
    For y = 1 To 100
      myArg(x, y) = i + x + y - 2
    Next
  Next
  ' この表示(画面更新)が確実に毎回行われるようにしたい。
  Worksheets("Sheet1").Range("A1:CV100") = myArg
Next

End Sub

(プログラムの内容に特に意味はありません)

コメント(11)

Excel2010 では途中で応答なしになり、Excel2013では応答なしにはなりませんがコマ落ちします。
どちらも処理は正常に終わりますが、画面表示だけ止まります。
素人考えですが、変更が多いけど処理は出来るでしょうが、表示が追いつかないのかなと思うのです。
Forで回す回数を1/2、1/5、1/10に減らすと、追い付いて表示できる所が出てこないでしょうか。
またsleep的関数で表示させる為の時間を取ってはどうでしょうか。
>>[2]

コメントありがとうございます。
ご指摘のとおり表示が追いついていないのだと思いますが、「画面の変化を見たい」という目的がありますので、表示回数を減らすのは出来ないのです。

また、Sleep も効果なしでした。

サンプルプログラムを最もシンプルな形にしました。
この時、A1 が変化していくのを見たいということです。

Sub TEST02()
Dim i As Long
For i = 1 To 100000
  Worksheets("Sheet1").Range("A1") = i
Next
End Sub

※ 実行される時は途中で応答なしになることがありますのでループ回数に注意してください。
更に下を行く素人考えの回答です。

1.高性能のPCで実行する。
2.(WIN7の場合)タスクマネージャーを起動して「プロセス」タブでエクセルの優先度を「高」にする

というのはどうでしょう?
私は性能の低いPCを使ってまして、動画プレーヤの優先度を上げることが時々あります。
効果は気休め程度と思いますが。

エクセルの範囲内の回答をお求めでしたらゴメンナサイ。
上手く毎回描画になっているのかどうか目視してもよく分かりませんが、
ループボディ中でAPIを呼んでウィンドウ全体を再描画させてみるのは如何でしょう?

Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function RedrawWindow Lib "user32" (ByVal hWnd As Long, ByVal lprcUpdate As Long, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long

Const RDW_INVALIDATE As Long = 1 'Invalidates the redraw area.
Const RDW_ALLCHILDREN As Long = 128 'Redraw operation includes child windows if present in the redraw area.
Const RDW_UPDATENOW As Long = 256 'Updates the specified redraw area immediately.

Sub ScreenUpdatingTest()
Dim i As Long
Dim hWnd As Long
hWnd = GetForegroundWindow()
For i = 1 To 10000
ActiveSheet.Range("A1") = i
Call RedrawWindow(hWnd, 0, 0, RDW_INVALIDATE + RDW_UPDATENOW + RDW_ALLCHILDREN)
Next
End Sub
定番の DoEvents を入れてはどうですか?
>>[4]

ありがとうございます。
高性能のPCを使うといいのかもしれませんが、そうすると画面描画以外の計算部分も早くなってしまうので、やはり表示が追いつかないような気がします。
というか、徐々に表示が追いつかなくなってくるので、処理が溜まってくるというか…そんな感じです。
>>[5]

試してみましたが、うまく行きませんでした。
詳細については、後日まとめて報告します。
>>[6]

実は、昨日 Excel 2010 の環境で、Wait もしくは DoEvents を使ってみて、どちらもうまく行っていたのですが、今日 Excel 2013 で試すと、Wait はダメで、DoEvents は2回に1回表示されているようでした。
Wait に関しては不思議な動作をしていたので、詳細は後日まとめて報告します。

何をしようとしているかというと、ライフゲームを作っているのです(プログラムの練習ですw)
計算速度はそこそこ速くなったのですが、描画が追いついていません。

貼り付けた動画はExcel2013でDoEventsを使っていてうまく行っているように見えますが、実はコマ落ちしております。
計算はもう少し早く出来そうですが、描画が間に合わないと意味が無いので…
こんにちは
セルに値をセットした後に毎回"Application.ScreenUpdating"と「単純ループによる待ち」をいれてみたら何とか目視できましたよ。(テストソースでは、消す→セットに付き1回入れました)
ループの値は、使用するマシン性能で変わると思います。
以下では、10000だと目で追えず、1000000だと遅すぎだと感じました。

Sub test()
For i = 1 To 10
Cells(10, 2) = " ": Cells(9, 3) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(9, 3) = " ": Cells(9, 4) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(9, 4) = " ": Cells(10, 5) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(10, 5) = " ": Cells(11, 5) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(11, 5) = " ": Cells(12, 4) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(12, 4) = " ": Cells(12, 3) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(12, 3) = " ": Cells(11, 2) = "○": Application.ScreenUpdating = True: Call sl_p
Cells(11, 2) = " ": Cells(10, 2) = "○": Application.ScreenUpdating = True: Call sl_p
Next
End Sub

Function sl_p()
For i = 0 To 100000: Next
End Function

一度、試してみて下さい。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。