teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2016/05/11 03:08

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -47,7 +47,7 @@
47
47
  Private sBar_col As Long
48
48
 
49
49
  Public Sub SetTimer()
50
- '開始時間(例えば現在時刻の秒後)
50
+ '開始時間(例えば現在時刻の2秒後)
51
51
  tTimeSpan = Now + TimeValue("00:00:02")
52
52
  'プロシージャが実行中の場合の待ち時間(1秒後に再実行)
53
53
  tResumeWait = TimeValue("00:00:01")

1

追記

2016/05/11 03:08

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -29,4 +29,72 @@
29
29
  End Sub
30
30
  ```
31
31
 
32
- ただ、これでもシートを切り替えた時点で(VBAでの制御外で)切替後シートをもともとの表示位置で描画してしまうので、その位置から切替元シートの位置に移動する再描画(チラツキ)は発生してしまいます。
32
+ ただ、これでもシートを切り替えた時点で(VBAでの制御外で)切替後シートをもともとの表示位置で描画してしまうので、その位置から切替元シートの位置に移動する再描画(チラツキ)は発生してしまいます。
33
+
34
+ ---
35
+ ≪追記≫
36
+ 変更後シートが画面描画された後にSheetActivateイベントが発生するので、このイベントを使う限りは避けられないですよね。
37
+ Excelに画面スクロールイベントがあれば別の提案もできるのですが、それもないのでやはりなかなか難しいようです。
38
+
39
+ 他の方法というと、あとはタイマーで監視して定期的にスクロール位置を保存するという方法くらいしか思い当たりません。
40
+
41
+ 標準モジュールを作成し、以下を実装することでタイマー発生時のスクロール位置を全シートに反映することができます。
42
+ Workbook_OpenなどでSetTimerを呼び出してあげれば起動時からタイマーが開始されると思います。
43
+
44
+ ```VBA
45
+ '標準モジュールに実装
46
+ Private sBar_row As Long
47
+ Private sBar_col As Long
48
+
49
+ Public Sub SetTimer()
50
+ '開始時間(例えば現在時刻の3秒後)
51
+ tTimeSpan = Now + TimeValue("00:00:02")
52
+ 'プロシージャが実行中の場合の待ち時間(1秒後に再実行)
53
+ tResumeWait = TimeValue("00:00:01")
54
+ 'タイマーセット
55
+ Application.OnTime TimeValue(tTimeSpan), "SetScroll", TimeValue(tResumeWait)
56
+ End Sub
57
+
58
+ Private Sub SetScroll()
59
+ 'イベント/描画の停止
60
+ Application.ScreenUpdating = False
61
+ Application.EnableEvents = False
62
+
63
+ Dim nowSheet As Worksheet
64
+ Set nowSheet = ActiveSheet
65
+
66
+ sBar_row = ActiveWindow.ScrollRow
67
+ sBar_col = ActiveWindow.ScrollColumn
68
+
69
+ For Each sht In ThisWorkbook.Sheets
70
+ '現在のスクロール位置をアクティブシート以外に適用
71
+ If sht.Name <> ActiveSheet.Name Then
72
+ 'シート選択
73
+ sht.Activate
74
+
75
+ '各シートのセル選択状態を保存
76
+ Dim ac As Range
77
+ Set ac = Application.Selection
78
+
79
+ 'スクロール移動
80
+ Application.Goto sht.Cells(sBar_row, sBar_col), True
81
+
82
+ 'セル選択状態を復元
83
+ ac.Select
84
+ End If
85
+ Next
86
+
87
+ nowSheet.Activate
88
+
89
+ 'イベント/描画の再開
90
+ Application.EnableEvents = True
91
+ Application.ScreenUpdating = True
92
+
93
+ '次回タイマーをセット
94
+ Call SetTimer
95
+
96
+ End Sub
97
+ ```
98
+
99
+ やはり個人的にはタイマーで常時監視というのは負荷が高そうで抵抗がありますが。。
100
+ 参考までに。