• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルマクロで列を削除したい)

エクセルマクロで列を削除する方法

このQ&Aのポイント
  • エクセル2013でマクロを使用して特定の列を削除する方法を教えてください。
  • A列~J列、N列~Q列、T列~U列、W列~Y列を一括削除し、A列~J列だけを選択された1列を残す方法を教えてください。
  • マウスで選択した列を指定して列を削除するマクロを作成したいのですが、うまく動作しません。アドバイスをお願いします。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 > Union(Columns("A:J"),Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete 指定可能な範囲を参照するのにUnionメソッドを使うのは本来の使い方と違いますし、 ちょっと無駄に難しく書いている感じで、同じことをするのにRangeを使えば、   Range("A:J,N:Q,T:U,W:Y").Delete でいいです。 Range < < < Columns < < < < < < < < ... < < < < < < < < Union といった感じの比較でアクセスに要する時間が 桁違いに長いのがUnionメソッドだったりもしますから、 本当に必要な場合限定で使うことをお奨めします。 今回の問題は、Rangeの引数に渡す参照文字列について、   A列を選択してあれば、"B:J,N:Q,T:U,W:Y"   B列を選択してあれば、"A:A,C:J,N:Q,T:U,W:Y"   ...   F列を選択してあれば、"A:E,G:J,N:Q,T:U,W:Y"   ...   I列を選択してあれば、"A:H,J:J,N:Q,T:U,W:Y"   J列を選択してあれば、"A:I,N:Q,T:U,W:Y" といった具合に合成する方法、ということになります。 因みに、そういう期待をしているかも知れないので、ハッキリ書きますが、 セル参照の仕方やRangeオブジェクトの扱いに関して、 「引き算」をするような演算子、関数、メソッド、プロパティは、 ExcelにもVBAにも一切用意されていません。 やるとすれば、自作の関数として別に書いておくことになります。 私は自作の関数を今でも使っていますし、何度か公開したこともありますが、 今回のテーマの場合は、ストレートに参照文字列を合成するのが、 合理的で十分な方法だと考えます。 一連の記述の中に書くとゴチャゴチャしそうなので、 「指定した列番号、の列、を除いた参照文字列を返す」関数を書いてみました。 ★の行で、   Range(RefCol(マウス選択.Column)).Delete のように使ってもいいですし、できれば一旦文字列変数で受けてから使う方がベターです。 また、関数の中身は列番号でのSelect Caseですが、 ひとつひとつ文字列を10通り書いておく方が好みに合うようでしたら、 それが好いかも知れません。 Chr関数を簡略的にに用いていますから、[A-Z]列だけに対応した書き方で、 今回の場合はこれでも十分ですが、 [A-XFD]列にまで対応するように書き加えるとなると、 その場合は、ベタに全通りの文字列を書いた方が却ってスッキリすると思います。 以下、関数と、 関数を試す為だけにラフに書いたテスト用Sub(新規シートで試してください)です。 Function RefCol(ByVal ColIdx As Long) As String Dim s As String   Select Case ColIdx   Case 1: s = "B:J"   Case 2 To 9: s = "A:" & Chr(63 + ColIdx) & "," & Chr(65 + ColIdx) & ":J"   Case 10: s = "A:I"   End Select   s = s & ",N:Q,T:U,W:Y"   RefCol = s End Function Sub TestSample8733398() Dim マウス選択 As Range   Cells.Clear   Range("A:J,N:Q,T:U,W:Y").Interior.Color = vbYellow   With Range("A1:Z1")     .FormulaLocal = "=Column()"     .Value = .Value   End With   Columns(Int(Rnd * 10) + 1).Select   Set マウス選択 = Selection   MsgBox マウス選択.Column      Range(RefCol(マウス選択.Column)).Delete End Sub

gx9wx
質問者

お礼

A列を選択した場合は B~Jが削除 J列を選択した場合は A~I列を削除 それ以外を選択した場合は 選択列前と選択列後を削除という事で ケースが3回という事ですよね。 サンプルコード、 思ったとうり動作いたしました。 ただまだ私には敷居が高いです。 アドバイスして頂いた中に知らない事が たくさん出てきたので、また調べながら 考えてみます。 どうもありがとうございました。

gx9wx
質問者

補足

以下のようにすると ★1が「引数は省略できません」となります。 ★1をコメントアウトしていったん動くようにして ★1を使わないようにマウス選択をすると ★2と★3の条件時に列削除がされません。 Union(Columns("A:J"),Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete ↓ Union(Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete If 選択列 = 1 Then '★1 Union(Columns("B:J ")).Delete End If '★2 If 選択列 = 2 Then Union(Columns("A"), Columns("C:J ")).Delete End If If 選択列 = 3 Then Union(Columns("A:B"), Columns("D:J ")).Delete End If If 選択列 = 4 Then Union(Columns("A:C"), Columns("E:J ")).Delete End If If 選択列 = 5 Then Union(Columns("A:D"), Columns("F:J ")).Delete End If If 選択列 = 6 Then Union(Columns("A:E"), Columns("G:J ")).Delete End If If 選択列 = 7 Then Union(Columns("A:F"), Columns("H:J ")).Delete End If If 選択列 = 8 Then Union(Columns("A:G"), Columns("I:J ")).Delete End If '★3 If 選択列 = 9 Then Union(Columns("A:H"), Columns("J")).Delete End If '★1 If 選択列 = 10 Then Union(Columns("A:I")).Delete End If どうもUnionがからんでよくわからず 昨夜考えて 下記のようにしたら、思ったように動作しました。 Union(Columns("A:J"),Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete ↓ Union(Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete If 選択列 = 1 Then Range("B:J").Delete End If If 選択列 = 2 Then Range("A:A,C:J").Delete End If If 選択列 = 3 Then Range("A:B,D:J").Delete End If If 選択列 = 4 Then Range("A:C,E:J").Delete End If If 選択列 = 5 Then Range("A:D,F:J").Delete End If If 選択列 = 6 Then Range("A:E,G:J").Delete End If If 選択列 = 7 Then Range("A:F,H:J").Delete End If If 選択列 = 8 Then Range("A:G,I:J").Delete End If If 選択列 = 9 Then Range("A:H,J:J").Delete End If If 選択列 = 10 Then Range("A:I").Delete End If

関連するQ&A

専門家に質問してみよう