Article

【Excel VBA】全シートをA1セル・標準倍率に戻してから保存するマクロ

この記事で分かること

配布前のExcelファイルで全シートをA1セル・表示倍率100%・スクロール位置1行1列目に一括リセットするVBAマクロ。個人用マクロブック(PERSONAL.XLSB)に登録すればAlt+F8だけで実行できます。

配布先で Excel ファイルを開いた瞬間、全シートが A1 セル選択・倍率 100% で揃っていると、受け取った相手の印象は大きく変わります。手作業で各シートをクリックして A1 に戻す作業は地味に時間を取られますが、VBA マクロなら保存前に 1 ステップで完了します。

この記事では、ブック内の全シートを A1 セル選択・表示倍率 100%・スクロール位置 1 行 1 列目 に一括リセットする VBA マクロと、個人用マクロブック(PERSONAL.XLSB)に登録してどの Excel ファイルでも使えるようにする手順をまとめます。対象は Microsoft Excel 2024 / Microsoft 365 デスクトップ版(Windows・日本語 UI)です。

サンプルファイル xlsm ・ 約 18 KB

4 枚の日本語シート(売上データ・顧客一覧・商品カタログ・在庫管理)が、それぞれ違う倍率・違うスクロール位置で保存されています。記事のマクロも埋め込み済みなので、開いたら Alt+F8 で ResetAllSheetsToA1 を実行してみてください。

ダウンロード

初回の開きかた: ダウンロードしたファイルをダブルクリックすると、上部に「保護されたビュー」や「セキュリティの警告 マクロが無効にされました」の黄色いバーが出ます。信頼できる場合のみ、バー右の 編集を有効にする → 続いて コンテンツの有効化(またはマクロを有効にする)をクリックしてください。これで Alt+F8 からマクロを実行できるようになります。社内配布する場合は、コードを自分で確認したうえで信頼する運用が基本です。

有効化した状態でファイルを開くと、例えば売上データのシートはこんな風に「どこに行ったのか分からない位置」から始まります。

Excelで全シートを開いた直後、売上データの表示倍率150%かつスクロール位置が行18・列Bに飛んでおり、表データが画面から外れている様子
配布ファイルを開いた瞬間の売上データシート。倍率 150%・E25 選択で、肝心の年間集計表が画面外に出ている

本文だけでも動くように、先に完成したマクロを載せておきます。VBE にそのまま貼り付けてください。

全シートをA1・標準倍率に戻すVBAマクロ(完成コード)

以下のコードをそのまま標準モジュールに貼り付ければ動きます。Worksheets のみをループするのでグラフシートを自動で除外し、非表示シートの表示状態や元のアクティブシートも保持して復元します。

Sub ResetAllSheetsToA1()
    Dim ws As Worksheet
    Dim origVisible As Variant
    Dim origActiveName As String
    Dim i As Long
    Dim prevSU As Boolean, prevEv As Boolean

    prevSU = Application.ScreenUpdating
    prevEv = Application.EnableEvents
    On Error GoTo Finally_
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    With ActiveWorkbook
        origActiveName = .ActiveSheet.Name
        ReDim origVisible(1 To .Worksheets.Count)

        i = 0
        For Each ws In .Worksheets
            i = i + 1
            origVisible(i) = ws.Visible
            ws.Visible = xlSheetVisible
            ws.Activate
            ws.Range("A1").Select
            ActiveWindow.Zoom = 100
            ActiveWindow.ScrollRow = 1
            ActiveWindow.ScrollColumn = 1
        Next ws

        i = 0
        For Each ws In .Worksheets
            i = i + 1
            ws.Visible = origVisible(i)
        Next ws

        On Error Resume Next
        .Sheets(origActiveName).Activate
        On Error GoTo Finally_
    End With

Finally_:
    Application.ScreenUpdating = prevSU
    Application.EnableEvents = prevEv
End Sub

実行すると、先ほどの「どこに行ったか分からない」状態が、開いた瞬間に読めるレイアウトへ変わります。

マクロ実行後の売上データシート。倍率100%でA1セルが選択され、月次売上と年間合計の表が画面に収まって表示されている
マクロ実行後。A1 選択・倍率 100% に揃い、年間合計まで画面に収まる

マクロをVBEに貼り付けて実行する手順

対象の Excel ファイルを開いた状態で、次の手順を踏んでください。

  1. Alt + F11 で VBE(Microsoft Visual Basic for Applications)を起動します。
  2. 左の「プロジェクト」ツリーで対象ブックを選択し、メニューの 挿入 > 標準モジュール をクリックします。
  3. 開いたコードウィンドウに、上のコード全文を貼り付けます。
  4. コードウィンドウ内にカーソルがある状態で F5 キーを押すと、その場で実行できます。
Visual Basic for Applicationsの画面。左側のプロジェクトツリーに標準モジュール「modResetSheets」があり、右側のコードウィンドウにResetAllSheetsToA1のコードが表示されている
VBE に貼り付けた直後の状態。標準モジュール modResetSheetsResetAllSheetsToA1 が入っている

動作を確認するなら、顧客一覧や商品カタログのシートも、実行前後でどう変わるか見比べてみてください。

顧客一覧シートの実行前。倍率80%で顧客コードC-1009以降だけが表示されており、ヘッダー行と上半分の顧客が見えない
顧客一覧・実行前(倍率 80%、スクロールで 10 行目から表示)
顧客一覧シートの実行後。倍率100%でヘッダー行が先頭に表示され、C-1001から順に顧客データが読める
顧客一覧・実行後(倍率 100%・A1 から表示)

商品カタログや在庫管理のように「スクロールしたら列のヘッダーが見えなくなる」状態も、同じ処理でまとめて戻せます。

商品カタログシートの実行前。倍率125%でスクロール位置がC列・6行目にずれており、商品コードとヘッダーが見えない
商品カタログ・実行前(倍率 125%、列 C から表示でヘッダー行見切れ)
商品カタログシートの実行後。A1選択・倍率100%で商品コード・商品名・カテゴリ・価格・粗利率が一覧できる
商品カタログ・実行後(A1・倍率 100%、ヘッダーと全列が読める)

個人用マクロブック(PERSONAL.XLSB)に登録して、どのブックからも使う

このマクロは、配布前のファイルを整える用途で繰り返し使います。対象ファイルの中に毎回コードを貼るのは面倒なので、個人用マクロブック(PERSONAL.XLSB)に登録しておくのが現実的です。一度登録してしまえば、任意の .xlsx / .xlsm を開いた状態で Alt + F8 から呼び出せます。

初回セットアップ

  1. Excel を起動し、空の新規ブックを開きます。
  2. リボンの 表示 タブ > マクロ▼ > マクロの記録 をクリックします。
  3. 表示される「マクロの記録」ダイアログで、マクロの保存先個人用マクロブック に変更し、OK をクリックします。
  4. すぐに 表示 タブ > マクロ▼ > 記録終了 をクリックします(中身は空で構いません)。これで PERSONAL.XLSB%AppData%\Microsoft\Excel\XLSTART\ に自動生成されます。
  5. Alt + F11 で VBE を開き、左のツリーから VBAProject (PERSONAL.XLSB) > 標準モジュール > Module1 を開きます。
  6. 先ほどの完成コードをそのまま貼り付けます。
  7. Excel を終了するとき 「個人用マクロブックの変更を保存しますか?」と聞かれたら 「保存」 を選びます。

以降の使い方

  • 任意の .xlsx / .xlsm を開いた状態で Alt + F8
  • マクロ一覧に PERSONAL.XLSB!ResetAllSheetsToA1 が出るので、選択して 実行
  • Ctrl + S で保存すれば配布準備完了です。

コードで ActiveWorkbook を使っているのがポイントです。PERSONAL.XLSB から見ると ThisWorkbook は PERSONAL.XLSB 自身を指してしまい、ユーザーが開いているブックに対して何も起きません。ActiveWorkbook に書き換えずに貼り付ければそのまま動きます。

コードの要所と、書き換えるときに踏みやすい落とし穴

見た目より地味に罠があるマクロです。書き換えるときに押さえておきたい挙動を 5 点挙げます。

Worksheetsループにすると、グラフシートを自動で外せる

For Each sh In ActiveWorkbook.Sheets と書くと、ワークシートに加えてグラフシートも回してしまいます。グラフシートに対して ActiveWindow.ScrollRow = 1 を実行すると「Window クラスの ScrollRow プロパティを設定できません」という実行時エラー 1004 が出ます。Worksheets コレクションで回せば、グラフシートは自動的に対象外になるので安全です。

Zoom・Scroll・選択セルはシート単位で保存される

「ウィンドウ」のプロパティに見えて、実際は各シートごとに保存されます。そのため 全シートを一度ずつアクティブにして書き換える 必要があります。1 つのシートで Zoom = 100 にしても、他のシートには反映されません。保存して閉じて開き直しても、シートごとに設定が復元されます。

非表示シートも一時可視化してからリセットする

Excel 2024 の実機検証では、Worksheet.Activate は非表示(xlSheetHidden)や超非表示(xlSheetVeryHidden)のシートに対してもエラーを出さずに成功しました。ただし ActiveWindow.Zoom 等のウィンドウ系プロパティを確実に書き換えるには、一度 xlSheetVisible に戻してから .Activate する のが安全です。処理後は origVisible 配列で元の表示状態へ戻します。

Application.EnableEvents を切る

マクロ内の Range("A1").Select は、対象シートに Worksheet_SelectionChange イベントが仕込んであれば発火します。業務ブックで「セル選択のたびに何か動く」マクロが入っていると、リセット中に何度も余計な処理が走ってしまいます。Application.EnableEvents = False で一時停止して、終了時に元の値へ戻します。

On Error GoTo Finally_ で Excel を操作不能にしない

もし途中でエラーが出ると、Application.ScreenUpdating = FalseEnableEvents = Falseそのまま残ってしまい、Excel が一見操作不能に見える状態になります。On Error GoTo Finally_ と組み合わせ、prevSU / prevEv に退避していた値を最後に必ず戻す構造にしておくと、事故が起きても画面が復旧します。

カスタマイズ例(倍率変更・特定シート除外・複数ウィンドウ対応)

標準倍率を100%以外に変える

社内標準が 125% の場合、Const で一か所に定数化しておくと書き換えやすくなります。

Const DEFAULT_ZOOM As Long = 125
' ...
ActiveWindow.Zoom = DEFAULT_ZOOM

特定シートだけリセット対象から外す

ダッシュボードシートなど、開いたときのスクロール位置や倍率を保っておきたいシートは、名前で除外します。

If ws.Name <> "ダッシュボード" Then
    ws.Activate
    ws.Range("A1").Select
    ActiveWindow.Zoom = 100
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
End If

ws.CodeName で比較する方法も紹介されがちですが、PERSONAL.XLSB から .xlsx ターゲットを触る場合は CodeName が空文字列になります。名前が変わる可能性が低い運用なら、ws.Name での比較で十分実用的です。

「表示 > 新しいウィンドウ」を使っている場合の対応

1 つのブックに対して複数のウィンドウを開いていると、ウィンドウごとに倍率が保存されます。全ウィンドウをリセットしたい場合は、Windows コレクションを外側ループにします。

Dim win As Window
For Each win In ActiveWorkbook.Windows
    win.Activate
    For Each ws In ActiveWorkbook.Worksheets
        ws.Visible = xlSheetVisible
        ws.Activate
        ws.Range("A1").Select
        ActiveWindow.Zoom = 100
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
    Next ws
Next win

うまく動かないときの確認ポイント

症状主な原因対処
実行時エラー 1004「Window クラスの ScrollRow プロパティを設定できません」For Each sh In Sheets でグラフシートを処理しているFor Each ws In Worksheets に変更する
実行後に Excel の画面が更新されない / セル入力に反応しないマクロが途中で中断し ScreenUpdating = False / EnableEvents = False のまま残ったイミディエイトウィンドウで Application.ScreenUpdating = TrueApplication.EnableEvents = True を実行。本記事のコードは Finally_ で自動復元する
元々非表示だったシートが可視化されたまま復元ループが何らかのエラーで飛ばされたVBE のイミディエイトウィンドウで Worksheets("シート名").Visible = xlSheetHidden を手動実行
拡大率 100 が小さく感じる社内標準と違うカスタマイズ例の DEFAULT_ZOOM を変更
配布相手の PC でまだ画面がズレるマクロ実行後に保存していないCtrl + S で保存する。マクロ末尾に ActiveWorkbook.Save を追加してもよい
複数ウィンドウのブックで一部ウィンドウだけ残る基本版は ActiveWindow のみ処理カスタマイズ例の「新しいウィンドウ」対応版を使う
PERSONAL.XLSB に貼ったのに Alt+F8 のマクロ一覧に出ないPERSONAL.XLSB が生成されていない「マクロの記録」→「個人用マクロブック」→「記録終了」の手順で PERSONAL.XLSB を先に作る

まとめ

  • Excel の 倍率・スクロール位置・選択セルはシート単位で保存されるため、全シートを一度ずつアクティブにしてリセットする必要がある。
  • Worksheets コレクションで回すと、グラフシートを自動で除外できる(Sheets だと ScrollRow 代入でエラーになる)。
  • 非表示シートは一時可視化してリセットし、元の表示状態に戻す。
  • マクロ中は ScreenUpdatingEnableEventsFalse にし、On Error GoTo Finally_ で必ず元の値に戻す。
  • 配布前処理として使うなら PERSONAL.XLSB に登録し、Alt + F8 から呼ぶ運用が最も実用的。

最後にコピペ用のコードをもう一度置いておきます。PERSONAL.XLSB に貼って保存すれば、翌日から使い始められます。

Sub ResetAllSheetsToA1()
    Dim ws As Worksheet
    Dim origVisible As Variant
    Dim origActiveName As String
    Dim i As Long
    Dim prevSU As Boolean, prevEv As Boolean

    prevSU = Application.ScreenUpdating
    prevEv = Application.EnableEvents
    On Error GoTo Finally_
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    With ActiveWorkbook
        origActiveName = .ActiveSheet.Name
        ReDim origVisible(1 To .Worksheets.Count)

        i = 0
        For Each ws In .Worksheets
            i = i + 1
            origVisible(i) = ws.Visible
            ws.Visible = xlSheetVisible
            ws.Activate
            ws.Range("A1").Select
            ActiveWindow.Zoom = 100
            ActiveWindow.ScrollRow = 1
            ActiveWindow.ScrollColumn = 1
        Next ws

        i = 0
        For Each ws In .Worksheets
            i = i + 1
            ws.Visible = origVisible(i)
        Next ws

        On Error Resume Next
        .Sheets(origActiveName).Activate
        On Error GoTo Finally_
    End With

Finally_:
    Application.ScreenUpdating = prevSU
    Application.EnableEvents = prevEv
End Sub

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント