• ベストアンサー

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

  • VBAでワークシートを変数にするとき

    たとえばSheet1とSheet2を一度に選択する場合、 Sub Macro6() Sheets(Array("Sheet1", "Sheet2")).Select End Sub と書くと思います。 ワークシートを変数で書く場合は Sub test() Dim ws1 As Worksheet, ws2 As Worksheet Sheets(Array(ws1.Name, ws2.Name)).Select End Sub と、いちいち名前で指定しなければならないのでしょうか? それとももっと別の書き方があるのでしょうか?

  • VBAでシートのコピー

    お世話になっております。 VBAの未熟者ですが、個人の資料作成のためのシステムをコツコツと作っております。 今までマクロでシートのコピーをやっていたのですが、コマンドボタンでできるように変更しようとしてうまくいきません。 ファイルAの中にある幾つかのシートの内、シート「個人事業」を「請求書」ファイルの「Sheet2」にコピーしたいのです。その後名前を変更しています。 マクロのプログラムをそのままコピーしてみたのですが、[sheets("個人事業").paste]のところでエラーが出ます。 マクロとコマンドボタンではやはり設定を変更しないといけないのでしょうか?ご教授お願いします。 Private Sub CommandButton1_Click() Sheets("Sheet2").Select Windows("未請求リスト.XLS").Activate Sheets("個人事業").Select Selection.Copy Windows("請求書.xls").Activate Sheets("Sheet2").Select Sheets("個人事業").Paste Sheets("Sheet2").Name = "個人事業請求一覧" Sheets("請求書").Select End Sub 宜しくお願いします。

  • シートをコピーする際のVBAコードについて

    お世話になります。 sample.xls というファイルがあります。 このファイルの中にVBA処理にて、現在のシートをコピーする処理を行います。 Windows("sample.xls").Activate Sheets("sheet1").Select Sheets("sheet1").Copy after:=Sheets(Sheets.Count) sample.xlsは原本ファイルとなり、実際の運用時は拡張子の前に年月を表示する 形で保存されます。 (sample201106.xls、sample201109.xlsなど) こうなってしまうと、VBAで定義した Windows("sample.xls").Activate ファイル名が変わることで、この部分にエラーが生じます。 ファイル名が変更されても、上記コードがうまく機能するようにする方法はありますでしょうか? アドバイスいただけたらと思います。 よろしくお願いします。

  • エクセルシートのウィンドウ枠の固定について

    ■エクセルのファイルに次のマクロを設定し、ファイルを開くたびに「目次」のシートが表示されるようにします。 Private Sub Workbook_Open() Sheets("目次").Activate End Sub ■この目次のシートに目次を作成し、それぞれの目的のシートにハイパーリンクでジャンプするようにします。 「目次」のシートのそれぞれのセルに、目的のシートのセルA1をハイパーリンクする。 ■目的のシートでウィンドウ枠の固定を行う(6行目) --------------- このような設定下で、このファイルを新たに開くと、必ず「目次」のシートが表示され、目次の中から目的のシートを表示したセルのハイパーリンクをクリックすると、目的のシートにジャンプします。 ところが、ウィンドウ枠(6行目)が固定してあり、普通前回閉じた行から表示されるはずですが、 たとえば、 事例(A) 1 2 3 4 5 --- 100 101 102 ですが、実際に新たにファイルを開いて、目次からジャンプすると、 事例(B) 1 2 3 4 5 ---- 6 7 8 9 となって枠の設定のない状態と同じ状態で表示されます。 これを、前回閉じた事例(A)の状態で再表示されるようにしたいのですが、何が悪くて枠の固定が当初の状態に戻るのかわかりません。 何かの設定が不適切なのだと思います。 教えてください。

  • EXCEL VBA シートの連続印刷に白黒印刷

    EXCEL VBAの初心者です。回答、指導をよろしくお願いします。EXCEL2003を使用しています。シートAとBを連続で印刷するVBAに白黒で印刷するVBAを加えたいのですが記述方法がわかりませんのでご指導お願いします。シートの連続印刷VBAは下記ですが、これでよろしいでしょうか。どなたかご指導よろしくお願いします。 Sub purint複数シート印刷() Sheets(Array("A", "B")).PrintOut End Sub

  • VBAで複数シート選択

    エクセルVBAで複数のシートを選択する場合、 Sheets(Array("AAA", "BBB", "CCC")).Select  と書くと思いますが、マクロを回してみないことにはシート名や枚数が特定できない場合、どのように記述したらいいのでしょうか? たとえば、新たに追加されたSheets(n)~Sheets(n+x)を選択するような場合です。 よろしくお願いします。

  • EXCEL VBA(作業グループの解除)

    EXCEL VBAについての質問です。 複数のシートをコピーして別ブックに保存した後、元のブックが作業グループになってしまいます。 これを解除するコードを伝授いただけませんでしょうか? Sheets(Array("1", "2", "3")).Select Sheets(Array("1", "2", "3")).Copy

  • Excel2000でウインドウ枠の固定ができない

    Excel2000であるブックを開いたところ3つのワークシートがあるのですが、その中で1つめのワークシートだけが「ウインドウ枠の固定」ができません。何故なんでしょう? 一応 メニューから[ウインドウ]→[ウインドウ枠の固定]にするとメニュー上で[ウインドウ]を見ると[ウインドウ枠固定の解除]と出ていますがスクロールすると固定されずスクロールしてしまいます。

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • 指定したシート名以外を非表示にするには?VBA

    エクセルです。 例えば、 A,B,C,Dと言うシートがあり、 A以外を非表示にさせたい場合は、 Sub test() Dim SName As String '表示したいシート名 SName = "A" Sheets(Array("B", "C", "D")).Select ActiveWindow.SelectedSheets.Visible = False End Sub で出来ますが、 SName = "B"の場合など、どのシート名を指定した場合でも その指定したシート名以外のシートを非表示にするVBAコードを教えてくれませんか? しかも、例題でA,B,C,Dとしましたが 実際のシート名は、A会社、B会社、C事業部、D部署・・・等 関連性のないシート名だし、10シート以上あります。 Sheets(Array("B", "C", "D")).Select の部分を,VBAでどううまくやればいいのかわかりません。 SNameで指定したシート名以外をArrayしたいです。 ご回答よろしくお願いします。

専門家に質問してみよう