• ベストアンサー

VBAで枠固定されたsheetを左上に位置を戻す

Excel2013のVBAで Sub Sample1() Sheets(Array("Sheet1", "Sheet3")).Select End Sub  と何枚かのシートをグループ化しているとします。グループ化していないシートもあります。 ただし、これらのシートにはウィンドウ枠の固定をしています。 これらのグループ化を適応したシートのウインドウの位置を左上に戻して、枠を固定した外側も左上に戻したいです。左上になっても、固定化していないところは戻らなかったり、sheet1だけ戻ったりしてうまくいきません。 お願いします。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 説明が難しいのですが、 例えば、 シートは選択出来ますが、 ウィンドウは選択(Select)出来ません。 大きく性格が違うオブジェクトであることを理解してください。 その上で、 Excel画面上のスクロールは、 Windowクラス配下のPaneオブジェクトの属性です。 なので、複数のシートを纏めて選択して作業グループにしたとしても、 スクロールについては、Windowオブジェクトごとにしか操作出来ません。 纏めて一発でスクロールしてくれるようなメソッドがあるのではないか、 という期待を持たれていたなら、残念ながら、ありません。 > これらのグループ化を適応したシートのウインドウの位置を左上に戻して、枠を固定した外側も左上に戻したいです。 ひとつひとつのシートをアクティブウィンドウ上でアクティブにしてから、 それぞれの第一のペイン(窓を構成する一枚の窓ガラス)に対して、スクロールをコマンドします。 方法は大きく分けて3つありますが、 その内2つ(Range.Select、または、Pane.ScrollRowとPane.ScrollColumn)は、 ・ウィンドウ分割位置へスクロール=ペインの左上へ移動(を表示) ・ウィンドウ先頭(A1セル)へスクロール=シートの左上へ移動(を表示) というように二段階で操作しなくてはならないという欠点があります。 なので、ここでは、Pane.LargeScroll メソッドを使った例を紹介します。 名前付き引数UpとToLeftには、それぞれ、「上へ」「左へ」スクロールするページ数 を意味しますが、この引数を、必要以上、十分に、大きな数値で指定しておきます。 これで、一度(一行)の処理で、お望みのようにスクロールできます。 前提条件として、複数シートを作業グループ化するところから、 書いておきます。 その点では、あえて無駄なことをしているテスト用のサンプルでしかありませんが、 前提条件以外の記述部分は実戦向きに書いたものです。 Sub Re8765522() ' ' === 前提条件 === ' ' 複数シートのインッデックス配列を、 ' ' それぞれ(オブジェクト名表記で直接参照する)シートオブジェクトから指定し ' ' 複数シートを一括選択→作業グループ化 ' ' この方法なら、シート名の変更、シート並び順の変更に影響されずに選択できます   Sheets(Array(Sheet1.Index, Sheet2.Index, Sheet3.Index)).Select ' ' ▲Sheetsクラスです。Worksheetsクラスではありません。 ' ' === 以上、前提条件 === Dim colSheets As Sheets ' Sheets型です。Worksheets型ではありません。 ' ' 選択中の複数シート(Sheets コレクションオブジェクト)を変数に格納   Set colSheets = ActiveWindow.SelectedSheets ' ' アプリケーションの再描画を一時停止   Application.ScreenUpdating = False Dim wst As Worksheet ' ' 選択中の複数シートを総当たり   For Each wst In colSheets   ' ' それぞれのシートをアクティベイト     wst.Activate   ' ' アクティブウィンドウの1stペインをスクロール   ' ' ・ウィンドウ分割位置へスクロール=ペインの左上へ移動(を表示)   ' ' ・ウィンドウ先頭(A1セル)へスクロール=シートの左上へ移動(を表示)   ' ' 以上を同時に     ActiveWindow.Panes(1).LargeScroll Up:=100, ToLeft:=100   Next ' ' 選択中の複数シート の先頭シートをアクティベイト   colSheets(1).Activate ' ' アプリケーションの再描画を再開   Application.ScreenUpdating = True End Sub

hinoki24
質問者

お礼

動きました。 どうもありがとうございました。オブジェクト名で複数選択できる書き方がわかったのが案外うれしかったです。

その他の回答 (1)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1、cjです。自己レス、訂正です。 > ActiveWindow.Panes(1).LargeScroll Up:=100, ToLeft:=100 私の方で錯誤がありました。 必ずしもPaneに対して処理する必要はなかったです。 ActiveWindow.LargeScroll Up:=100, ToLeft:=100 のように書いても、この場合は問題なく処理されます。 従って、#1でのPaneに関する前段の説明も、不適当・不適切でした。 スミマセンが、説明文中にあるPane云々については無視してやってください。 あらためて説明しようとしても却って混乱を招きそうなので控えます。 失礼しました。

hinoki24
質問者

お礼

どうもありがとうございます。 前ので一応思い通りに動きましたが、訂正ありがとうございました。 こちらに変えても問題なく動作しましたので、こちらを使用します。 質問の締め切り前でよかったです。

関連するQ&A