質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • VBA

    1854questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1590questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • マクロ

    229questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

【Excelマクロ】シート切替時の表示位置取得

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,029

forestfield

score 8

Excelでシートを切り替えた時に、表示位置が切替前シートと同じになるようにしたいです。
動作的には以下のコードで思い通りになったのですが、ちらつきがひどいです。
どうすればよいでしょうか。

'シートがアクティブになったとき
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  '描画・イベント制限
    Application.ScreenUpdating = False
    Application.EnableEvents = False

  '切替前シートのスクロール位置に移動
    Application.Goto Sh.Cells(sBar_row, sBar_col), True

  '描画・イベント制限解除
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


'シートが非アクティブになったとき
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
  '描画・イベント制限
    Application.ScreenUpdating = False
    Application.EnableEvents = False

  '切替前シートをアクティブにする
    Worksheets(Sh.Name).Activate

  'スクロール位置を取得
    sBar_row = ActiveWindow.ScrollRow
    sBar_col = ActiveWindow.ScrollColumn

  '描画・イベント制限解除
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Workbook_SheetDeactivateの時点でシートは既に切り替わっていて、切替前画面をアクティブにしなければScrollRow、ScrollColumnは取得できず、ScreenUpdatingをFalseにしてもActivateでの画面切替は制御出来ていないようです。

使用用途は複数のExcelファイルをシート別に読み込み、差分を色分けして分かるようにする機能を作ったので、シートを切り替えた時にページ移動しなくて済むようにしたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

Open時に現在のシートの位置を記録 => 動かすたびに記録 => activateするたびに記録

で、すべての位置を把握していくのはいかがでしょうか。

もしくは、Activateにしなくてもシートにアクセスは出来るはずですが、それだと取れないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 16:16

    回答ありがとうございます。

    質問文に使用用途を追記しましたが、シートの編集・クリックする事は恐らく少なくて、横にも縦にも長い表なのでカーソル移動も少ないかもしれません。
    主な操作はスクロールバーでの移動とシート切替になると思います。
    ですので「動かすたびに記録」が難しいと思います。
    「activateするたびに記録」で対応したいのですが、うまい事ちらつきに対応出来ていない状態です。

    「Activateにしなくてもシートにアクセスは出来る」
    こちらはWorksheetオブジェクトの事だと思うのですが、ScrollRow・ScrollColumnはWindowオブジェクトのメンバのようでWorksheetオブジェクトは持っていませんでした。

    キャンセル

0

一応、以下の方法でアクティブシートを一瞬変更することによるチラツキをなくすことはできると思います。

'Workbook_SheetActivateは不要
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    'イベント/描画の停止
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    '切替後シート
    Dim newSheet As Worksheet
    Set newSheet = ActiveSheet
    '切替前シート
    Dim oldSheet As Worksheet
    Set oldSheet = Worksheets(Sh.Name)

    '切替前シートからスクロール位置取得
    oldSheet.Activate
    sBar_row = ActiveWindow.ScrollRow
    sBar_col = ActiveWindow.ScrollColumn

    '切替後シートでスクロール位置移動
    newSheet.Activate
    Application.Goto newSheet.Cells(sBar_row, sBar_col), True

    'イベント/描画の再開
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

ただ、これでもシートを切り替えた時点で(VBAでの制御外で)切替後シートをもともとの表示位置で描画してしまうので、その位置から切替元シートの位置に移動する再描画(チラツキ)は発生してしまいます。


≪追記≫
変更後シートが画面描画された後にSheetActivateイベントが発生するので、このイベントを使う限りは避けられないですよね。
Excelに画面スクロールイベントがあれば別の提案もできるのですが、それもないのでやはりなかなか難しいようです。

他の方法というと、あとはタイマーで監視して定期的にスクロール位置を保存するという方法くらいしか思い当たりません。

標準モジュールを作成し、以下を実装することでタイマー発生時のスクロール位置を全シートに反映することができます。
Workbook_OpenなどでSetTimerを呼び出してあげれば起動時からタイマーが開始されると思います。

'標準モジュールに実装
Private sBar_row As Long
Private sBar_col As Long

Public Sub SetTimer()
    '開始時間(例えば現在時刻の2秒後)
    tTimeSpan = Now + TimeValue("00:00:02")
    'プロシージャが実行中の場合の待ち時間(1秒後に再実行)
    tResumeWait = TimeValue("00:00:01")
    'タイマーセット
    Application.OnTime TimeValue(tTimeSpan), "SetScroll", TimeValue(tResumeWait)
End Sub

Private Sub SetScroll()
    'イベント/描画の停止
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    Dim nowSheet As Worksheet
    Set nowSheet = ActiveSheet

    sBar_row = ActiveWindow.ScrollRow
    sBar_col = ActiveWindow.ScrollColumn

    For Each sht In ThisWorkbook.Sheets
        '現在のスクロール位置をアクティブシート以外に適用
        If sht.Name <> ActiveSheet.Name Then
            'シート選択
            sht.Activate

            '各シートのセル選択状態を保存
            Dim ac As Range
            Set ac = Application.Selection

            'スクロール移動
            Application.Goto sht.Cells(sBar_row, sBar_col), True

            'セル選択状態を復元
            ac.Select
        End If
    Next

    nowSheet.Activate

    'イベント/描画の再開
    Application.EnableEvents = True
    Application.ScreenUpdating = True

    '次回タイマーをセット
    Call SetTimer

End Sub

やはり個人的にはタイマーで常時監視というのは負荷が高そうで抵抗がありますが。。
参考までに。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 16:23

    回答ありがとうございます。

    確かにちらつきが少し収まりました。
    しかし差分を色分けしている仕様上これでもまだシートの切り替わりが目立ってしまいます。
    もはやVBAの制御外との事なのでどうしようも無いのでしょうか。。。

    キャンセル

  • 2016/05/11 12:09

    一応、参考までに代案追記させていただきました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    つExcel.マクロ.VBお助けください。

    エクセルでマクロを組んでいます   別ファイルの指定した個所の値を取り込みたいです。 途中までは動いているのですが指定した個所の値ではなく、 なぜか空白になってしまってい

  • 解決済

    【内容追記】あるExcelの複数のシートから、特定の値を持つ「行」のみ別のExcelへ抽出したい

    Excelでのマンションの売上管理を行うこととなりました。 今までは1シート1マンションという形で管理しており、全体の数字や予定等を見る際に手間がかかっていました。 これを期に

  • 解決済

    Excelの入力規則が破られてしまう

    Excelの入力規則を使って、プルダウンを作りました。 普通に、プルダウンの中の項目以外を入力するとアラートが表示され、 入力が拒否されるのですが、入力セルで、右クリック→

  • 解決済

    Excel VBA 行挿入の高速化

    タイトルの通り、行挿入の高速化方法について質問です。 Excelのシートに、仕様の一部として、例えばA列のセルにデータがある場合、その行に2行ずつ行追加しなければならないよう

  • 解決済

    Google SpreadSheetで式を値に変更する関数はありますか?

    スプレッドシート(excel)の関数についてです。 スプレッドシートでタスク管理表を作っています。 その際にプルダウンメニューで「Doing」「Done」の枠を設けました。

  • 解決済

    別ファイルのセル 操作

    別ファイルのセルの操作ができず、困っています。 ファイルAからファイルBを開き、ファイルBを閉じるときに、ファイルAに値を反映させて、ファイルBを閉じる処理を行いたいと思ってお

  • 受付中

    Excel2010 内容を変更して上書き保存した日をセルに出力

    実現したいこと Excel2010において、上書き保存したタイミングで、内容(書式設定だけとかセルの設定だけを含む)が変更されたか調べ、内容が変更された場合には変更日をセルに出力す

  • 解決済

    VBAファイル操作の高速化

    あるディレクトリにあるすべてのファイルを開いて必要個所をコピーし、一つのブックにまとめる作業をしています。 しかしこの作業が非常に時間がかかります。フォルダ内50程度のファイルでも

同じタグがついた質問を見る

  • VBA

    1854questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1590questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • マクロ

    229questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。