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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

解決済

5回答

4797閲覧

VBA sheetのセレクト情報をリセットしたいです。

King_of_Flies

総合スコア382

VBA

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

0グッド

0クリップ

投稿2018/01/24 07:41

VBAのプログラム内で、RangeやCellsを指定して.selectをしている箇所が複数あるのですが、
処理が一通り走った後、参照先のsheetを見ると、プログラム内部でSelectした選択範囲がそのまま残っていて、見た目上あまり好ましくありません。

そういった残ってしまったsheetのselect状態を一括で解放する方法はありますか。

Worksheet(1).Activate
Range("A1").Select
Worksheet(2).Activate
Range("A1").Select
を10シートくらいに対応させてやるのもなんか、ダサいです。
まぁ上記処理ならFor文で回す方法で簡潔に書けるといえば書けるのですが、
なにか良い方法はありませんか。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/01/25 04:26

>jawaさん >しかし私の環境ではsaziさん提供のコードではセルのSelect時にエラーが発生したため そうでしたか。 リファレンスでは、Sheets(array("Sheet1", "Sheet2").Select のような内容ですが、 Sheets.Select として動作したので、その内容での回答としました。 ただ、Sheets.Selectの記述については文献が無いんですよね。 回答追記しておきます。
jawa

2018/01/25 04:35

Sheets.Selectでシートの全選択はできているのですが、その状態でのRange("A1").Selectがエラーとなりました。 複数シートを選択している状態から対象シートを明示しないRange指定を行うとオブジェクト定義エラーとなるようです。 ActiveSheet.Range("A1").Selectならエラーとならず全シート対象に処理してくれるようでした。 対象シートを明示しないRangeはアクティブシートを対象にするものと思っていましたが、複数シート選択状態ではそうでもないようですね。
sazi

2018/01/25 04:45

うーん。 マクロの記録で行ってもセル選択部分は、シートの指定は行われていないので、Sheets(array(シート)).Selectでシートを指定すればエラーにならないような気がします。 エラーが発生しない環境なので、確認はできませんが。。。
jawa

2018/01/25 04:52

ちなみに私の環境(Windows7/Excel2010)で ①複数シート(シート1~3)を選択 ②A1セルをクリック という操作をマクロ記録した結果は、 ``` Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select Sheets("Sheet3").Activate Range("A1").Select ``` となりましたが、結論から言うとこのマクロは元の操作を再現できていません。 記録のために操作したときは全シートでA1セルが選択されましたが、記録したマクロを実行してもシート3しか反映されませんでした。 コードを見ると、シートを複数選択したときの一番表のシート(シート3)のActivateが記述されていますので、当然の結果と言えます。 これによりシート3にしか反映されませんが、単一シートのためRange("A1").Selectもエラーにならないという状態のようです。 バージョンによって、Activesheetの暗黙指定のあたりの問題が解消されている可能性はありますね。
sazi

2018/01/25 05:03

>jawaさん 確認ありがとうございます。 私の環境は(Windows10,excel2007)です。 Sheets("Sheet3").Activateをコメントにするとどうなるでしょうか?
jawa

2018/01/25 05:09 編集

複数シート選択状態なので、やはりエラーになりますね(^-^;
sazi

2018/01/25 05:14 編集

確認ありがとうございました。 では、jawaさんのバージョンのほうが新しいので、厳密さが進んでいるということですね。
jawa

2018/01/25 05:17

なんか個人的には2007の動きの方がしっくりくる気がしてしまいます。 わざわざActiveSheetと明示するのは、違和感がありますね(^-^;
guest

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
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

kamikazelight

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ExcelVBAer

2018/01/29 00:31

余談ながら、Chr(9) を vbTab に変えた方が分かりやすいかと。
guest

0

そもそも、プログラム内のSelectは必要ですか?

個人的には滅多にSelectすることがありません。
恐らく不要なSelectなので、無くす方向で考えるのが自然だと思います。

ただ、もしSelectしなければならない場合があり、
元の状態に戻したいときは、
SelectionをRange型変数に確保しておき
Select等の処理後に上記RangeでSelectし直したりします。
※選択状態のものが常にRangeとは限らないのでエラー回避してください。

シートの選択状態をわざわざA1にしたいという要求のある環境なのであれば、
For Each Sheet in ThisWorkBook.WorkSheets
等でシートを回し、各シートで選択状態にしていけばいいでしょう。
※シートが非表示だったりすると選択ができませんので、
環境に沿った形で実装するのが無難でしょう。

投稿2018/01/25 06:49

ExcelVBAer

総合スコア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
ryzeal

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問