プロが教えるわが家の防犯対策術!

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

A 回答 (2件)

こんにちは。



説明が難しいのですが、
例えば、
シートは選択出来ますが、
ウィンドウは選択(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
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/24 00:29

#1、cjです。

自己レス、訂正です。

> ActiveWindow.Panes(1).LargeScroll Up:=100, ToLeft:=100

私の方で錯誤がありました。
必ずしもPaneに対して処理する必要はなかったです。

ActiveWindow.LargeScroll Up:=100, ToLeft:=100

のように書いても、この場合は問題なく処理されます。
従って、#1でのPaneに関する前段の説明も、不適当・不適切でした。
スミマセンが、説明文中にあるPane云々については無視してやってください。
あらためて説明しようとしても却って混乱を招きそうなので控えます。
失礼しました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/24 00:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!