[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『特定の文字を含んだセルの行を削除』(とんび)
A B C D E F
1 ax * * * * * 2 aa * * * * * 3 bx * * * * * 4 cx * * * * * 5 cc * * * * *
上記のようにA列のセルに文字列が入力されており、末尾がxになっているセルを含んだ行ごと削除したく、下記のマクロを見つけてみたのですが、うまくいきませんでした。
Sub test()
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
For i = lastrow To 1 Step -1 If Cells(i, 1) = "x" Or Cells(i, 1) = "X" Then Rows(i).Delete End If Next End Sub
修正点や他のやりかた等お分かりになる人がいましたら、よろしくお願いします。
If UCase(Cells(i,1)) Like "*X" Then (seiya)
上の式は「コブラ」さんの、質問に対する、A列がx、Xである場合に 削除するマクロです。元々の質問とは別のことをやろうとしている のですからこのコードがうまくいかないという表現ではなく、別の ことをやりたいという表現になりますね。
コブラさん=とんびさん であれば、まずは、元の回答に 返事をすべきではないでしょうか。 (上のコード回答の夕焼)
とんびさん、 きちんと、変数が宣言されているコードを参考にしたほうがよいでしょう。 データ量が多ければ下記コードの方が数倍高速に処理できます。
Sub test() Dim r As Range, txt As String Again: For Each r In Range("a1", Range("a" & Rows.Count).End(xlUp)) If UCase(r.Value) Like "*X" Then txt = txt & "," & r.Address(0,0) If Len(txt) > 245 Then Range(Mid$(txt,2)).EntireRow.Delete txt = "" : GoTo Again End IF Next If Len(txt) Then Range(Mid$(txt,2)).EntireRow.Delete End Sub (seiya)
近年のパソコンはパソコンやプログラム言語が出始めた頃に 比べると、格段に高速になり、個人データ程度の処理に処理速度を うんぬんすることはほとんどなくなってきました。 実際、EXCELのマクロ処理で、処理速度が気になることもほとんどありません。 まだ、そのようなことを言っている人もいるんですね。(せっかち)
その頃と比べても意味がないでしょうね。 (seiya)
>データ量が多ければ下記コードの方が数倍高速に処理できます。 とseiyaさんは言っています。多ければです。 確かに個人データの処理くらいなら、気にしなくても問題ないですが、 近年いくら高性能になったからといって、速度処理を意識しないのはどうかと思いますが・・・ (もちろん安定性が最優先です) データ量が多い場合、ScreenUpdatingプロパティ1つとっても雲泥の差です。 簡単なデータの処理しかしたことないのでしょうか? ちゃちゃを入れるようなレスだったので、発言させていただきました。 (とおりすがり)
とおりすがりさん、どうもです。 私は、このような「ちゃちゃ」には慣れましたし、発言者も想像できます。(おそらく他の多数の方もお分かりかと...) とにかく、変数の宣言も満足にできない人がループ一辺倒の「回答」をつけてくるのには うんざりしています。(あくまでも個人の意見です) (seiya)
興味本位ですが・・・ 古いマシン(Pen3)の結果ですけど、10,000行で半分の行を削除する場合、 夕焼けさんのコードで画面更新を止めると68秒、seiyaさんのコードで56秒と結構時間がかかりました。 もっと短時間で処理できる方法があるのでしょうか? (Hatch)
AutoFilter/数式を絡ませて、SpecialCells/配列内で処理 等が、最速だと思います。 私が提示したコードは、あくまでも単純ループ(シート上)で処理をする場合ですので。
一例 Sub 一例() Columns("a").Insert With Range("b1", Range("b" & Rows.Count).End(xlUp)).Offset(,-1) .Formula = "=if(upper(right(b1,1))=""X"",True,"""")" .SpecialCells(-4123, 4).EntireRow.Delete End With Columns("a").Delelte End Sub
Sub 次() With Range("a1").CurrentRegion .AutoFilter Field:=1, Criteria1:="=*x", Operator:=xlOr, Criteria2:= "=*X" .SpecialCells(12).EntireRow.Delete .AutoFilter End With End Sub
Sub その次() Dim a, i As Long, ii As Long, b(), n As Long With Range("a1").CurrentRegion a = .Value ReDim b(1 To UBound(a,1), 1 To UBound(a,2)) For i = 1 To UBound(a,1) If UCase(Right$(a(i,1),1)) <> "X" Then n = n + 1 For ii = 1 To UBound(a,2) b(n,ii) = a(i,ii) Next End If Next .Value = b End With End Sub (seiya)
to seiyaさん 色んなコードありがとうございます。一般機能を組合せたほうが速そうですね。 AutoFilterは余り好きでないのでAdvancedFilterでやってみます。 (Hatch)
AdvancedFilterを忘れていましたね... これが一番速いかも... (seiya)
> これが一番速いかも... AdvancedFilterでやってみたところ1秒程度と結構速かったです。 報告のみ。。。(Hatch) Sub test3() Dim i As Integer, lastrow As Long Rows("1:1").Insert For i = 1 To 6 Cells(1, i).Value = "見出し" & i Next i lastrow = Cells(Rows.Count, 1).End(xlUp).Row ' Application.ScreenUpdating = False Range("H2").Formula = "=ASC(mid(A2,1,1))<>""x""" With Range(Cells(1, 1), Cells(lastrow, 6)) .AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("H1:H2"), _ CopyToRange:=Range("A" & lastrow + 1), _ Unique:=False End With Rows("1:" & lastrow + 1).Delete ' Application.ScreenUpdating = True End Sub
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.