一応、以下の方法でアクティブシートを一瞬変更することによるチラツキをなくすことはできると思います。
VBA
1'Workbook_SheetActivateは不要
2Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
3 'イベント/描画の停止
4 Application.ScreenUpdating = False
5 Application.EnableEvents = False
6
7 '切替後シート
8 Dim newSheet As Worksheet
9 Set newSheet = ActiveSheet
10 '切替前シート
11 Dim oldSheet As Worksheet
12 Set oldSheet = Worksheets(Sh.Name)
13
14 '切替前シートからスクロール位置取得
15 oldSheet.Activate
16 sBar_row = ActiveWindow.ScrollRow
17 sBar_col = ActiveWindow.ScrollColumn
18
19 '切替後シートでスクロール位置移動
20 newSheet.Activate
21 Application.Goto newSheet.Cells(sBar_row, sBar_col), True
22
23 'イベント/描画の再開
24 Application.EnableEvents = True
25 Application.ScreenUpdating = True
26End Sub
ただ、これでもシートを切り替えた時点で(VBAでの制御外で)切替後シートをもともとの表示位置で描画してしまうので、その位置から切替元シートの位置に移動する再描画(チラツキ)は発生してしまいます。
≪追記≫
変更後シートが画面描画された後にSheetActivateイベントが発生するので、このイベントを使う限りは避けられないですよね。
Excelに画面スクロールイベントがあれば別の提案もできるのですが、それもないのでやはりなかなか難しいようです。
他の方法というと、あとはタイマーで監視して定期的にスクロール位置を保存するという方法くらいしか思い当たりません。
標準モジュールを作成し、以下を実装することでタイマー発生時のスクロール位置を全シートに反映することができます。
Workbook_OpenなどでSetTimerを呼び出してあげれば起動時からタイマーが開始されると思います。
VBA
1'標準モジュールに実装
2Private sBar_row As Long
3Private sBar_col As Long
4
5Public Sub SetTimer()
6 '開始時間(例えば現在時刻の2秒後)
7 tTimeSpan = Now + TimeValue("00:00:02")
8 'プロシージャが実行中の場合の待ち時間(1秒後に再実行)
9 tResumeWait = TimeValue("00:00:01")
10 'タイマーセット
11 Application.OnTime TimeValue(tTimeSpan), "SetScroll", TimeValue(tResumeWait)
12End Sub
13
14Private Sub SetScroll()
15 'イベント/描画の停止
16 Application.ScreenUpdating = False
17 Application.EnableEvents = False
18
19 Dim nowSheet As Worksheet
20 Set nowSheet = ActiveSheet
21
22 sBar_row = ActiveWindow.ScrollRow
23 sBar_col = ActiveWindow.ScrollColumn
24
25 For Each sht In ThisWorkbook.Sheets
26 '現在のスクロール位置をアクティブシート以外に適用
27 If sht.Name <> ActiveSheet.Name Then
28 'シート選択
29 sht.Activate
30
31 '各シートのセル選択状態を保存
32 Dim ac As Range
33 Set ac = Application.Selection
34
35 'スクロール移動
36 Application.Goto sht.Cells(sBar_row, sBar_col), True
37
38 'セル選択状態を復元
39 ac.Select
40 End If
41 Next
42
43 nowSheet.Activate
44
45 'イベント/描画の再開
46 Application.EnableEvents = True
47 Application.ScreenUpdating = True
48
49 '次回タイマーをセット
50 Call SetTimer
51
52End Sub
やはり個人的にはタイマーで常時監視というのは負荷が高そうで抵抗がありますが。。
参考までに。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/10 07:23
2016/05/11 03:09