回答編集履歴

2

修正

2016/05/11 03:08

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  Public Sub SetTimer()
98
98
 
99
- '開始時間(例えば現在時刻の秒後)
99
+ '開始時間(例えば現在時刻の2秒後)
100
100
 
101
101
  tTimeSpan = Now + TimeValue("00:00:02")
102
102
 

1

追記

2016/05/11 03:08

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -61,3 +61,141 @@
61
61
 
62
62
 
63
63
  ただ、これでもシートを切り替えた時点で(VBAでの制御外で)切替後シートをもともとの表示位置で描画してしまうので、その位置から切替元シートの位置に移動する再描画(チラツキ)は発生してしまいます。
64
+
65
+
66
+
67
+ ---
68
+
69
+ ≪追記≫
70
+
71
+ 変更後シートが画面描画された後にSheetActivateイベントが発生するので、このイベントを使う限りは避けられないですよね。
72
+
73
+ Excelに画面スクロールイベントがあれば別の提案もできるのですが、それもないのでやはりなかなか難しいようです。
74
+
75
+
76
+
77
+ 他の方法というと、あとはタイマーで監視して定期的にスクロール位置を保存するという方法くらいしか思い当たりません。
78
+
79
+
80
+
81
+ 標準モジュールを作成し、以下を実装することでタイマー発生時のスクロール位置を全シートに反映することができます。
82
+
83
+ Workbook_OpenなどでSetTimerを呼び出してあげれば起動時からタイマーが開始されると思います。
84
+
85
+
86
+
87
+ ```VBA
88
+
89
+ '標準モジュールに実装
90
+
91
+ Private sBar_row As Long
92
+
93
+ Private sBar_col As Long
94
+
95
+
96
+
97
+ Public Sub SetTimer()
98
+
99
+ '開始時間(例えば現在時刻の3秒後)
100
+
101
+ tTimeSpan = Now + TimeValue("00:00:02")
102
+
103
+ 'プロシージャが実行中の場合の待ち時間(1秒後に再実行)
104
+
105
+ tResumeWait = TimeValue("00:00:01")
106
+
107
+ 'タイマーセット
108
+
109
+ Application.OnTime TimeValue(tTimeSpan), "SetScroll", TimeValue(tResumeWait)
110
+
111
+ End Sub
112
+
113
+
114
+
115
+ Private Sub SetScroll()
116
+
117
+ 'イベント/描画の停止
118
+
119
+ Application.ScreenUpdating = False
120
+
121
+ Application.EnableEvents = False
122
+
123
+
124
+
125
+ Dim nowSheet As Worksheet
126
+
127
+ Set nowSheet = ActiveSheet
128
+
129
+
130
+
131
+ sBar_row = ActiveWindow.ScrollRow
132
+
133
+ sBar_col = ActiveWindow.ScrollColumn
134
+
135
+
136
+
137
+ For Each sht In ThisWorkbook.Sheets
138
+
139
+ '現在のスクロール位置をアクティブシート以外に適用
140
+
141
+ If sht.Name <> ActiveSheet.Name Then
142
+
143
+ 'シート選択
144
+
145
+ sht.Activate
146
+
147
+
148
+
149
+ '各シートのセル選択状態を保存
150
+
151
+ Dim ac As Range
152
+
153
+ Set ac = Application.Selection
154
+
155
+
156
+
157
+ 'スクロール移動
158
+
159
+ Application.Goto sht.Cells(sBar_row, sBar_col), True
160
+
161
+
162
+
163
+ 'セル選択状態を復元
164
+
165
+ ac.Select
166
+
167
+ End If
168
+
169
+ Next
170
+
171
+
172
+
173
+ nowSheet.Activate
174
+
175
+
176
+
177
+ 'イベント/描画の再開
178
+
179
+ Application.EnableEvents = True
180
+
181
+ Application.ScreenUpdating = True
182
+
183
+
184
+
185
+ '次回タイマーをセット
186
+
187
+ Call SetTimer
188
+
189
+
190
+
191
+ End Sub
192
+
193
+ ```
194
+
195
+
196
+
197
+ やはり個人的にはタイマーで常時監視というのは負荷が高そうで抵抗がありますが。。
198
+
199
+ 参考までに。
200
+
201
+