- ベストアンサー
Withステートメントで複数のシート/列を選択する方法はあるか?
- VBAのWithステートメントを使用して複数のシート/列を選択する方法について質問です。
- Withステートメントで複数のシートを選択することはできますが、複数の列を選択することはできません。
- 記述の方法を変えても同様のエラーが発生する場合、複数の列を処理するために別の方法を検討する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
課題は「複数シートの複数列を削除する」ということのようで。 説明がやや難しいので伝わりますかどうか。 とりあえず、模範とは言いづらいですが「動く例」を。 Sub Sample() Sheets(Array("りんご", "みかん")).Select ' まず、作業グループを作って、選択。 Range("A:A,C:C").Delete Shift:=xlToLeft ' その後、範囲を削除。 End Sub 複数の列を同時に削除するときにColumns()は使わないのもポイントの一つです。 では、これを「ワークシート上で手作業で実現するにはどうしましょうか。 マクロの記録でもしながらゆっくり操作してみてくださいませ。 おそらく、 ・「りんご」シートを選択 ・Ctrlキーを押しながら「みかん」シートを選択(※) ・A列を選択 ・Ctrlキーを押しながらC列を選択 ・列削除 ですね。まぁ、他の手段でも良いんですけど。 ここで重要なのは(※)のステップ。 つまり「りんご」「みかん」の二つのシートを選択している状態に しておかないと先に進めない、のです。 なので、二つのシートを選択した状態に持って行ってやる必要があります。 そのあとで、列削除の操作をします。 よって、上記の「動く例」につながるわけです。 と言っても、記録されたマクロから贅肉を落としただけのものですけどね。 Range()の前に「.」が無い理由は、 先にシートを選択している=対象シート(作業グループ)がアクティブ な状態にあるからです。 対象シート以外のワークシートがアクティブである可能性はこの段階では0%です。 わざわざシート(グループ)を指定しなくても正しく動いてくれますね。 ただ、大前提としてエクセルには「複数のシートにまたがる列」は存在しません。 Worksheets(Array("りんご", "みかん")).Range("A:A") という書き方自体を受け付けないのです。 「りんご」シートと「みかん」シートのA列は、それぞれまったく別物ですから。 踏まえ、Range()の前に「.」は不要なのです。 で、コレを強引にWithを使って書きたいなら With Worksheets(Array("りんご", "みかん")) .Select Range("A:A", "C:C").Delete Shift:=xlToLeft End With こんな感じです。 が・・・まぁ、ここだけ見るとWithはここでは全く要らない子ですね(汗)。 ちょっと、場をお借りして・・・ 回答1番さま 「複数シートの連続しない複数列を一回の動作で同時に削除する」は できないなんてことは無いですよ。 上記手順で手作業でもできますし、 上記で提示した2種のコードでも正常動作を確認しています。 (2007/2010/2013で検証) 逆に > 同時削除はできません。手作業でやってもエラーになります。 「手作業でエラーを出せた」手順を後学のためにご教示ください。 2016は手元になく、検証ができていません。 2016からできなくなったのであれば、私の勉強不足。 お詫び申し上げます。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
深い根拠(偉い人が書いているとか、根拠にする仕組み)など判りませんが With 〇 の〇の部分は「オブジェクト」で、オブジェクトに限ると思いますし、「単一」オブジェクトに限ると思います。 下記の前半はエラー、後半はOKでした。 Sub test01() With Sheets .Tab.ColorIndex = 6 End With End Sub ーー Sub test02() With Sheets("Sheet2") .Tab.ColorIndex = 3 End With End Sub ーー 勿論、他のコードを工夫すれば、思うようなことはできると思います。 例 Sub test03() For Each sh In Worksheets(Array("Sheet1", "Sheet2", "Sheet3")) sh.Tab.ColorIndex = 6 Next End Sub 質問の趣旨を誤解していますでしょうか。
お礼
いえ!エラーになる場合とそうでない場合を解説いただき、大変参考になりました!(^O^)一つ賢くなった気がします!ご回答いただき、ありがとうございました…!<m(_ _)m>
- SI299792
- ベストアンサー率47% (780/1630)
複数シートの選択はできますが、同時削除はできません。手作業でやってもエラーになります。だから、Withではなく.Columnsの所でエラーになります。 Columns の飛び飛びの列も指定できないよです。やってみたらエラーになったし、調べても、そのような記述は見つかりませんでした。 以下の2つの方法がいいと思います。 ' Sub Macro1() ' Dim Sheet As Variant ' For Each Sheet In Array("りんご", "みかん") Worksheets(Sheet).Range("A:A,C:C").Delete Shift:=xlToLeft Next Sheet End Sub ' Sub Macro2() ' Worksheets("りんご").Range("A:A,C:C").Delete Shift:=xlToLeft Worksheets("みかん").Range("A:A,C:C").Delete Shift:=xlToLeft End Sub
お礼
For Eachの方法でもできるのですね!('▽')今まで実はFor Eachあまり使ったことなかったので、これを機に使い方をよく勉強したいと思います、ご回答いただいてありがとうございました!
お礼
お忙しいところ、ご回答いだたいてありがとうございます!<m(__)Selectを使用すればできるのですね…(T_T)知りたかったこと、凄く的確にご回答いただき、本当にありがたいです!これでまた少し成長した気がします(^o^)/