• ベストアンサー

Excel VBA 2つの条件を満たした行を削除

Excel2003を使用しています。 CSVファイルを元にデータを作りたく、まずは不要なデータを削除しています。 J列=0の行とJ列=0の行のA列の値と同じ値がA列に入力されている行を削除したく、J列=0のA列の値を一旦別シートに抽出し、その抽出したデータとA列のデータをループして、一致したら削除というコードを書きました。 もし可能であれば、一旦別シートに抽出せずに処理したいのですが、その場合、どのようにコードを書けばいいでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>A列の値を一旦別シートに抽出し A列の値を配列に格納しました。 Sub Test()   Dim v()   Dim LastRow As Long, i As Long, j As Long   LastRow = Cells(Rows.Count, "J").End(xlUp).Row   For i = 1 To LastRow     If Cells(i, "J").Value = 0 Then       j = j + 1       ReDim Preserve v(1 To j)       v(j) = Cells(i, "A").Value     End If   Next   For i = LastRow To 1 Step -1     If Not IsError(Application.Match(Cells(i, "A").Value, v, 0)) Then       Rows(i).Delete     End If   Next End Sub

KOH3193
質問者

お礼

お礼が遅くなり、申し訳ありません。 回答ありがとうございます。 >A列の値を配列に格納しました。 まさに、私が教えていただきたかった方法です。 勉強になります!ありがとうございました。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

削除しなきゃならないA列の種類(数じゃない)がほどほど少なければ: sub macro1()  dim h as range ’application.screenupdating = false  do until application.countif(range("J:J"), 0) = 0   set h = range("J:J").find(what:=0, lookin:=xlvalues, lookat:=xlwhole)   range("A:A").autofilter field:=1, criteria1:=cells(h.row, "A").value   activesheet.autofilter.range.offset(1).entirerow.delete shift:=xlshiftup   activesheet.autofiltermode = false  loop  application.screenupdating = true end sub 多岐に渡るなら,別出しして一括削除の方が効率的です: sub macro2()  if application.countif(range("J:J"), 0) = 0 then exit sub ’ご利用のCSVのレイアウトも何も情報が無いので  range("1:1").insert  range("A1") = "head"  range("Z:Z").insert ’抽出  range("J:J").autofilter field:=1, criteria1:=0  range("A:A").copy range("Z1")  activesheet.autofiltermode = false ’抽出  range("A:A").advancedfilter action:=xlfilterinplace, _   criteriarange:=range("Z1:Z" & range("Z65536").end(xlup).row), _   unique:=false ’削除片付け  range("A1").currentregion.entirerow.delete shift:=xlshiftup  activesheet.showalldata  range("Z:Z").delete shift:=xlshifttoleft  range("A1").select end sub

KOH3193
質問者

お礼

お礼が遅くなり、申し訳ありません。 >削除しなきゃならないA列の種類(数じゃない)がほどほど少なければ 削除するA列の種類は1種類なので、こちらの方法でできそうです。 前回投稿した質問にも回答をいただきましたが、私が到底思いつかないような方法で、大変参考になります。 ありがとうございました!

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

すいません、意地悪な回答です。 Sub Sample() Dim MaxRow As Long, MaxCol As Long     MaxRow = Cells(Rows.Count, 1).End(xlUp).Row     MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1     Range(Cells(2, MaxCol), Cells(MaxRow, MaxCol)).FormulaR1C1 = "=IF(RC[" & 10 - MaxCol & "]=0,RC[" & 1 - MaxCol & "],"""")"     Range(Cells(2, MaxCol + 1), Cells(MaxRow, MaxCol + 1)).FormulaR1C1 = "=COUNTIF(C[-1],RC[" & 0 - MaxCol & "])"     With Range("A1")         .AutoFilter         .AutoFilter Field:=MaxCol + 1, Criteria1:=">0"         Rows("2:" & MaxRow).SpecialCells(xlVisible).Delete Shift:=xlUp         .AutoFilter     End With     Columns(MaxCol).Resize(, 2).Delete End Sub 以下、考え方です。 手作業でやるとしたらどうなるかなぁ?と考えたときに真っ先に思いつく流れが 「まずは削除の対象になる行の判断」ですね。 そんなわけで > J列=0の行 を、まずは抜き出します。 単純に、適当なセル(例えばN列)に「=IF(J2=0,"",A2)」としてやれば、 「J列が0の行のA列」を書き出してくれますね(これも後に使います)。 続いて > J列=0の行のA列の値と同じ値がA列に入力されている行 コレの判断ですが、先ほど書き出した「J列が0の行のA列」を使って、 これまた適当なセル(例えばO(オー)列)に「=COUNTIF(N:N,A2)」としてやれば、 「A列の値がN列にあるか」判断できます。 「J列=0の行のA列の値と同じ値がA列に入力されていない行=削除しない行」には 「0(ゼロ)」が返ってくる、と言う寸法です。 ※「J列=0の行のA列」も自身のA列の値N列から数えますから、必ず「1以上」が返ります。 (ややこしい日本語ですが、なんとか読み取ってくださいませ。  この辺りは「実際に関数式を入力してみると」少しは分かりやすいと思われます。) つまり、ここまでやるとO(オー)列には 「削除しない行は0(ゼロ)、削除する行には1以上の数値」が返ってきます。 ここまで出来ればあとは簡単ですね。 O(オー)列に「1以上(0より大きい)」でフィルタをかけてやれば、 削除対象の行だけを表示することが出来ます。 あとは、抽出された行を削除して、フィルタを解除、 余分な列(N:O)も削除してやれば、スッキリします。 その「適当な列」を判断するために変数MaxColに最終列+1列目を、 データがある最終行を判断するために変数MaxRowに最終行を仕込んで、 一気にザザーっとやっつけてしまうように、また > 一旦「別シートに抽出せずに」処理したい を曲解し、「同じシートなら良いんだよね♪」というコンセプトで書いたのが、 上記の(かなり意地悪な)コードと言うことです。 長々と書きましたが、参考までにどうぞ。

KOH3193
質問者

お礼

お礼が遅くなり、申し訳ありません。 回答ありがとうございます。 行全体を削除するので、同じシート上ではよくないかなと思い、別シートに抽出したのですが、私の質問文の書き方だと“同じシートなら”とも解釈できますね。 意地悪な回答とのことで、正直なところ『しまった!』と思いつつ、丁寧に説明をしていただきまして、参考になりました。 ありがとうございました!

関連するQ&A

  • 【Excel VBA】条件つき行削除

    Excel2003を使用しています。 システムからCSVで落としたデータで、データの並び方に規則性があるので、それを利用して、不要部分のデータをマクロで削除できないかと思い、質問させていただきます。 A列に『累計』を含む文字があった場合、その行のD列が0だったら、その行より上の行のA列に『計上日』と入力されている行までを削除するということをしたいです。 下記でいうと、2~5行までを削除したいです。    A     B     C     D 1 2 計上日 3 4 5 累計                0 6 7 計上日 8 9 累計              1000 上記では、B列、C列には何も書いていませんが、実際はデータが入力されていたり、空欄だったりです。 D列が0の行を削除するコードはわかるのですが、さらに、条件が加わっても同じように処理は可能でしょうか? よろしくお願いします。

  • Excel VBAで値が重複する行を削除する

    Excel2000を使っています。 シートAに数千件のデータがあります。 シートBのE列にある文字とシートAのD列の文字が重複する場合に、シートAの重複するセルがある行を削除する(且つできれば行のデータを抜き出すVBAを作ろうと考えています。 最近VBAの初心者本をやっと理解したところで、ちんぷんかんぷんとまではいかないけど、知恵熱がでました。 仕事なので自分でなんとかすべきかと思いますが、きっかけの調べ方がまずわからない。 どなたか、解かるきっかけだけでも与えて頂けないでしょうか。とくに、別シートの値と重複する値を探す場合に何をいれるかわかればきっと道は開けると思うんですが…。 初めての質問なので、質問内容が至らなかったらもうしわけありません。

  • 【Excel VBA】条件を満たすデータを順に抽出

    Excel2003を使用しています。 CSVでExcelに取り込んだデータの中から、条件を満たすものを順に抽出して一覧表を作成するマクロを作りたいのですが。。。 ・Sheet2のB列に“コード”と入力されている行のC列のデータ → Sheet1のC列2行目以下 ・Sheet2のC列に“合計”と入力されている行のD列のデータ → Sheet1のD列2行目以下 に順に表示させたいのですが、うまくいきません。 以前、いただいた回答で参考になりそうなものを見てみたのですが、手順というか何かヒントのようなものをいただけたら、自分でどうにかできそうなので、質問させていただきました。 よろしくお願いします。

  • EXCEL 2列交わる条件でフィルタをかけたい!

    初心者ですいません。 A列に対してB列の値を、複数条件でフィルタをかける方法を教えてください。 例えば…下記のように、 B列の(値→⚪︎を含まない値→×)だけに絞った A列の値を、別のシートに抽出したいと思っています。 ======================== 【フィルタ前】 A列 B列 ーーーーーーー 1 × 1 × 1 ⚪︎ ーーーーーーー 2 × ーーーーーーー 3 ⚪︎ 3 × ーーーーーーー 4 ⚪︎ ーーーーーーー 5 × 5 × 5 × 【フィルタ結果】 A列 B列 ーーーーーーー 2 × ーーーーーーー 5 × ======================== 1シートに対しデータが1000行位で、 5シートあるので、困っています。 どんな方法でも良いので、宜しくお願いします。

  • VBAを使った、Excelでのシート間データ抽出

    はじめまして。みなさまどうか教えてください。 Sheet1にはA列に250行程、コードが存在します。 Sheet2にはA列(コード)からI列まで、そして1000行程データが存在します。 Sheet1にあるコードは重複はなく、Sheet2のコード内に必ず同じコードがあります。 Sheet2にも重複コードはありません。 そこでSheet1のコードを使い、Sheet2を検索し、同一コードのデータ(A列からI列の行すべて)を全て(250件分)、Sheet1のコード記載順(A1、A2、A3・・・・)で、Sheet3に抽出したいのです。 どうか、よろしくお願いします。

  • 【Excel VBA】条件に合うデータの転記

    Excel2003を使用しています。 2つのシート間の特定の範囲内で、条件に合うデータを転記したいのですが… Sheet1(A1:C41) ← 一定範囲 Sheet2(選択範囲) ← 都度、選択範囲取得 Sheet2の選択範囲内で、A列とB列の値が、Sheet1のA列とB列のそれぞれの値と一致した場合、Sheet1のC列の値をSheet2のE列に転記したいのですが、こういう場合、コードはどのように書いたらいいでしょうか? 条件に合ったものを順に転記していくコードは書いたことがあるのですが、特定の範囲内ということや、転記する場所が指定されたりしていて、つまづいています。 よろしくお願いします。

  • Excelでのデータ抽出

    Excelで外部結合風のデータ抽出を教えてください。 シートAとシートBに表形式のデータがあり、 シートAのA列の値とシートBのA列の値が一致するシートBの 行を抽出するのが目的です。 具体的には次のような感じです。 シートA         シートB ----------------  ---------------- A列 | B列 | C列     A列 | B列 | C列 ----------------  ---------------- 2  | 2B  | 2C      1  | 1BB | 1CC ----------------  ---------------- 4  | 4B  | 4C      2  | 2BB | 2CC ----------------  ---------------- 6  | 6B  | 6C      3  | 3BB | 3CC ----------------  ---------------- ↓ シートB ---------------- A列 | B列 | C列 ---------------- 2  | 2BB | 2CC ---------------- 以下以外の方法がありましたら教えてください。 1)アクセスに両シートのデータを取り込み、2つのテーブルを外部結合で連結させる。 2)マクロで二重ループをつくり、A列が一致した行を取り出す。 よろしくお願いします。

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • エクセル教えて下さい

    以下の様なデータで、 __A__B__C 1_10__12__● 2_12__14__△ 3_18__18__◎ 4_22__31__□ 5_31__33__● A列にある数字とB列にある数字が一致する行だけを別シートに抽出したい場合、 どのような方法がありますか?

  • VBA オートフィルタ後のセル色付け

    いつも大変お世話になっております。 VBA初心者です。Excel2007、XPを使用しております。 データの状態ですが、 AからQ列まである顧客データ(1行目は見出し、2行目以降がデータ)を、 Sheet2へ参照で並び変えしてます。 Sheet2はAからM列になっており、こちらも1行目見出し、2行目以降データです。 見出しのみ色付けしており、このSheet2はデータを蓄積していってます。 Sheet1は新規データ貼付用 Sheet2は参照されたデータの蓄積 Sheet3はcsv保存用 目的は、Sheet2でオートフィルにより、色なしを表示し、2行目以降をコピー、 Sheet3へ値貼付、csv保存。値削除。 Sheet2の色なしを色付け(濃いグレー)。 以上の動作をしたいのですがうまくいかず、大変困っております。 お手数ですがご教授お願い致します。

専門家に質問してみよう