- ベストアンサー
特定条件合致行削除の方法を教えてください
- 特定の条件に合致した行を削除する方法について教えてください。
- Excelの特定の範囲に含まれる特定の条件に合致した行を削除する処理を実行したいです。
- 条件に合致する行を削除するためのVBAの処理方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 > 範囲指定のことでとまります。 > >For nRow = .UsedRange.Rows.Count To 1 Step -1 > > .Rows(nRow & ":" & nRow).Select > > このような範囲指定だと、とまってしまうようで・・。 どの様なエラーが出ていますか? コードを入れた場所を確認してください。 質問で提示されたソースの > この部分に特定範囲の中に条件(3つ)が含まれる行を削除する処理 > を実行させたい。 の、部分をコードで置き換えるつもりで作ってあります。 「With ws」等が消されているのでは無いでしょうか?
その他の回答 (5)
- mt2008
- ベストアンサー率52% (885/1701)
No.1です。 > If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete 「行削除」なら .EntireRow.Delete ですよ。 ただし、そこを直しても動きません。 削除の場合、削除によってアドレスが変わりますので、条件付書式を指定範囲全体に適用するようなわけにはいきません。 「下から上に行を見て行き、該当するなら削除」が基本です。 時間が無いのでその物ずばりのコードは提示できませんが、No.1で私が回答したコードを見て、ループを回す範囲を5000~2行に固定。「全ての条件を満たしたら」→「1つでも条件を満たしたら」の変更で可能です。
- rivoisu
- ベストアンサー率36% (97/264)
別に揚げ足とり言ってるわけではありません。 コードをみるととてもマクロの自動記録とは思えません。 それなりに経験があるだろうと思うのに変数宣言が変な癖のついた表記だったので気になったので「苦言」を書いただけです。 きちんと Dim path as string dim wb As Workbook dim wbName as string Dim ws As Worksheet dim I as integer コードは未来の自分と他人が読むものですから読みやすいように書きましょう もしあなたが言われるとおり自動記録にちょっと手直しした程度といわれるならこのコードはどこからか拾ってきたものがベースになっていると想像するのです。 だとしたらそのコードの意味を十分にりかいしようとせずに「これで動いたからこれでいい」というつもりなら多少の回答やアドバイスでは何にもならないと思います。 この部分はちゃんと動きますか? Set wb = Workbooks.Open(path & wbName) = 2 さて行を削除する方法はいろいろありますが 手動でやるのと同じようにその行の1行下からい最後までをCutして、その行にPasteするという方法があります。 見つけたセルをDCELLとするとデータが10列までとすると 件数=cells(1,1),.End(xlDown).row 'データの最後の行の行番号を取得 range(cells(DCELL.row+1、10),cells(件数,10)).cut 見つけた行の次の行から最後の行までカット cells(DCELL.row,1).Paste '見つけた行に貼り付け これを条件が成立したときに実行すればいいと思います。
補足
うまく行かなかったのは、削除の部分です。 経験・・・まったくないです。 以前質問して回答いただいたものを活用しています。 同じような処理(同じフォルダの複数ブックの複数シートに対する) が多いので重宝して活用させていただいているだけです。 なので変数宣言とかまったくわからないです。 なんとなく動けば、こういうことねって意味がわかる程度です。 マクロで記録したので 行削除の部分です。 他に色々さがして With ws .Range("a:t").Select If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete ElseIf .Range("a:t") Like "*01301*" Then .EntireColumn.Delete >Set wb = Workbooks.Open(path & wbName) > = 2 End If End With を見つけてみましたが、やはりうまく行かないです。 ファイル数が多いので自動でやりたいんですが・・。 今までいろんな処理で活用してますのでちゃんと動きます。 コードに対しての発言はコードを作成した人ではないので・・。 私としては作成した人に申し訳ないです。 こんな言われようされて・・・。
- imogasi
- ベストアンサー率27% (4737/17069)
表題(列)と中身(行削除)が一致しないな質問がいい加減だ。 >下の処理にあてはまるようなものが見つかりませんでした WEBを検索したのだろうが、そっくりのコードは見つからないだろう。 しかし中身的に、このコーナーでも何度も質問に出ているるものだ。 また下記(1)(2)のコードはWEBで多数ヒットするはず。 (1)あるフォルダの全てのエクセルブック(名)を順次捕まえる。 その名前でブックを開く。(2)(3)の処理後保存して閉じる。 (2)あるブックの全シート(名)を順次捕まえる。 (3)行削除は最終行から、条件を判定し、合致すれば削除するのがミスが少ない。 (1)(2)ともForEachで処理できる。 (1)は「Googoleで「フォルダ 全てのブック」で照会すればコードが出てくる。 http://q.hatena.ne.jp/1211998240 など多数。Dir関数利用でよかろう。 (2)など Sub test01() For Each sh In Worksheets MsgBox sh.Name Next End Sub でしまい。 ーーー やり方全般について、(1)(2)(3)にそれぞれ分けて、コードを書き、テストする。 そして入れ子にするやり方が、初心者が取るべき方法ではないか。 (1)(2)(3)それぞれで、疑問点を絞れるまで質問者がやってみて質問のこと。 この質問では丸投げに近い。 削除条件も、具体的に書いてないが、ものによっては、コード化にてこずるのではないか。
補足
あの揚げ足取りならコメントしないで下さい。 こちらはマクロの記録などして、そのコードを 色々変えてみて試したけど、うまくできない結果 お願いしてるわけで丸投げといわれてもね・・。 このアドバイスはこちらはわかってることを 繰り返してるだけで意味なし・・・。
- rivoisu
- ベストアンサー率36% (97/264)
タイトルが”特定列を削除したい” 1行目が”セルがある行を削除したいのです” よくわかりません。 提示してあるコードではコードがあるブックのフォルダー内のすべてのExcelファイルのすべてのシートに対して処理をするという意味でしょう この処理があってるかどうかは疑問がありますが 質問は 条件に合った行を削除するにはどうしたらいいか ということでしょうか それとも提示してあるコードがやってみたけど動作がおかしいということでしょうか だったら余計なコードは回答するほうは読みやすいです。 最初の変数宣言は横着せずにきちんと書いたほうがいいですよ。
補足
そうです。 条件にあった行を削除したいんです。 >最初の変数宣言は横着せずにきちんと書いたほうがいいですよ。 そういうのまったくわからないから質問してるんですけど・・。 回答を提示してくれて、質問はこういう意味とか 言ってくれる方がありがたいです。 結構質問の揚げ足取る人多いですよね。
- mt2008
- ベストアンサー率52% (885/1701)
かなり適当ですが、こんな感じでしょうか。 最終行から上に1行づつ見て行き、条件が3つともあった場合、その行を削除します。 'シートをアクティブに .Activate '行を下から上に検索 For nRow = .UsedRange.Rows.Count To 1 Step -1 .Rows(nRow & ":" & nRow).Select '条件を以下の3つと仮定 aTarget = Array("100", "200", "300") For Each A In aTarget Set FindCell = Selection.Find(What:=A) If FindCell Is Nothing Then Exit For Next If Not FindCell Is Nothing Then 条件を全て満たす行を削除 Selection.Delete Shift:=xlUp End If Next nRow 画面のチラつきを押さえるためにも Application.ScreenUpdating = False も仕掛けた方が良いかと思います。
補足
ありがとうございます。 質問がわかりずらくて申し訳ありません。 条件が3つともではなく、3つあってそれぞれ一致したら その行を削除したいんです。 マクロの記録とかで色々やってみたんですが、どうも 範囲指定のことでとまります。 >For nRow = .UsedRange.Rows.Count To 1 Step -1 > .Rows(nRow & ":" & nRow).Select このような範囲指定だと、とまってしまうようで・・。 Range("範囲”).(この部分で処理指定なのかな?) 同じ感じで########の中を With ws .Select .Range("A2:AC5000").FormatConditions.Delete .Range("A2:AC5000").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF($A1:$AC1,""*集計"")" .Range("A2:AC5000").FormatConditions(1).Interior.ColorIndex = 35 .Range("A2:AC5000").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF($A1:$AC1,""総計"")" .Range("A2:AC5000").FormatConditions(2).Interior.ColorIndex = 36 I = I + 1 End With のようなコードだとうまく行ったんですが・・。 条件の行に色をつける処理です。 こんな感じで条件にあった行を削除することは できないのでしょうか? あるフォルダにある、複数ブックの複数シートに 対してです。 > Application.ScreenUpdating = False はエラーを発見したいのでわざと入れてません。 よろしくお願いします。
補足
ありがとうございます。 今は With ws Range("a:t").Select If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete ElseIf .Range("a:t") Like "*01301*" Then .EntireColumn.Delete Next End With のところのIf .Range("a:t") Like "*01187*" Then .EntireColumn.Delete の.Rangeでとまります。 コンパイルエラー メソッドまたはデータメンバが見つかりませんとなります。 色々試していて、ころころコードが変わって申し訳ありません。 お手数をおかけします。