Withステートメントで複数のシート/列を選択する方法はあるか?

このQ&Aのポイント
  • VBAのWithステートメントを使用して複数のシート/列を選択する方法について質問です。
  • Withステートメントで複数のシートを選択することはできますが、複数の列を選択することはできません。
  • 記述の方法を変えても同様のエラーが発生する場合、複数の列を処理するために別の方法を検討する必要があります。
回答を見る
  • ベストアンサー

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

こんばんは、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

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

  • ベストアンサー
回答No.2

課題は「複数シートの複数列を削除する」ということのようで。 説明がやや難しいので伝わりますかどうか。 とりあえず、模範とは言いづらいですが「動く例」を。 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
質問者

お礼

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

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

深い根拠(偉い人が書いているとか、根拠にする仕組み)など判りませんが 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
質問者

お礼

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

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.1

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

お礼

For Eachの方法でもできるのですね!('▽')今まで実はFor Eachあまり使ったことなかったので、これを機に使い方をよく勉強したいと思います、ご回答いただいてありがとうございました!

関連するQ&A

  • 複数のシートにまたがる列の削除について

    こんばんは、複数のシートを選択して特定の列を削除するVBAについて質問させてください。Sheet1とSheet2のA~C列を削除したく、以下のVBAを入力しましたが、削除されるのはSheet1のA~C列のみでSheet2に同様の処理が行われません。 手作業でやると複数のシートを選択のうえ列の削除ができるので、VBAでできないということはないと思うのですが、どのように記述すればよいのでしょうか・・・?!どなたかご教授よろしくお願いいたします! Sheets(Array("Sheet1","Sheet2")).Select Range("A:C").Delete Shift:=xlToLeft

  • VBAによる列削除について教えて下さい

    VBA初心者です。いろいろと調べて見ましたが、「C列からアクティブセルの前列までを削除」する方法が分かりません。下の記述は「C列からX列」としていますが、X→「アクティブセルの前列」と読み替えるにはどうすればよろしいでしょうか。よろしくご指導下さい。 Sub 列削除() Columns("C:X").Select Selection.Delete Shift:=xlToLeft End Sub

  • ExcelVBA 選択された列のセルを指定する

    簡単かなと思ったら意外と出来ず、調べても出てこなくて思わぬ苦戦を強いられてしまい、 質問させて頂きます。 列をまるごと選択している状態で、その選択している列のセルを指定するには どうしたらいいでしょうか? とりあえず目的としてはシート1のA列を選択した状態で、 列の先頭(A1)の値をシート2に移す事としております。 以下、エラーになってしまったコードです 列選択でOffsetを使用した為のエラー? Worksheets("sheet2").Cells(1,1).Value = Worksheets("sheet1").Columns(1).Offset(0, 0).Value 選択してない状態でSelectionを使用した為のエラー? Worksheets("sheet2").Cells(1,1).Value = Worksheets("sheet1").Columns(1).Selection(1).Value 上手く動いたコード Application.Goto Worksheets("sheet1").Columns(1) Worksheets("sheet2").Cells(1,1).Value = Selection(1).Value Application.Goto でシート1のA列を指定してからSelectionで一つ目のセルを指定すれば出来ました しかし、大量のデータを扱う時にいちいち範囲選択していたら処理が遅くなると思われますし、 コード自体もスッキリしないのでいまいち納得がいきません。 1行で「Worksheets("sheet1").Columns(1).●●●」と続くメソッドの様な、スッキリできる方法は 無いのでしょうか? どなたかご教授お願いいたします。 当方Excel2003を使用しております。 宜しくお願い致します。

  • エクセルVBA 別シート間の列のコピー&ペースト

    列のコピー&ペーストができません。 i, j は変数で、Integerで定義しており、省略はしていますが、期待通りの値がi, j には代入されています。 Sheet1のi列からj列をコピーし、Sheet2のC列(これは固定)に貼り付けたいのですが、うまくいきません。 私の書いたコードは下記の通り。 下記は改行されていますが、実際のVBAでは1行で書かれています。 Worksheets("Sheet1").Range(Columns(i), Columns(j)).Copy Worksheets("Sheet2").Range(Columns("C")) 貼り付け先(Destination)の記述がいけないのでしょうか? 行き詰っておりますので、どなたかお助けください!

  • Excel VBA With ~ End With

    Excel VBA With ~ End Withを使わずに記述するには Sheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力して、 Sub test1()  With ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart   .ChartType = xlBarStacked100   .SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows  End With End Sub を実行すると横棒グラフが1個表示されますが、 これを、With ~ End Withを使わずに記述すると Sub test2()  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.ChartType = xlBarStacked100  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows End Sub というようになると思いますが、 実行すると縦棒が2個表示されてしまって同じ結果になりません。 なぜなのでしょうか。 test1を、With ~ End Withを使わずに記述するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。(Windows10,Excel2016)

  • エクセルのブックを開く度にシートの列幅を指定したいのですが・・・

    稚拙な質問お許しください。 エクセルでブックを開いたときに、すでにシートの列幅が任意の幅になっているよう、VBAで「ThisWorkbook」というところに、 Private Sub Workbook_Open() Sheet1.Columns("a:a").Select Selection.ColumnWidth = 7 Sheet1.Columns("b:b").Select Selection.ColumnWidth = 8 Sheet1.Columns("c:c").Select Selection.ColumnWidth = 10 Sheet1.Columns("e:e").Select end sub といった感じで記述したのですが、「F8」キーで処理の過程をみながら追っていくとどうしても、Eの列を過ぎるとEの列だけでなくそれ以降の列も選択してしまい(シート上に表があるのですが、その表の1番最後の列までです。)、任意の幅に指定できないのですが、原因がよくわかりません。どなたか、お力添えください。

  • excelのマクロが上手く動作しません

    excel2013で、シートのレイアウトを整えるマクロを以下のように作成しました。 しかし、いざ他のシートで試すと、そのシートと同時に特定のシートにもなぜかマクロが実行されてしまいます。(恐らく作ったときに使っていたシート) どうしたら今見ているシートだけにマクロを実行することができるでしょうか? ActiveWindow.Zoom = 85 ActiveWindow.Zoom = 70 Columns("A:A").ColumnWidth = 10.13 Columns("A:A").ColumnWidth = 10.63 Columns("B:B").ColumnWidth = 6.63 Columns("D:D").ColumnWidth = 20 Columns("D:D").ColumnWidth = 23.75 Columns("D:D").ColumnWidth = 24.63 Columns("E:E").ColumnWidth = 10.38 Range("E1").Select ActiveCell.FormulaR1C1 = "インボイス金額" ActiveCell.Characters(7, 2).PhoneticCharacters = "キンガク" Columns("F:F").Select Selection.Delete Shift:=xlToLeft Columns("G:G").Select Selection.Delete Shift:=xlToLeft Range("H9").Select Columns("G:G").ColumnWidth = 11.38 Columns("I:K").Select Selection.Delete Shift:=xlToLeft Range("J9").Select Columns("I:I").ColumnWidth = 15 Columns("J:J").ColumnWidth = 9.75 Columns("K:K").ColumnWidth = 9.5 Range("L2").Select Columns("L:L").ColumnWidth = 5.5 Columns("O:O").Select Selection.Delete Shift:=xlToLeft Selection.ColumnWidth = 13.88 Columns("P:P").Select Selection.Delete Shift:=xlToLeft Selection.ColumnWidth = 12.13 Selection.ColumnWidth = 13.25 ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 4 ActiveWindow.ScrollColumn = 5 ActiveWindow.ScrollColumn = 6 ActiveWindow.ScrollColumn = 7 ActiveWindow.ScrollColumn = 8 ActiveWindow.ScrollColumn = 9 ActiveWindow.ScrollColumn = 10 ActiveWindow.ScrollColumn = 11 ActiveWindow.ScrollColumn = 12 Columns("Q:Q").Select Selection.ColumnWidth = 5.5 Columns("S:S").Select Selection.ColumnWidth = 6.75 Columns("T:T").ColumnWidth = 9.75 Columns("Q:T").Select Range("T1").Activate Selection.Style = "Comma [0]" Columns("U:U").Select Columns("V:V").ColumnWidth = 5.5 Columns("V:V").ColumnWidth = 6 Columns("W:Z").Select Selection.Delete Shift:=xlToLeft Columns("X:Z").Select Selection.Delete Shift:=xlToLeft Range("X10").Select Columns("X:X").ColumnWidth = 12.25 Columns("X:X").ColumnWidth = 11.13 Columns("Y:Y").ColumnWidth = 6.75 Columns("Z:Z").ColumnWidth = 11.63 Columns("AA:AA").ColumnWidth = 6.75 Columns("AB:AB").Select Selection.Delete Shift:=xlToLeft Range("AB2").Select Columns("AB:AB").ColumnWidth = 11 Columns("AD:AO").Select Selection.Delete Shift:=xlToLeft Range("AF14").Select Columns("AD:AD").ColumnWidth = 11 Columns("AE:AE").Select Selection.Delete Shift:=xlToLeft Range("AG7").Select Columns("AE:AE").ColumnWidth = 20.38 Columns("AF:AJ").Select Selection.Delete Shift:=xlToLeft ActiveWindow.ScrollColumn = 21 ActiveWindow.ScrollColumn = 1 Rows("2:2").Select ActiveWindow.FreezePanes = True Range("A2").Select ActiveWorkbook.Worksheets("11").Sort.SortFields.Clear ActiveWorkbook.Worksheets("11").Sort.SortFields.Add Key:=Range("D2:D137"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets("11").Sort.SortFields.Add Key:=Range("A2:A137"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("11").Sort .SetRange Range("A1:AE137") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .Apply End With End Sub よろしくお願い致します。

  • エクセルVBAでエラーがでます。

    エクセルで以下のようなVBAをつくりましたが Columns("B:C").Select でエラーがでます。 初歩的なことですが教えてください。 Sub Macro3() ' ' Macro3 Macro Worksheets(1).Copy before:=Worksheets(1) Worksheets(1).Activate Columns("B:C").Select Selection.Delete Shift:=xlToLeft Columns("C:L").Select Selection.Delete Shift:=xlToLeft Columns("H:H").Select Columns("L:AA").Select Selection.Delete Shift:=xlToLeft End Sub

  • 下記エクセル列の並び替えマクロで、Callの際に変数が引き継がれません

    下記エクセル列の並び替えマクロで、Callの際に変数が引き継がれません。 何か方法はありませんでしょうか。 Sub 各学校() Dim i As Integer Worksheets("Sheet1").Activate For 元列 = 1 To 16 If Cells(1, i) = "学校" Then 新1列 = 元列 ElseIf Cells(1, i) = "住所" Then 新2列 = 元列 ElseIf Cells(1, i) = "電話" Then 新3列 = 元列 (略) End If Next Call 列の並び替え End Sub Sub 列の並び替え() Worksheets("Sheet2").Activate Cells.Clear Worksheets("Sheet1").Columns(新1列).Cut Worksheets("Sheet2").Columns("A").Insert Worksheets("Sheet1").Columns(新2列).Cut Worksheets("Sheet2").Columns("B").Insert Worksheets("Sheet1").Columns(新3列).Cut Worksheets("Sheet2").Columns("C").Insert (略) End Sub

  • 列全体をコピーして別の列に貼り付けたい

    列全体をコピーして別の列に貼り付けたいのですが、 「そのコマンドは複数の選択範囲に対して実行できません。」 とエラーになってしまいます。 コードは以下のとおりです。 Worksheets("aaa").Columns(1).Select Selection.Copy Worksheets("aaa").Columns(3).Select ActiveSheet.Paste よろしくお願いします。

専門家に質問してみよう