• ベストアンサー

EXCEL VBA で シートをループして列を非表示にした際の画面の表示制御

EXCEL VBA で それぞれのシートをループして同じ列を非表示にするVBAを記述しました。処理は成功したのですが、画面がその通りにチカチカして余計な時間がかかっているような気がしています。 こういう時って、SCREENUPDATING=FALSEみたいな記述をすると聞いたのですが、合っておりますでしょうか? 試しにコードの最初に記述してみたのですが、一番最初のシートのみしか非表示処理がされないでVBAが終わってしまっています。改善の方法をご存知の方教えてください。どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

#1です。 たとえば列5(E)を非表示にするなら下記だが。 sheetをいちいちActiveにしてないか。 ちらつくのは、Application.ScreenUpdating がないからじゃないね。 それから、自分のコードも示さずに処理を教えろというのはやめようよ。 Sub test() Application.ScreenUpdating = False For Each sh In ActiveWorkbook.Sheets sh.Columns(5).Hidden = True Next Application.ScreenUpdating = True End Sub

isurf
質問者

お礼

めちゃくちゃ正論ですね。 コードですが会社にあって、 自宅で打ち直し出来なかったんです。 だから曖昧な聞き方になってしまっていたのは百も承知しています。 素晴しくわかりやすいです。本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >試しにコードの最初に記述してみたのですが、一番最初のシートのみしか非表示処理がされないでVBAが終わってしまっています。 コードを見てみないとなんともいえませんね。 たぶん、コード自体に問題があるのではないでしょうか。 Select を置いているように思います。 Application.ScreenUpdating ではないような気がします。 以下のコードでは、ScreenUpdatingを入れなくても、何も画面にちらつきなどありません。 '標準モジュールのみ Sub Test1() Dim sh As Worksheet Const COLNAME As String = "B1,D1,F1" For Each sh In Worksheets  sh.Range(COLNAME).EntireColumn.Hidden = True Next End Sub なお、Rangeの引数の限界があります。

すると、全ての回答が全文表示されます。
  • kmmk16
  • ベストアンサー率46% (32/69)
回答No.2

コードの最後に Application.ScreenUpdating = True ’画面の更新有効 が必要では?

すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

vba ヘルプから以下。 ScreenUpdating プロパティ 関連項目対象使用例アプリケーション情報True の場合、マクロの実行中に画面表示を更新します。値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。 解説 マクロの速度を向上させるため、画面を更新しないようにします。この場合、マクロの処理過程は見ることができませんが、実行速度が速くなります。 マクロが終了した後は、ScreenUpdating プロパティの値を True に戻してください。 次の使用例は、画面表示の更新をオフにすることで、どのくらいコードの実行を速くできるのかを示します。シート 1 の列を 1 列おきに非表示にする操作を 2 回行い、それぞれの操作にかかる時間を調べます。1 回目の操作では、画面表示の更新はオンになりますが、2 回目のときにはオフになります。実行すると、それぞれの操作の所要時間がメッセージ ボックスに表示されます。 Sub test2() Dim elapsedTime(2) Application.ScreenUpdating = True For i = 1 To 2 If i = 2 Then Application.ScreenUpdating = False startTime = Time Worksheets("Sheet1").Activate For Each c In ActiveSheet.Columns If c.Column Mod 2 = 0 Then c.Hidden = True End If Next c stopTime = Time elapsedTime(i) = (stopTime - startTime) * 24 * 60 * 60 Next i Application.ScreenUpdating = True MsgBox "更新がオンの状態での所要時間は " & elapsedTime(1) & _ " 秒: " & Chr(13) & _ "更新がオフの状態での所要時間は " & elapsedTime(2) & _ " 秒" End Sub

isurf
質問者

補足

ご回答ありがとうございます。 名答なのだと思い大変ありがたく思います。 ただ、ちょっと高度すぎて私のレベルではわからなったのですが、 存在するシートすべて(多分20くらい)を横断しながら非表示列の列番号は全く同じで非表示にしながらループしようと思っています。 この時に存在するシートを横へと横断しながら列を非表示にしてチカチカ見えてしまうのをうまく隠せないかなと思っています。具体的なコードがありましたら教えて頂けると幸いです。Application.ScreenUpdating = false Application.ScreenUpdating = true の位置がどこに入るか、とか、、、です。 (処理時間よりマクロ処理中の見栄えを気にしています) もしよろしければ教えてください。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A