[[20070831170349]] 『特定の文字を含んだセルの行を削除』(とんび) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『特定の文字を含んだセルの行を削除』(とんび)

  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)

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.