[[20241119154009]] 『シートの複数選択』(一番弟子) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シートの複数選択』(一番弟子)

皆さまお世話になります。

excelvbaで質問です。

シート数が毎回違います2Sheetから36Sheetぐらいです。

そこでSheet2から最後まで複数シートを選択したいのです。

VBAの作り方をご教授ください。

よろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 >シートの複数選択(Select)
https://excel-ubara.com/excelvba5/EXCELVBA204.html

「VBA シート 複数選択」

で、検索しました。

(まっつわん) 2024/11/19(火) 16:06:15


For i = 2 To Worksheets.Count
    Sheets(i).Select (False)
Next
(ヘイヘイポーラ) 2024/11/19(火) 16:13:57

 こうなのか
 Sub sample1()
    Worksheets("Sheet2").Select
    For i = Worksheets("Sheet2").Index + 1 To Worksheets.Count
       Worksheets(i).Select False
    Next
 End Sub

 それともこうなのか
 Sub sample2()
    For i = 2 To Worksheets.Count
       Worksheets(i).Select i = 2
    Next
 End Sub

 質問文からは読み取れないので、良い方で
(´・ω・`) 2024/11/19(火) 16:21:22

早々のご回答ありがとうございます。

すべて試しましたが、一番左のシートも選択してしまいます、
左から2番目のシートから最後のシートを選択して左から2番目のシートを開けたいのですが。

よろしくお願いいたします。
(一番弟子) 2024/11/19(火) 17:12:12


 横から失礼します。

 全て試してみましたが、

 >一番左のシートも選択してしまいます、

 ということはありませんでした。
(OK) 2024/11/19(火) 17:28:46


>2番目のシートから最後のシートを選択して左から2番目のシートを開けたいのですが。
なぜそのようなことするんですかね。
2番目のシートを開けたいなら直接開けばいいのでは。
(???) 2024/11/19(火) 20:03:34

 シートの選択部分は、(´・ω・`)さんの 2024/11/19(火) 16:21:22 発言でOKでは?
 > 2番目のシートを開けたい
 は、シート選択はそのままで、表示されるシートが2番目のシートということでしょう。
     Worksheets(2).Activate
 を加えればいいでしょう。
(xyz) 2024/11/19(火) 20:13:14

2番目のシートから最後のシートまで各セルに同じ値を入れたいのです

詳しく申し上げますと
1番左のシートのB4〜I4の値を2番目のシートから最後のシートまでのB6〜I6にコピペしたいのです
1番左のシートが原票みたいな感じで読み込んだデータをシート展開するので毎回シート数が異なります。

よろしくお願いします。
(一番弟子) 2024/11/19(火) 22:31:09


 目的を最初に明示したほうがいいですね。
 22:31:09のものが目的なら、いままで質問してきた、複数のシートを同時に選択する必要なぞありません。
 できないことはないですが、普通にFor .. Next で繰り返しを行うのがよいでしょう。
 頑張ってください。 
(xyz) 2024/11/19(火) 22:44:52

おそらく、同じ値を入れるので複数のシートを作業グループにして一括して入力するイメージなのだとおもいます。

手作業ならばその発想でOKですが、マクロだと逆に難しくなるので、既に提案があるように、ループ処理で1シートずつ処理することをオススメします。

(もこな2 ) 2024/11/20(水) 00:08:52


 >一番左のシートも選択してしまいます、

そのように書いたのではないですか?
実際に実行したコードを提示してくだされば、
回答側で添削ができるのですが。。。

基本的にマクロを作るときは、「選択」が主目的でない場合は、
あえて選択しません。選択しなくても文章で指定すれば事足ります。
手動の場合は、「選択」することで色々なことを指定するようになるので、
選択が必要になりますが。

Selectしない>>
http://officetanaka.net/excel/vba/speed/s2.htm

参考コード
Sub test002()

    Dim ws As Worksheet

    For Each ws In Worksheets
        '左から1番目をコピー
        If ws.Index = 1 Then
            ws.Range("B4:I4").Copy
        'それ以外に貼り付け
        Else
            ws.Paste ws.Range("B6:I6")
        End If
    Next
    Application.CutCopyMode = False
End Sub

変数の使い方や、繰り返しの構文、条件分岐の構文
基礎ですので、しっかり勉強してみてください。
(まっつわん) 2024/11/20(水) 08:49:23


 私がテストした限りでは、
 (´・ω・`)さんの「sample2」しか正常にワークしなかったけどなぁ・・

 Sub sample2()
     Dim i As Long

     For i = 2 To Worksheets.Count
         Worksheets(i).Select i = 2
     Next

     tenki
 End Sub

 Sub tenki()
     Worksheets(1).Range("B4:I4").Copy Worksheets(2).Range("B6")
     Windows(1).SelectedSheets.FillAcrossSheets Worksheets(2).Range("B6:I6")
 End Sub

(半平太) 2024/11/20(水) 09:33:02


 解説しますね

 Worksheet.Select メソッド
https://learn.microsoft.com/ja-jp/office/vba/api/excel.worksheet.select

 Select True  とすると(省略した場合はTrueと同じ) そのシートだけが選択されます。シートタブをクリック
 Select False とすると、選択されているシートに追加で選択です。シートタブを Shift+クリック と同じ

 For i = 2 To Worksheets.Count
   Sheets(i).Select False
 Next
 というコードでは
 ・1番目のシートが選択されている状態で実行すると、1番目のシートに2番目のシートが追加で選択されて・・・
  全部のシートが選択されてしまいます。
 ・1番目以外のシートが選択されている状態で実行すると、最初に選択されていたシートがActiveままになり
  2番目のシートがActiveになりません
 と、結果が実行前に選択されていたシートに依存することになります。

 これを防止するには 2番目のシートを選択するときは、引数にTrueを指定(もしくは省略)し、
 2番目以降のシートを選択するときは、引数にFalseを指定する必要があります。
(´・ω・`) 2024/11/19(火) 16:21:22 はそうなっています。

 で、話の流れはシート選択しない方ループで対処する方がいいのではないかとなっていると思いますが
 私もその方がいいと思います。
(´・ω・`) 2024/11/20(水) 09:35:54

 おなか一杯かと思いますが、折角書いたので、その供養のために投稿しておきます。

 test1を推奨します。
 test3のようにすれば可能は可能です。
 (もっと気の利いたものが投稿されました。↓は素朴な手法です。)
 test2は参考です。

 速度は、
 (早い)  test1 < test3 < test2  (遅い)
 の順です。
 参考にしてください。

 Sub test1()
     Dim k As Long
     For k = 2 To Worksheets.Count
         Worksheets(1).[B4:I4].Copy Worksheets(k).[B6]
     Next
 End Sub

 Sub test2()
     Dim k As Long

     Worksheets(1).[B4:I4].Copy
     For k = 2 To Worksheets.Count
         Worksheets(k).[B6].PasteSpecial Paste:=xlPasteAll
     Next
     Application.CutCopyMode = False
     '各シートのセル選択は修正せず
 End Sub

 Sub test3()
     Dim k As Long

     Worksheets("Sheet2").Select
     For k = Worksheets("Sheet2").Index + 1 To Worksheets.Count
         Worksheets(k).Select False
     Next

     Worksheets(1).[B4:I4].Copy
     Worksheets(2).[B6].PasteSpecial Paste:=xlPasteAll
     Worksheets(2).[A1].Select   '貼り付け先が選択されているのを解除
     Application.CutCopyMode = False

     Application.Goto Worksheets(1).[A1] '各シートの選択も解除されます
 End Sub

 sample1は sheet2の位置に依存しているということなんでしょうか。(解説がございました)
(xyz) 2024/11/20(水) 09:40:11

ああ、なるほど。

手作業で作業していた事なので、そのまま記録マクロ感覚で考えていました。

参考になりました。

今から頑張って、作成します。

皆さまご丁寧な対応ありがとうございます。
(一番弟子) 2024/11/20(水) 09:49:14


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.