[[20111022102407]] 『複数のシートを一度の操作でズーム変更する方法は』(新米事務員) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のシートを一度の操作でズーム変更する方法はありますか』(新米事務員)
 Sub 全シート()
    Dim ws As Worksheet

      For Each ws In Worksheets
        倍率 = 70
        ActiveWindow.Zoom = 倍率
      Next
 End Sub
 以前の似たものでこんなコードを書いてみたのですが動かない。。。
 Excel2003,WindowsXP,

 せっかくループしているのに
 アクティブウィンドゥに対して
 処理している。

 ループの中で変数のシートをアクティブにして
 処理する。
 「倍率」はループの外に出す。
 画面の再描画停止・再開をする
 シートのActivateを行うので初期のアクティブシート
 を記憶しておく

    Dim ws As Worksheet
    Dim acws As Worksheet
    Dim 倍率 As Integer
      Set acws = ActiveSheet
      倍率 = 70
      Application.ScreenUpdating = False
      For Each ws In ActiveWorkbook.Worksheets
        ws.Activate
        ActiveWindow.Zoom = 倍率
      Next ws
      acws.Activate
      Set acws = Nothing
      Application.ScreenUpdating = True

 (カリーニン)

カリーニンさん
 これでとても楽に仕事が出来ます。
 ありがとうございました。(新米事務員) 


 解決のようですが、コードが冗長すぎませんか?
 以下のかんじでは...

  Worksheets.Select
  ActiveWindow.Zoom = 70
  ActiveSheet.Select
 (sasa) 

 横から失礼します。

 sasaさんのコードの最後の

 >ActiveSheet.Select

 これはどのようなことを行っているのでしょう?

 私が試行した限りでは一番左のシートが選択されてしまいました。
 一方、カリーニンさんのコードではコード実行後にコード実行前の
 アクティブシート が選択されました。

 (松金徒手)

 sasaさんありがとう自分も、カリーニンさんのコードみたいに各シートをセットしていくのかと、思いましたが、
Worksheets.Selectで、全部のシートを選択が、思いつきませんでした。
 >ActiveSheet.Selectは、全部のシートを選択されているのを、あくちぇぶシートを選択としていると思います。F8で、ひとつずつ確認すると、良くわかります
(beginner)


 Worksheets.Select
 で Active なシートが変わってしまうので、変更前の保存は必要でしょうね。
 あまり冗長さを問うような処理の規模ではないと思いますが、

    Dim acws As Worksheet
    Set acws = ActiveSheet

    Worksheets.Select
    ActiveWindow.Zoom = 70

    acws.Select

 くらいでしょうか。
 (Mook)

 >Worksheets.Select
 >で Active なシートが変わってしまうので、変更前の保存は必要でしょうね。

 Activeなシートが変わらないようには以下ですね。

  Worksheets.Select False
  ActiveWindow.Zoom = 70
  ActiveSheet.Select
 (sasa)


 Active なシートが変わってしまうのでとは、どういうことでしょうか?
初歩的なことで、申し訳ございません。
(beginner)


 Worksheets.Selectは、一番左sheetをActiveにしちゃうのでしたね。失礼しました& Worksheets.Select 0 で、了解しました。
(beginner)


 sasaサンのコードがシンプルなので試したのですがエラーがでます。
  Worksheets.Select False
  ActiveWindow.Zoom = 70
  ActiveSheet.Select

 実行時エラー '1004':
 'Select'メソッドは失敗しました:'Select'オブジェクトと出ているのですが何故でしょうか?


 非表示のシートがあったりしない?
 (春日野馨)

春日野馨サン
 ドンピシャです。
 非表示のシートがある時は一度表示して消さないとダメでした。


 非表示シートを一度再表示して処理、シートを再度非表示、
 とした場合の処理です。sasaさんのコードに追加(一部変更)してみました。

 複数のシートを一括で非表示にすることは出来ましたが、
 非表示シートを一括で再表示することは出来ないようです。
 (検証不足かもしれません)

 また、非表示シートの有無は一括で取得できないようです。
 (これも検証不足かもしれません)
 ですのでループで取得しました。

 Sub testC()
  Dim hdshtary() As Variant
  Dim hdshtcnt As Integer
  Dim ws As Worksheet
  Dim acws As Worksheet
   hdshtcnt = -1
   '↓の※のためアクティブシートを取得
   Set acws = ActiveSheet
   Application.ScreenUpdating = False
   For Each ws In Worksheets
    '非表示シートがあったら
    If ws.Visible = xlSheetHidden Then
       '変数をカウントアップ
       hdshtcnt = hdshtcnt + 1
       '配列を拡張
       ReDim Preserve hdshtary(hdshtcnt)
       'シート名を配列に格納
       hdshtary(hdshtcnt) = ws.Name
       'シートの表示・非表示切り替え
       ws.Visible = Not ws.Visible
       'ws.Visible = True 'でも可
    End If
   Next ws
   Worksheets.Select False
   ActiveWindow.Zoom = 70
   '当初の非表示シートを再度非表示にする
   If hdshtcnt <> -1 Then Worksheets(hdshtary).Visible = False
 '  ActiveSheet.Select '※何故か当初のアクティブシートとは違うシートがアクティブになることがあるので↓を使用
   acws.Select
   Application.ScreenUpdating = True
   Set acws = Nothing
   Erase hdshtary
 End Sub

 カリーニンさんご提示のコードだと、非表示シートがあっても関係なくZoom変更が出来ました。
 今回の私のコードは非表示シートを再表示するのにループ処理を行っているので、どうせループするなら
 回りくどいことをせずにループでZoom変更するのが手っ取り早そうです。

 非表示シートが無いならsasaさんのコードですね。

 表示シートのみZoom変更する場合はループ処理になりそうです。

 (松金徒手)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.