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

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

エクセルマクロで列を削除したい

エクセル2013です。 マクロの途中で列を削除するようにしてあります。 A列~J列、N列~Q列、T列~U列、W列~Y列を一括削除なのですが A列~J列だけは、作業者が選択した1列だけを残して削除をしたいです。 マウスで選択させて、列を指定する所までは作成できましたが 列削除の部分(★の部分)が 思うように作成できず完成できません。 アドバイスをお願いいたします。 Sub 列削除() Dim マウス選択 Dim 選択列 Dim 選択月表示 Dim 質問 On Error GoTo myError 'INPUT-BOXでキャンセルを選択した時の回避 Set マウス選択 = Application.InputBox("回覧用に編集したい月の列を選択してください", Type:=8) If マウス選択.Columns.Count > 1 Then '選択したしたのが列で有り1列であるか確認 MsgBox "選択したのは列ではありません。又は2列以上を選択しています" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If If マウス選択.Rows.Count > 1 Then '選択したのが行又はセルの場合の処理 Else MsgBox "行又はセルを選択しています。1列を選択してください" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If Set マウス選択 = マウス選択.EntireColumn Debug.Print マウス選択.Address 選択列 = マウス選択.Column 'INPUT-BOXで選択した列を数字に置き換える 選択月表示 = Cells(2, 選択列).Value '選択した列の8行目のセルの値を格納 If 選択列 > 10 Then '選択したのが11列以上の場合の処理 MsgBox "11列目以降は選択できません" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" '不要列削除 ★ Union(Columns("A:J"),Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete Else MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If Exit Sub 'エラーが出なかった時のmyErrorの回避用 myError: 'INPUT-BOXでキャンセルを押した時の処理 MsgBox "キャンセルが押されました。プログラム終了します。" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub End Sub

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • 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

  • エクセルマクロ インプットボックスの使い方

    エクセル2013です。 マクロの途中で作業者にマウスで列を選択してもらい その取得した列番号を使って、いろいろ処理を行うマクロを作りました。 Sub 実験() Dim マウス選択 As Range Dim 選択列 Dim 選択月表示 Dim 質問 Dim 最終列 Dim 最終行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 On Error GoTo myError Set マウス選択 = Application.InputBox("編集したい月の列を選択してください", Type:=8) 選択列 = マウス選択.Column 選択月表示 = Cells(8, 選択列).Value 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" Else MsgBox "プログラムを中断します" Exit Sub End If ---処理内容---- myError: MsgBox "キャンセルが押されました。プログラム終了します。" End Sub 通常列を選択してくれればインプットボックス内には $V:$V などと表示されますが 行を選択されると $35:$35 などと表示され セルの一部を選択されると $D$40 などと表示されます。 行やセルを選択してもエラーなく最後まで進みますが選択した場所によっては とんでもない結果になってしまいます。 基本、列以外を選択したらメッセージボックスでアラームするか プログラムを停止させたいのですがどのような方法が有りますでしょうか? よろしくお願いします。

  • Excel VBAでのシートの削除について

    Excel VBAで、シート上に配置されたボタンをクリックすることで、メッセージを出さずにそのシートの削除をしたいと思っています。 サンプルとして、シート上(例えばSheet1)にボタンを1個配置し、 ------------------------------------------------------- Private Sub CommandButton1_Click() Application.DisplayAlerts = False Delete Application.DisplayAlerts = True End Sub ------------------------------------------------------- のようにすると、オートメーションエラーが起きます。 そこで、 Application.DisplayAlerts = True をコメントアウトしてやれば実行はできるのですが、その後別のシートで処理を行う場合には、再度メッセージを表示してほしいと思っています。 ためしに、Sheet1削除後にアクティブになるSheet2に次のようなコードを記述しました。Sheet1同様、シート上にボタンを1個配置しています。 ------------------------------------------------------- Private Sub CommandButton1_Click() MsgBox Application.DisplayAlerts End Sub Private Sub Worksheet_Activate() MsgBox "次に出るメッセージはアクティブ直後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts Application.DisplayAlerts = True MsgBox "次に出るメッセージは変更後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts End Sub ------------------------------------------------------- こうすれば、Sheet1削除後、アクティブになった直後はDisplayAlertsがFalse。その後設定変更してTrueになるかとおもったのですが、結果はFalseでした。しかしその後、ボタンをクリックするとTrueが返ってきました。 いろいろ調べましたが、なぜこのような結果になるのかわかりません。よろしくお願いいたします。

  • 2つのマクロの組合せがうまくいきません

    Excel2002を使用しています。 ・シートに変更があった場合、可否を問うメッセージを出す。 ・但し、「A1」及び「D、E列」の変更は除外する。 ・「D、E列」をダブルクリックしたら、アクティブセルに「済」の文字が入る。 という事をしたくて、Sheet1に以下のようなコードを書きましたが、うまくいきません。 「A1」の変更は除外されるのですが、DE列への変更はメッセージが出てしまいます。 又、そのメッセージが出た際「いいえ」を選択するとエラーになります(Application.Undo)。 Private Sub Worksheet_Change(ByVal Target As Range) Dim 変更回答 As Integer If Target.Address = "$A$1" Then Exit Sub If Target.Columns = ("4:5") Then Exit Sub 変更回答 = MsgBox("セル:" & Target.Address(False, False) & "が変更されました。" & vbCrLf & _ "   「はい」 … 変更許可" & vbCrLf & "   「いいえ」… 内容破棄", vbYesNo) Application.EnableEvents = False If 変更回答 = vbYes Then Application.EnableEvents = True Exit Sub Else Application.Undo End If Application.EnableEvents = True End Sub    ****** Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 4 Then ActiveCell = "済" Cancel = True End If If Target.Column = 5 Then ActiveCell = "済" Cancel = True End If End Sub 以上、ご教授、宜しくお願い致します。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • 列の表示非表示をするマクロ

    C列とE列が非表示ならば再表示 表示されていれば非表示になるマクロを設定したいです。 このマクロを正しくするにはどうすればいいですか? Sub 再表示また非表示() If Columns("C:C,E:E").Hidden = True Then Columns("C:C,E:E").Hidden = False Else: Columns("C:C,E:E").Hidden = False Columns("C:C,E:E").Hidden = True End If End Sub

  • VBA 選択したセルが空白であったらシートを削除

    こんばんは!いつもお世話になっています。 選択したシート1のセル(C9)が空白であったら、選択したシートを削除するマクロ(VBA)を作りましたが、上手く作動しなくて困っています。 どうしたらよいのかよろしくお願い致します。 'シート1のセルC9を選択し、空白か判断する Sub セルの選択()   Worksheets("Sheet1").Activate   Range("C9").Select  If Len(Application.Trim(ActiveCell)) = 0 Then   MsgBox("空白セル")  End If End Sub '現在アクティブなシートを削除する Sub DeleteWorksheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub

  • エクセル IF について!

    UserForm上にTextBoxとコマンドボタンがあり、TextBoxに数字を入れコマンドボタンをクリックすると'A.xlsをセットしてAシートの使用行を格納し検索して他のTextBoxにも反映させていくやり方でマクロを記述しています。そこでTextBoxに入力した数字がない場合はMsgBox”この数字はありません”という形にしたいのですが・・・どのようにすれば良いのか教えて下さい。 If Me.Controls("TextBox1" & Cnt).Value = "" Then MsgBox "呼出したい数字を入力して下さい" Exit Sub End If Set wbMyBook = Workbooks(ThisWorkbook.Name) If MsgBox("以前の記録を呼び戻しますか?", vbOKCancel) = vbOK Then Application.ScreenUpdating = False strMyBookPath = ThisWorkbook.Path If Dir(strMyBookPath & "\" & k1Name) <> "" Then 'あった場合そのブックが空いているか確認する。 flag = False For Each wb In Workbooks '開いていればTrue,開いていなければFalseを設定 If wb.Name = k1Name Then flag = True Exit For End If Next wb 'ブックが開いていなかった場合、ブックを開ける。 If flag = False Then Workbooks.Open strMyBookPath & "\" & k1Name End If Set k1 = Workbooks(k1Name) Set SH1 = k1.Worksheets("Sheet1") Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If lngYcnt_K = SH1.UsedRange.Rows.Count flag = False For lng = 1 To lngYcnt_K If CStr(TextBox1.Text) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then TextBox3.Value = SH1.Cells(lngNumber, 2) '氏名 End If If SH1.Cells(lngNumber, 3) = "男" Then OptionButton1.Value = True ElseIf SH1.Cells(lngNumber, 3) = "女" Then OptionButton2.Value = True Else OptionButton1.Value = True OptionButton2.Value = False End If MsgBox " 記録を呼び戻しました" Else MsgBox"確認必要"⇒ここにもし数字が違っていたら表示させたいのですが・・・ End If MsgBox " 以前に記録しましたか?" Application.DisplayAlerts = False k1.Close saveChanges:=True Application.DisplayAlerts = True '-------------------------------------------------------------------------- '画面更新ON Application.ScreenUpdating = False End Sub

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

  • エクセルの列削除がうまくいかない。

    CSV変換データの不要な列を削除しようとしているのですが、思うような動作しません。 CSV変換マクロを起動と同時にA,B,E,F,O,P,Q,R列を削除しようとしているのですが、うまくいかない。 教えていただけないでしょうか。 添付データは元のファイルです。 Option Explicit Sub EasyCopyCSV() Dim CSV_filename As Variant, target As Variant Dim CSV_SheetName As Variant Dim FileCount As Long Dim kk As Long CSV_filename = Application.GetOpenFilename(filefilter:="CSVファイル(*.csv;*.prn),*.csv;*.prn", MultiSelect:=True) If IsArray(CSV_filename) Then Else MsgBox "キャンセルされました" Exit Sub End If FileCount = UBound(CSV_filename) '配列のサイズからファイル数を調べる For kk = 1 To FileCount 'ファイル数カウンタ初期化しファイル数分カウンタを回す Workbooks.Open CSV_filename(kk) 'ファイルを開く CSV_SheetName = Worksheets(1).Name '開いたシートの名前=ファイル名を取得 Sheets(CSV_SheetName).Move Before:=ThisWorkbook.Sheets(1) Next '不要列を削除 With ActiveSheet .Range(.Columns(1), .Columns(2)).Delete Shift:=xlShiftToLeft .Range(.Columns(5), .Columns(6)).Delete Shift:=xlShiftToLeft .Range(.Columns(15), .Columns(18)).Delete Shift:=xlShiftToLeft End With End Sub

  • EXCEL マクロにて

    EXCELにて質問があります 別シートのピンクという文字列をB列から探すマクロを作成しました Private Sub CommandButton1_Click() Set aaa = Sheets("sheet1写真").Columns(2).Find("ピンク").Address(False, False) MsgBox aaa Application.Goto Sheets("Sheet1写真").Range(aaa) End Sub このマクロを実行しても型が一致しませんと言うエラーが出てしまいます 何がいけないのかさっぱりわかりませんどうかご教授お願いします

専門家に質問してみよう