VBAのプログラム内で、RangeやCellsを指定して.selectをしている箇所が複数あるのですが、
処理が一通り走った後、参照先のsheetを見ると、プログラム内部でSelectした選択範囲がそのまま残っていて、見た目上あまり好ましくありません。
そういった残ってしまったsheetのselect状態を一括で解放する方法はありますか。
Worksheet(1).Activate
Range("A1").Select
Worksheet(2).Activate
Range("A1").Select
を10シートくらいに対応させてやるのもなんか、ダサいです。
まぁ上記処理ならFor文で回す方法で簡潔に書けるといえば書けるのですが、
なにか良い方法はありませんか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
全シート一律で処理するなら、saziさんからのアドバイスにもある通り、Sheets.Select
で全シート選択するのが簡単です。
(しかし私の環境ではsaziさん提供のコードではセルのSelect時にエラーが発生したため、別途投稿させていただきました。)
ループで処理する方法は好まれていないようですが、コードとしては大差ありません。
ループ処理にはループ処理のメリットもあり、1シートずつ判断が組み込めるので一律で変更したくないシートなどは対象外にすることもできます。
あとは好みの問題でしょうか。
好みでいえば、私はアクティブシートやセルの選択状態をマクロ処理で変えてしまうこと自体があまり好みではないので、極力それを行わないようなコードを書きますが…避けられないときもありますよね(^-^;
全シート一括設定のサンプル
Sheets.Select
を使った一括変更のサンプルです。
処理前にアクティブだったシートを最後にアクティブに戻す必要がなければ、shDef関連の部分は不要です。
Sub Sample() Dim shDef As Worksheet Set shDef = ActiveSheet '処理前のアクティブシートを退避 '全てのシートを選択 Sheets.Select '選択中のシートでA1セルを選択 ActiveSheet.Range("A1").Select '処理前のアクティブシートを選択 shDef.Select End Sub
ループ処理のサンプル
こちらはループ処理で実装する場合のサンプルです。
処理前のアクティブシートに戻す処理は組み込んでいません(^-^;
Sub Sample2() Dim sh As Worksheet '全てのシートをループ処理 For Each sh In Worksheets 'シートをアクティブ化しないとセルが選択できない sh.Activate 'A1セルを選択 sh.Range("A1").Select Next sh End Sub
以上、参考になれば幸いです。
投稿2018/01/25 03:48
編集2018/01/25 03:55総合スコア3013
0
これでできますね。
VBA
1 Sheets.Select 2 Range("A1").Select 3 Sheets(1).Select
追記
上記のSheets.Selectはリファレンスには載っていない記述です。
エラーになったというコメントが有りましたので、正式な内容での追記をしておきます。
VBA
1 x = Array("Sheet1","Sheet1") 'シートが可変ならこの部分をループで 2 Sheets(x).Select 3 Range("A1").Select 4 Sheets(1).Select
※検証環境(Windows10,excel2007)
環境依存があるかもしれませんので、注意して下さい。
投稿2018/01/24 08:24
編集2018/01/25 05:08総合スコア25072
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
シートを処理したときに名前を保存して置いて
あとで処理したシートのみ選択位置を変えるのはどうでしょうか。
VBA
1Sub tset() 2 3 Dim ShName As String 4 Dim ShArray() As String 5 Dim NowSheet As Worksheet 6 Dim i As Integer 7 8 Set NowSheet = ActiveSheet 9 10'プログラム上の処理 11 For i = 1 To 5 12 If i Mod 2 = 1 Then 13 '処理したシートのみ名前を保存 14 ShName = ShName & Chr(9) & Sheets(i).Name 15 End If 16 Next i 17 18 '最初のいらないタブを除いて配列化 19 ShArray = Split(Mid(ShName, 2), Chr(9)) 20 21 22 Sheets(ShArray).Select 23 Range("A1").Select 24 NowSheet.Select 25 26End Sub
投稿2018/01/27 05:16
総合スコア305
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そもそも、プログラム内のSelectは必要ですか?
個人的には滅多にSelectすることがありません。
恐らく不要なSelectなので、無くす方向で考えるのが自然だと思います。
ただ、もしSelectしなければならない場合があり、
元の状態に戻したいときは、
SelectionをRange型変数に確保しておき
Select等の処理後に上記RangeでSelectし直したりします。
※選択状態のものが常にRangeとは限らないのでエラー回避してください。
シートの選択状態をわざわざA1にしたいという要求のある環境なのであれば、
For Each Sheet in ThisWorkBook.WorkSheets
等でシートを回し、各シートで選択状態にしていけばいいでしょう。
※シートが非表示だったりすると選択ができませんので、
環境に沿った形で実装するのが無難でしょう。
投稿2018/01/25 06:49
総合スコア1175
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
VBA
1Application.ScreenUpdating = False 2for i = 1 to worksheets.count 3 sheets(i).activate 4 range("A1").select 5Next 6Application.ScreenUpdating = true
これはだめですか?
投稿2018/01/24 08:25
編集2018/01/24 09:54総合スコア15
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/25 04:26
2018/01/25 04:35
2018/01/25 04:45
2018/01/25 04:52
2018/01/25 05:03
2018/01/25 05:09 編集
2018/01/25 05:14 編集
2018/01/25 05:17