- 締切済み
Excel(VBA)に関しての質問
Excelでスタートボタン配置し、それを押すと指定したセルの配色を変更して ネオンやアニメーションのような動作をするVBAを組もうとしています。 そこで手始めにA1~AS1セルを1セルずつ順番にカラーリングされるVBAを 組んだのですが以下の問題点が発生したので良い対処法等ありましたら 是非ご教授ください。 【問題点】 プログラム実行中、マウスの動きによってカラーリング(処理速度?)の 挙動以下のように変わる。 ・マウスを止めているとき → 1セル1セルのカラーリングが もっさりした動作で遅い ・マウスを常に動かしているとき → スムーズなカラーリング (マウスを止めている時とは段違いに早い) 【希望】 マウスの挙動に依存せずにスムーズなカラーリングを行いたい 【動作環境】 OS : Mac OS X (10.4.11) Excel : Excel 2004 for Mac (11.5.9) 【VBA】 '開始列定数 startColumn = 1 'A1~AS1までカラーリング While ActiveCell.Address <> "$AS$1" 'カラーリング位置設定 Cells(1, startColumn).Activate 'カラーリング With Cells(1, startColumn).Interior .colorIndex = 10 .Pattern = xlSolid End With '???(ここが問題な気がしますが正直、使い方を理解できていない・・・) 'これがないと1セルずつのカラーリングが行われない DoEvents 'カウント(カラーリング位置を移動) startColumn = startColumn + 1 Wend
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- sygh
- ベストアンサー率76% (42/55)
Windows 7 x64 + Excel 2007の互換モードで試しただけなので、OS X + Excel 2004でも正しく動作するかどうか分かりませんが…… ' Sheet1のコードです。 Private g_startColumn As Long Private g_isStoppedFlag As Boolean Private Sub TimerCallbackProc() ' カラーリング位置設定。 Cells(1, g_startColumn).Activate ' カラーリング。 With Cells(1, g_startColumn).Interior .ColorIndex = 10 .Pattern = xlSolid End With ' 他のイベントを処理する。例えば他のボタンの押下イベントなど。 DoEvents 'カウンタのインクリメント(カラーリング列位置を移動)。 g_startColumn = g_startColumn + 1 ' OnTime は最小分解能が1秒のワンショット タイマー。 ' A1~F1までカラーリングするまで、あるいはユーザーによる強制停止の指示があるまで、 ' タイマーイベントを再発行し続ける。 If ActiveCell.Address <> "$F$1" And g_isStoppedFlag = False Then nextTime = Now() + TimeValue("00:00:01") Application.OnTime nextTime, "Sheet1.TimerCallbackProc" Else MsgBox "終了しました。", vbOKOnly & vbInformation CommandButton1.Enabled = True End If End Sub ' 開始ボタンのイベント ハンドラ。 Private Sub CommandButton1_Click() CommandButton1.Enabled = False ' 開始列の設定。 g_startColumn = 1 ' 停止フラグのクリア。 g_isStoppedFlag = False ' 最初の呼び出し。 TimerCallbackProc End Sub ' 停止ボタンのイベント ハンドラ。 Private Sub CommandButton2_Click() g_isStoppedFlag = True End Sub ただし Application.OnTime は最小分解能が1秒なので、500ミリ秒間隔で更新するようなことはできません。 Windowsであればuser32.dllにエクスポートされているWin32 APIのSetTimer/KillTimerを直接コールして、システムのタイマーメッセージを発行させる手がありますが、OS Xの場合は残念ながら僕には分かりません。Mac OS X + ExcelでのシステムAPIコールの仕方を検索なさってください。
- layy
- ベストアンサー率23% (292/1222)
処理秒を取得して表示してみる 1セルの繰り返しか 複数選択セルか の違いは? OFFSET使ってみる 秒取得で、今ある処理より遅くなるでしょうが、どの行為が遅いかは見えてくるでしょう。完成したらトル。 いろいろやってみる。
- o_chi_chi
- ベストアンサー率45% (131/287)
とりあえず Cells(1, startColumn).Activate をコメントにして実行すればどうでしょう? Cells(1, startColumn).Interior ここでカラーリング位置は設定できます。 DoEventsに関してはヘルプで確認しましょう。
補足
助言、ありがとうございます。 while文の条件にActiveCellを判断基準にしているので Cells(1, startColumn).Activate をコメントアウトすると無限ループになってしまいます。。 (一応試したのですがマウスによる挙動は変わりませんでした)