- ベストアンサー
エクセルマクロで列を削除する方法
- エクセル2013でマクロを使用して特定の列を削除する方法を教えてください。
- A列~J列、N列~Q列、T列~U列、W列~Y列を一括削除し、A列~J列だけを選択された1列を残す方法を教えてください。
- マウスで選択した列を指定して列を削除するマクロを作成したいのですが、うまく動作しません。アドバイスをお願いします。
- みんなの回答 (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
お礼
A列を選択した場合は B~Jが削除 J列を選択した場合は A~I列を削除 それ以外を選択した場合は 選択列前と選択列後を削除という事で ケースが3回という事ですよね。 サンプルコード、 思ったとうり動作いたしました。 ただまだ私には敷居が高いです。 アドバイスして頂いた中に知らない事が たくさん出てきたので、また調べながら 考えてみます。 どうもありがとうございました。
補足
以下のようにすると ★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