• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:いつもお世話になっております。)

Excel VBAで特定の条件に基づいて行を削除する方法

このQ&Aのポイント
  • ExcelのVBAを使用して、特定の条件に基づいて行を削除する方法について教えてください。
  • 特定の列のデータに紐づいている他の列のデータによって行を削除する方法について教えてください。
  • ExcelのVBAを使用して、行削除の条件に基づいて行を削除する方法について教えてください。

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

  • ベストアンサー
  • hananoppo
  • ベストアンサー率46% (109/235)
回答No.2

こんな感じでどうでしょう。 Sub RowsDelete() Dim i As Long, j As Long, EndRow As Long Dim 品番 As Long, 得意先 As String Dim Flag As Boolean i = 2 EndRow = Range("A1").End(xlDown).Row Do 品番 = Cells(i, 2).Value 得意先 = Cells(i, 1).Value Flag = False For j = i + 1 To EndRow If Cells(j, 2).Value = 品番 And Cells(j, 1).Value <> 得意先 Then Flag = True Exit For End If Next j If Flag = True Then For j = EndRow To i Step -1 If Cells(j, 2).Value = 品番 Then Rows(j).Delete Next j EndRow = Range("A1").End(xlDown).Row Else i = i + 1 End If Loop Until i >= EndRow End Sub

mame1218
質問者

お礼

ありがとうございました。 完璧でした。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 「紐づいている」という言葉は標準的な日本語では無い様ですので、私が御質問の意味を正確に理解しているのか、自信はあまり御座いませんが、質問者様がどの様な処理をなされたいのかに関しては、添付画像のリストのパターンから、何となく解った様な気がします。 (もし、私が間違って理解していた場合には、補足等で御指摘願います)  処でもし、質問者様の仰る様に、VBAで4行目、5行目、6行目を完全に削除してしまいますと、削除後に新たに別の得意先が、例えば、品番12310を購入(?)した場合、品番12310の行が削除されずに残る事になります。  ですから、元データは全て残して、別Sheetに編集後のリストを表示させる様にされた方が、宜しいのではないでしょうか?  その場合は、VBAを使わずとも、関数でも可能です。  今仮に、元のリストがSheet1に存在していて、Sheet3のA列を作業列として使用して、Sheet2に編集後のリストを表示させるものとします。  まず、Sheet3のA1セルに次の数式を入力して下さい。 =IF(OR(INDEX(Sheet1!$A:$A,ROWS($1:1))="",INDEX(Sheet1!$B:$B,ROWS($1:1))="",SUMPRODUCT((OFFSET(Sheet1!$A$1,,,MATCH("゜",Sheet1!$A:$A,-1))<>INDEX(Sheet1!$A:$A,ROWS($1:1)))*(OFFSET(Sheet1!$B$1,,,MATCH("゜",Sheet1!$A:$A,-1))=INDEX(Sheet1!$B:$B,ROWS($1:1))))>0),"",ROWS($1:1))  次に、Sheet3のA1セルをコピーして、Sheet3のA2以下に、Sheet1のリストの行数を上回る行数になるまで、貼り付けて下さい。  次に、Sheet2のA1セルに次の数式を入力して下さい。 =IF(ROWS($1:1)>COUNT(Sheet3!$A:$A),"",INDEX(Sheet1!A:A,SMALL(Sheet3!$A:$A,ROWS($1:1))))  次に、Sheet2のA1セルをコピーして、Sheet2のB1セルに貼り付けて下さい。  次に、Sheet2のA1~B1の範囲をコピーして、同じ列の2行目以下に、Sheet1のリストの行数を上回る行数になるまで、貼り付けて下さい。  以上です。

mame1218
質問者

お礼

大変参考になりました。 BAにするか迷いました。 今後ともよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • こんにちは いつもお世話になっています

    こんにちは いつもお世話になっています エクセル2003を使っています。 特定の文字列以降の文字列を(特定文字列自身も含めて)削除する処理に関して質問します。 特定の文字列は二つあり、【@】と【変化】です(【 】も含みます)。 この二つの文字列はバラバラに出てきます。一方だけがでてくるセル、両方出てくるセル、両方出てこないセル、があるという意味です。これらはB列だけにあります。  現在のやり方は  「*」を各特定文字の後ろに付けて、置換機能で削除しています(「【@】*」、「【変化】*」みたいに)しかし、二つの文字列に対して別々にやるようなので、記録マクロで一括で処理しています。  ここで質問なのですが  置換後の文字列は空白にしているのですが、スペースが残ってしまいます。つまり、処理後にエクセルの書式メニューから「行」-「自動調整」をしてもスペースをつめられない状態です。どうすればスペースをつめられるでしょうか。  あるいは、置換でなく、適当なマクロを紹介していただけると助かります。  よろしくお願いします。

  • いつもお世話になっております。

    いつもお世話になっております。 今回、エクセルの関数で分からない事が出てきましたので、 質問させていただきます。 エクセルのデータ内はこのようになっています。    【A】       【B】               【C】           【D】 【1】あいうえお  http://www.●●●.jp    あいうえお      http://www.●●●.jp 【2】かきくけこ  http://www.●●●.com    まみむめも      http://www.●●●.me 【3】さしすせそ  http://www.●●●.info   なにぬねの      http://www.●●●.asia 【4】たちつてと  http://www.●●●.biz    かきくけこ      http://www.●●●.com ※A~Dまでを1つのセットとして、10000行以上あります。 D1にあるデータが、B列に存在するのかどうか調べたいのですが、 どのような関数を使えばわかるのでしょうか? ある場合は、個数を表示させたいと思っています。 (1個だけではなく、4個以上存在している場合もあります) 本当にこまっています。 どなたか、ご助言頂けないでしょうか? よろしくお願いします。

  • いつもお世話になります。

    いつもお世話になります。 エクセルVBA組み方で質問です。 シート1のA列に商品名、B列に納品数が入力されたリストがあります。 ユーザーフォーム上でリストボックスを作成し、リストのソースを、上記A、B列に設定しています。 ここで、リストボックスに表示されたリストをダブルクリックすると、インプットボックスが表示され、 シート上の納品数に変更を加えることはできますか? また、同様の操作で、AB列の不要な行を削除するという操作はできるでしょうか?

  • いつもお世話になります。

    いつもお世話になります。 Excelで以下のような表があります。 A  B    C    D    E    F    G ------------------------------------------------ X  12345  -0.3  -0.2  -1.0  -0.5  -0.7 Y  32000  -0.1  -0.2  -0.4  -0.8  -0.3 ※上記データは実際にはもっと多くの件数があります。 これを X  12345   -0.3 X  12345   -0.2 X  12345   -1.0 X  12345   -0.5 X  12345   -0.7 Y  32000   -0.1 Y  32000   -0.2 Y  32000   -0.4 Y  32000   -0.8 Y  32000   -0.3 という表(横並びを縦並び)に変換したいのですが、Excelで可能でしょうか? A列とB列は変換後も行見出しとして利用したいです。

  • データのない所の結果を空白にしたいです

    グーグルスプレッドシートを使用しています。 エクセルの関数と同じだと思いまして、こちらで質問させていただきましたことご了承くださいませ。 ABCシートとXYZシートがあります。 XYZシートにはABCシートを参照して関数を書いています。 意図していない結果が出るのは「XYZシートの計算結果」の16行目~21行目です。 ABCシートの中のデータの無い所の計算結果で問題が発生しています。 データのないところは空白としたいのですがどのようにすれば良いかアドバイス頂けないでしょうか。 以下、ファイルを共有していますがイメージも本質問に添付させていただきました。 https://docs.google.com/spreadsheets/d/1wOPzf0FNeUgPqxtZzouf23E1SlcNBO0-cDkkpidn3d0/edit?usp=sharing ●ABCシートの内容です。 A列1行目,B列1行目 1行目です,B列2行目です 2行目です,B列3行目です 3行目です,B列4行目です 4行目です,B列5行目です 5行目です,B列6行目です 6行目です,B列7行目です 7行目です,B列8行目です 8行目です,B列9行目です 9行目です,B列10行目です 10行目です,B列11行目です 11行目です,B列12行目です 12行目です,B列13行目です 13行目です,B列14行目です 14行目です,B列15行目です ●XYZシートの計算結果です。 A列1行目,B列1行目 13行目です,B列14行目です 14行目です,B列15行目です 11行目です,B列12行目です 12行目です,B列13行目です 9行目です,B列10行目です 10行目です,B列11行目です 7行目です,B列8行目です 8行目です,B列9行目です 5行目です,B列6行目です 6行目です,B列7行目です 3行目です,B列4行目です 4行目です,B列5行目です 1行目です,B列2行目です 2行目です,B列3行目です #REF!,#REF! A列1行目,B列1行目 #REF!,#REF! #REF!,#REF! #REF!,#REF! #REF!,#REF! ●XYZシートの関数です A2には =OFFSET(ABC!$A$1,COUNTA(ABC!$A:$A)-ROW()+MOD(ROW(A2),2)*2,COLUMN()-1) B2には =OFFSET(ABC!$A$1,COUNTA(ABC!$A:$A)-ROW()+MOD(ROW(B2),2)*2,COLUMN()-1) と記載しています。以降 A3には =OFFSET(ABC!$A$1,COUNTA(ABC!$A:$A)-ROW()+MOD(ROW(A3),2)*2,COLUMN()-1) B3には =OFFSET(ABC!$A$1,COUNTA(ABC!$A:$A)-ROW()+MOD(ROW(B3),2)*2,COLUMN()-1) 以降、関数の中の (A3)(B3)の所が (A4)(B4) (A5)(B5) と変化しています。 データのないところは空白としたい場合にどのように関数を書けば良いのかアドバイス頂けないでしょうか? 恐れ入りますがよろしくお願いいたします。

  • いつもお世話になっております。

    いつもお世話になっております。 エクセルのcount関数について質問させていただきます。 数値が入っているセルを範囲指定する際、すぐ隣に数値が入っているのに、そこを含まずに指定すると、エラースマートタグの「このセルにある数式は、隣接したセル以外の範囲を参照します」の表示が出ますが、同じ式で1か所文字列に変更するとエラーが消えます。 文字列を削除してセルを空白にしてもエラーは再度出ます。この違いがよくわかりません。 どういう意味なのか教えていただけないでしょうか。よろしくお願いします。 画像の数式は、いずれの行もB列からE列まで選択してcount関数をF列に入れています。

  • セルの値が同じ行を条件に従って行削除するマクロ

    A~E列までデータがあり 行数は約30,000行あります。 A列は半角英数字と-で桁数は11桁又は14桁です。 数字のみもあれば数字と英字の組み合わせもあります。 (英字はどこの桁にあるか何個あるかは不規則です) 例 ABCD123456789X 124345678901234 55555-55555 ABC12345DEF678 E列には半角の 1 か 2 しかありません。 A列が同じ値の行を検出して重複している行は1行だけ残して 後は行削除をしたいです。 行削除はE列の値によって判定したいです。 重複行は1つの値に対して何行あるか不明です。 30,000行のうち、重複行を削除すると10,000行くらいになる予定です。 (1)重複行にてE列の値が1だけの場合    どれでもいいので1行残して残りは行削除 (2)重複行にてE列の値が2だけの場合   どれでもいいので1行残して残りは行削除 (3)重複行にてE列の値が1も2もある場合   E列の値が2の行をどれでもいいので1行残して残りは削除 例 (1) 1234567890XXXX-1 1234567890XXXX-1 1234567890XXXX-1 ↓ 1234567890XXXX-1 (2) 123ABCDE901234-2 123ABCDE901234-2 ↓ 123ABCDE901234-2 (3) 12345678901234-1 12345678901234-2 ↓ 12345678901234-2 ABC45678901234-1 ABC45678901234-2 ABC45678901234-1 ABC45678901234-2 ↓ ABC45678901234-2 手作業では5時間かかりましたがミスだらけです。 まだ数ファイル残っており手作業では厳しいのでマクロを 作成したいのですが、どう記述していのかまったく検討が付きません。 どうかよろしくお願いします。

  • Excel VBA A列が特定の値以外の場合、その行を削除

    教えてください。 A列の値が特定の値以外の場合、 その行を行ごと削除する方法はありますでしょうか? A列には、 1 タイトル 2 (ブランク) 3 a 4 a 5 b 6 b 7 c 8 c 9 d 10 d ~というふうに2000行辺りまで続きます 例えば、A列の3行目以降の値が b 以外の場合、 3・4・7・8・9・10行を行ごと削除する、ということです。 あまり説明が上手でなくて申し訳ありませんが、よろしくお願いします。

  • EXCELの使い方教えて下さい。

    エクセルで特定条件での数値挿入方法について、教えて頂けないでしょか?よろしくお願い致します。 1行目A~F列に123abc 2行目A~F列に111aaa という既存データがあるとします。 新規データとして、 3行目以降に123、222、111、333、444、111、555、123・・・と追加していくのですが、 A~C列の新規データが、A~C列の既存データと一致する場合、 D~F列に自動的に既存データのアルファベットを挿入する方法を教えて頂けないでしょうか? 新規データの123にはD~F列にabc 新規データの111にはD~F列にaaaという感じです。 ※既存データ、新規データは何万行もありまして、 操作方法がわからなくて大変困っています。 どうかよろしくお願い致します。

  • エクセルVBAで重複データの削除

    A列、B列、C列・・・とデータが入っていて、B~D列の5行目から10行目が関連の有るデータのかたまりとします。 C~D列の全てのデータが重複している場合に、最初のほうのデータ(行番号が小さいほう)を残すものとして、重複データを削除したいのです。 削除するときは、 B~Dの範囲で削除する。A列等は削除しない。 削除したらデータは上に詰める。 データはソートしない。 ということをやりたいのですが、簡単に出来ますでしょうか? 良く覚えていないのですが、ネット上で色々探してみても、必ずソートしている気がしたので、ソートしない方法が知りたいのですが。

専門家に質問してみよう