こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

特定列を削除したい

以下の同じフォルダに入った条件の合致したセルがある行を削除したいのです
が色々検索しても下の処理にあてはまるようなものが見つかりませんでした。
どなたかお助けしていただけないでしょうか?
お願いします。



 特定条件合致行削除()
 
  Dim path$, wb As Workbook, wbName$
Dim ws As Worksheet, I&

 path = ThisWorkbook.path & "\"

   wbName = Dir(path & "*.xls")
   Do Until wbName = ""
      If wbName <> ThisWorkbook.Name Then


       Set wb = Workbooks.Open(path & wbName)
        = 2
      For Each ws In wb.Worksheets

#####################################################################
                  With ws
                 
この部分に特定範囲の中に条件(3つ)が含まれる行を削除する処理
を実行させたい。




                   I = I + 1

                End With
######################################################################
                        Next
                        DoEvents
                        wb.Save
                      End If
                   wbName = Dir
                  Loop
               Set wb = Nothing
               Set ws = Nothing

    MsgBox "第三処理が完了しました。処理完了です。",       vbInformation, "処理確認"

        End Sub

投稿日時 - 2009-09-17 17:41:54

QNo.5297997

困ってます

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

No.1です。

> 範囲指定のことでとまります。
> >For nRow = .UsedRange.Rows.Count To 1 Step -1
> >  .Rows(nRow & ":" & nRow).Select
>
> このような範囲指定だと、とまってしまうようで・・。

どの様なエラーが出ていますか?
コードを入れた場所を確認してください。
質問で提示されたソースの
> この部分に特定範囲の中に条件(3つ)が含まれる行を削除する処理
> を実行させたい。

の、部分をコードで置き換えるつもりで作ってあります。
「With ws」等が消されているのでは無いでしょうか?

投稿日時 - 2009-09-18 11:12:44

補足

ありがとうございます。
今は

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でとまります。

コンパイルエラー
メソッドまたはデータメンバが見つかりませんとなります。

色々試していて、ころころコードが変わって申し訳ありません。

お手数をおかけします。

投稿日時 - 2009-09-18 11:45:34

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

No.1です。

> If .Range("a:t") Like "*01187*" Then .EntireColumn.Delete

「行削除」なら .EntireRow.Delete ですよ。

ただし、そこを直しても動きません。
削除の場合、削除によってアドレスが変わりますので、条件付書式を指定範囲全体に適用するようなわけにはいきません。
「下から上に行を見て行き、該当するなら削除」が基本です。

時間が無いのでその物ずばりのコードは提示できませんが、No.1で私が回答したコードを見て、ループを回す範囲を5000~2行に固定。「全ての条件を満たしたら」→「1つでも条件を満たしたら」の変更で可能です。

投稿日時 - 2009-09-18 14:43:17

ANo.4

別に揚げ足とり言ってるわけではありません。
コードをみるととてもマクロの自動記録とは思えません。
それなりに経験があるだろうと思うのに変数宣言が変な癖のついた表記だったので気になったので「苦言」を書いただけです。
きちんと
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 '見つけた行に貼り付け

これを条件が成立したときに実行すればいいと思います。

投稿日時 - 2009-09-18 10:29:51

補足

うまく行かなかったのは、削除の部分です。

経験・・・まったくないです。
以前質問して回答いただいたものを活用しています。

同じような処理(同じフォルダの複数ブックの複数シートに対する)
が多いので重宝して活用させていただいているだけです。

なので変数宣言とかまったくわからないです。
なんとなく動けば、こういうことねって意味がわかる程度です。

マクロで記録したので
行削除の部分です。

他に色々さがして
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
を見つけてみましたが、やはりうまく行かないです。
ファイル数が多いので自動でやりたいんですが・・。


今までいろんな処理で活用してますのでちゃんと動きます。

コードに対しての発言はコードを作成した人ではないので・・。
私としては作成した人に申し訳ないです。
こんな言われようされて・・・。

投稿日時 - 2009-09-18 10:58:38

ANo.3

表題(列)と中身(行削除)が一致しないな質問がいい加減だ。
>下の処理にあてはまるようなものが見つかりませんでした
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)それぞれで、疑問点を絞れるまで質問者がやってみて質問のこと。
この質問では丸投げに近い。
削除条件も、具体的に書いてないが、ものによっては、コード化にてこずるのではないか。

投稿日時 - 2009-09-17 23:55:48

補足

あの揚げ足取りならコメントしないで下さい。

こちらはマクロの記録などして、そのコードを
色々変えてみて試したけど、うまくできない結果
お願いしてるわけで丸投げといわれてもね・・。

このアドバイスはこちらはわかってることを
繰り返してるだけで意味なし・・・。

投稿日時 - 2009-09-18 09:15:07

ANo.2

タイトルが”特定列を削除したい”
1行目が”セルがある行を削除したいのです”
よくわかりません。

提示してあるコードではコードがあるブックのフォルダー内のすべてのExcelファイルのすべてのシートに対して処理をするという意味でしょう
この処理があってるかどうかは疑問がありますが

質問は
条件に合った行を削除するにはどうしたらいいか
ということでしょうか
それとも提示してあるコードがやってみたけど動作がおかしいということでしょうか
だったら余計なコードは回答するほうは読みやすいです。
最初の変数宣言は横着せずにきちんと書いたほうがいいですよ。

投稿日時 - 2009-09-17 19:26:12

補足

そうです。
条件にあった行を削除したいんです。

>最初の変数宣言は横着せずにきちんと書いたほうがいいですよ。

そういうのまったくわからないから質問してるんですけど・・。

回答を提示してくれて、質問はこういう意味とか
言ってくれる方がありがたいです。

結構質問の揚げ足取る人多いですよね。

投稿日時 - 2009-09-18 09:20:14

ANo.1

かなり適当ですが、こんな感じでしょうか。
最終行から上に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 も仕掛けた方が良いかと思います。

投稿日時 - 2009-09-17 19:09:59

補足

ありがとうございます。

質問がわかりずらくて申し訳ありません。

条件が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 

はエラーを発見したいのでわざと入れてません。

よろしくお願いします。

投稿日時 - 2009-09-18 09:23:16

あなたにオススメの質問