-PR-
解決済み

Withステートメントの列指定について

  • 困ってます
  • 質問No.9374240
  • 閲覧数103
  • ありがとう数6
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 78% (33/42)

こんばんは、VBAのWithステートメントについて質問させてください!
複数のシートの複数列に処理をするために、以下のようにVBAを記述したのですが
エラーコード438「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」というものが表示され、うまくいきませんでした。
記述の方法が悪かったのかと.Columnsの部分を「.Range("A:A,C:C")」に変えたりしたのですが、同様の結果でした。インターネットで見ていると、Withステートメントで複数のシート/複数の列を選択しているものを見たことがないような気がするのですが、そもそもWithステートメントは複数シート/列を選択することはできないのでしょうか…?!うまくいく方法があればご教授お願いしたいです…!よろしくお願いいたします(T_T)

With Worksheets(Array("りんご", "みかん"))
.Columns("A,C").Delete Shift:=xlToLeft
End With
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル11

ベストアンサー率 47% (146/308)

Excel(エクセル) カテゴリマスター
課題は「複数シートの複数列を削除する」ということのようで。
説明がやや難しいので伝わりますかどうか。

とりあえず、模範とは言いづらいですが「動く例」を。
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からできなくなったのであれば、私の勉強不足。
お詫び申し上げます。
お礼コメント
osashi

お礼率 78% (33/42)

お忙しいところ、ご回答いだたいてありがとうございます!<m(__)Selectを使用すればできるのですね…(T_T)知りたかったこと、凄く的確にご回答いただき、本当にありがたいです!これでまた少し成長した気がします(^o^)/
投稿日時 - 2017-09-18 21:13:30

その他の回答 (全2件)

  • 回答No.3
レベル14

ベストアンサー率 28% (4399/15602)

他カテゴリのカテゴリマスター
深い根拠(偉い人が書いているとか、根拠にする仕組み)など判りませんが
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
質問の趣旨を誤解していますでしょうか。
お礼コメント
osashi

お礼率 78% (33/42)

いえ!エラーになる場合とそうでない場合を解説いただき、大変参考になりました!(^O^)一つ賢くなった気がします!ご回答いただき、ありがとうございました…!<m(_ _)m>
投稿日時 - 2017-09-18 21:24:20


  • 回答No.1
レベル11

ベストアンサー率 43% (91/211)

複数シートの選択はできますが、同時削除はできません。手作業でやってもエラーになります。だから、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
お礼コメント
osashi

お礼率 78% (33/42)

For Eachの方法でもできるのですね!('▽')今まで実はFor Eachあまり使ったことなかったので、これを機に使い方をよく勉強したいと思います、ご回答いただいてありがとうございました!
投稿日時 - 2017-09-18 21:16:17
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


抽選で合計100名様にプレゼント!

ピックアップ

ページ先頭へ