• 締切済み

エクセル2010 VBA 行削除

特定列が空白であれば行削除をしたいのですが、下記コードでうまく削除は出来るのですが、応答なしになったり、とても遅いのですが、もう少し早く処理出来る方法はありますか? E列が空白であれば行削除をしたいのですが・・ With Range("E13", Cells(Rows.Count, 5).End(xlUp)) .AutoFilter Field:=1, Criteria1:="" On Error Resume Next Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then rng.EntireRow.Delete On Error GoTo 0 .AutoFilter End With

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

エクセルのフィルター機能を使って、ある列に注目して、空白であるセルを捉え、その行を行削除したいということか。 標題や質問文には、フィルターを使ってなど書いてないし、With Range("E13", Cells(Rows.Count, 5).End(xlUp))  を書いている理由も書いてないくてわかりにくい。 VBAコードを読者が読み解け、という態度はよくないと常々思う。 質問者側で、やって見る気があるなら、下記の方法で、やってみて、早くなるかどうかみたら。 例データ A1:F10 AA BB CC DD EE FF <--見出しのつもり a1 B1 cc1 dd1 ee1 ff1 a2 B2 cc2 dd2 ff2 <--E列セルが空白の例の行 a3 B3 cc3 dd3 ee3 ff3 a4 B4 cc4 dd4 ff4 a5 B5 cc5 dd5 ee5 ff5 a6 B6 cc6 dd6 ff6 a7 B7 cc7 dd7 ee7 ff7 a8 B8 cc8 dd8 ee8 ff8 a9 B9 cc9 dd9 ff9 ーー 処理内容は、E列で空白セルの行を削除する。 標準モジュールに Sub test01() Range("A1").AutoFilter Field:=5, Criteria1:="=" With Range("A1").CurrentRegion.Offset(1, 0) .Resize(.Rows.Count - 1).EntireRow.Delete End With End Sub ーー CurrentRegionの威力かな。 自動計算は抑止して実行するほうが良いだろう。 ScreenUpdatingの抑止は心配だが。 大村あつしさん(Criteria1:="=")や田中亨さん(CurrentRegion.)のWEB記事が見つかって、組み合わせて使ってみた。 ーー 結果 ZZ1 ZZ2 ZZ3 ZZ4 ZZ5 ZZ6 a1 B1 cc1 dd1 ee1 ff1 a3 B3 cc3 dd3 ee3 ff3 a5 B5 cc5 dd5 ee5 ff5 a7 B7 cc7 dd7 ee7 ff7 a8 B8 cc8 dd8 ee8 ff8

kuulei1024
質問者

お礼

あいがとうございます。 試しましたが Range("A1").AutoFilter Field:=5, Criteria1:="=" ここの部分がRangeクラスのAutoFilterが失敗しましたと出てしまいました。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.4

提示のコードの場合、 対象行範囲の最終行、そのE列が空欄の時に この行が削除されずに残ってしまいませんでしょうか? 遅い理由はわかりませんが、 (力技ですが) 複数行を指定してまとめて削除するコードにしてみました。 よかったら試してみてください。 Sub sample()  Dim LastRow As Long  Dim RowCounter As Long  Dim DelNums As String    LastRow = Range("E16").CurrentRegion.Rows.Count + _    Range("E16").CurrentRegion.Row - 1  'MsgBox LastRow  DelNums = ""  For RowCounter = 16 To LastRow   If Cells(RowCounter, 5).Value = "" Then    DelNums = DelNums & Format(RowCounter) & ":" & _     Format(RowCounter) & ","   End If  Next RowCounter  If DelNums = "" Then Exit Sub  DelNums = Left(DelNums, Len(DelNums) - 1)    'MsgBox DelNums  Range(DelNums).Delete End Sub

kuulei1024
質問者

お礼

ありがとうございます。 試しましたが実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーですと出てしまいました。

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.3

あと セル書き替えたときなど何かのイベントとかのマクロがありその場では必要がないのでしたら 最初に Application.EnableEvents = False 最後に Application.EnableEvents = True などもありかもしれません

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.2

> ありがとうございます。変わりはありませんでした・・ そうですか、自信はありませんがフィルタを使わずに単純に下から削除していったらどうでしょうか。 Sub Test() Dim i As Long, LastRow As Long LastRow = Cells(Rows.Count, 5).End(xlUp).Row For i = LastRow To 13 Step -1 If Cells(i, "E").Value = "" Then Rows(i).Delete End If Next End Sub

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.1

最初に自動再計算をオフにして Application.Calculation = xlCalculationManual 最後にオンにしてみてはいかがですか。 pplication.Calculation = xlCalculationAutomatic あと最初に Application.ScreenUpdating = False 最後に Application.ScreenUpdating = True なども試してみてもいいかもしれません。

kuulei1024
質問者

お礼

ありがとうございます。変わりはありませんでした・・

関連するQ&A

  • マクロで不要な行を削除したい

    エクセル97を使っています。  日付 名前 品目 ・・・  1 2 3 ・ ・ といった表で、日付は2003/2/13という表示になっています。 そこで、今日以前(今日は含まない)の日付の行を削除してしまいたいのですが どうすればいいでしょうか? ちなみに、空白行を削除するのに、 Application.ScreenUpdating = False On Error Resume Next With Columns("E:F") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeComments).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With このような記述を使っています。 「今日」というとTODAY()関数ですよね。 でも、関数ってマクロに組み込めるのでしょうか? しかも「今日以前」という記述はどうすればいいのか? など考えると、わけがわからなくなりました。 今日以前の行を削除するマクロを教えてください。 ちなみに、日付の行では、曜日を追記する関数を使っております。 条件書式も3パターン使い切っております。 よって、マクロで行いたいです。 宜しくお願いします。

  • VBAでオートフィルタの可視セルクリア後空白行削除がうまくできません

    VBA初心者です。 オートフィルターで抽出した行を削除したくて、以下のように書いたのですが、最後の一文でエラーになってしまいます。 ◆エラー内容◆ 実行時エラー1004 重複する選択範囲に対してそのコマンドを使用することはできません。 ◆書いたVBA◆   Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:="=1111", Operator:=xlAnd 'オートフィルターで「1111」を抽出 Dim r As Range Set r = Range(Range("A3"), Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) r.ClearContents 'A列の可視セルの値をクリア Range("A2").Select Selection.AutoFilter 'オートフィルターの解除 r.SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'A列が空白の行は削除→ ココがエラーになります --------------------------------------------------------- 元のファイル構成は2行目に項目名で、3行目からデータが入っています。 いろいろ調べたのですが、よくわからなかったので教えていただければ 幸いです。 宜しくお願いします。

  • 指定した範囲内が空白なら行削除するマクロ

    エクセルで指定した範囲内(A列からC列まで)で何も文字が入っていなければ(空白)、行を削除する、というマクロを教えてください。 いくつか調べて、以下を試しましたが、何も動作しませんでした。 どなたかアドバイスをいただければ助かります。 よろしくお願いします。 Sub DeleteBlankRows2() Application.ScreenUpdating = False On Error Resume Next With Columns("A:C") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub

  • excel2010マクロ オートフィルター削除

    いつもお世話になります。 excel2010を使っておりますが、下記で原因不明のエラーで困っています。 やりたい事はオートフィルターで抽出された行のみ削除(1列目はタイトルの為 削除対象外) If .SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If ネットで調べまして上記で良いと思うのですが、下記のエラーが出てしまいます。 実行時エラー=438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ユーザーフォームから実行しているのが原因ですかね?? 宜しくお願い致します。

  • Excelのマクロについて教えてください。

    Excelのマクロについて教えてください。 下記のマクロがあります。 With Range("A" & Rows.Count).End(xlUp) .EntireRow.Copy .Offset(1) .Offset(1).EntireRow.SpecialCells(xlCellTypeConstants).ClearContents .Offset(1).Value = .Value + 1 End With 実際にデータが入っているのはA列~E列までで .EntireRow(行全体)ではなく A?:E? と範囲を指定して上記を実行させたいのですが どのように変更するといいでしょうか。 よろしくお願いします。

  • エクセルVBAで表から行の削除

    添付画像のような表があります。 表はB列の名前でソートされています。 D列の比率をみて、100でないものは、必ず同じ名前で複数行にわかれ合計で100になります。この例では名前CとEとHがそうです。 同じ名前が複数行にわかれている場合、最大の比率の行を残し、他の行(例では、埼玉、栃木、長野、新潟の行)を削除したいのです。 複数行にわかれるのが名前CやEのように2行なら、以下のコードで出来ました。 しかし、めったにはありませんが名前Hのような3行以上に分かれるものには対応できません。 どうすればよいでしょうか? Sub test01()   Dim c As Range   Dim Rng As Range   Set Rng = Range(Cells(2, "D"), Cells(Rows.Count, "D").End(xlUp))   For Each c In Rng '2地区の分担の場合、分担比率高い方を残す。(3地区以上は未対応)2012/08/29     If c.Value <> 100 And c.Offset(1).Value <> 100 Then       If c.Offset(, -2).Value = c.Offset(1, -2).Value Then         If c.Value >= c.Offset(1).Value Then           c.Offset(1).Value = False         Else           c.Value = False         End If       End If     End If   Next   If Application.WorksheetFunction.CountIf(Rng, False) > 0 Then     Rng.SpecialCells(xlCellTypeConstants, xlLogical).EntireRow.Delete   End If End Sub

  • Excel VBAにて、SpecialCells(xlCellTypeVisible) に関する質問

    Excel VBAにて、SpecialCells(xlCellTypeVisible) に関する質問です。 セル ("A1:B7")に表があります。 a b 1 1 1 1 2 2 2 2 3 3 3 3 下記のVBAにて、temp2の値が、1となります。これが分かりません。 当方、欲しいのは、オートフィルタ後の見えている行の数です。 temp1=6は、オートフィルタで、選択されたセルs+ヘッダの計6こということで理解しています。 temp3=2は、列の数として、合っています。 Sub Macro1() Dim aa As Range Set aa = Range("A1:B7") aa.AutoFilter Field:=2, Criteria1:="2" temp1 = aa.SpecialCells(xlCellTypeVisible).Cells.Count 'temp1=6 temp2 = aa.SpecialCells(xlCellTypeVisible).Rows.Count 'temp2=1 temp3 = aa.SpecialCells(xlCellTypeVisible).Columns.Count 'temp3=2 End Sub 考え方として、間違ってはいないと思うのですが、行の数を求めるには、どのようにすれば良いでしょうか?

  • エクセルのマクロで意図しない文字が消える

    エクセルのマクロを組んでいて、なぜか実行すると意図しない文字が消えてしまいます 至急解消したいので、どうぞよろしくお願いします N8から、数値が一列に並んでいて、「0」を消して行くという目的です 下記のような組み方をしています すると、P列1行目からAF列まで入っていた文字が消えてしまいます これを解消する方法を教えて下さい '0を消す Const intCriteria As Integer = 0 With Cells(8, 14).CurrentRegion On Error GoTo errhandler .AutoFilter Field:=14, Criteria1:=intCriteria .Offset(1).Resize(.Rows.Count - 1). _ SpecialCells(xlCellTypeVisible).EntireRow.Delete End With ActiveSheet.AutoFilterMode = False Exit Sub errhandler: ActiveSheet.AutoFilterMode = False MsgBox intCriteria & "はありません。"

  • エクセル 最終行からの連続コピー

    エクセルで最終行から上に連続する10行(最終行含む)をコピーしたいです。 途中、空白行が含まれている場合でも、最終行を特定し、コピーできるようにするには、下記のコードにどう手を加えたらよいでしょうか? どなたかアドバイスをお願いします。 Sub Test()   Dim i As Long   Dim j As Integer   Dim rng As Range   With ActiveSheet     'フィルタ     .Range("A1").CurrentRegion.AutoFilter Field:=1          '行選択     With .AutoFilter.Range       For i = .Cells(.Cells.Count).Row To 2 Step -1         If .Rows(i).Hidden = False Then           If rng Is Nothing Then             Set rng = .Rows(i)           Else             Set rng = Union(rng, .Rows(i))           End If           j = j + 1         End If         If j >= 10 Then Exit For       Next i       'コピー       If Not rng Is Nothing Then         rng.Copy Worksheets("Sheet2").Range("A1")         Beep       Else         MsgBox "該当行は存在しません。", 48       End If     End With   End With   Set rng = Nothing なお、コードはこちらを参考にさせていただきました。 http://okwave.jp/qa3552420.html?ans_count_asc=1

  • エクセルVBA実行エラーの対処方法

    以前教えていただいた構文ですが、NOWより過ぎてない日付がFirstRow 31より有り、過ぎた日付がない場合に実行するとエラーが出ます。これを回避するのを教えてください。 宜しくお願いします。 Const DateColumn = "B" '日付が入力されている列 Const FirstRow = 31 '削除の対象となる可能性がある最初の行 Dim LastRow With ActiveSheet LastRow = .Range(DateColumn & Rows.Count).End(xlUp).row If LastRow <= FirstRow Then MsgBox "処理すべきデータがありません。" _ & vbCrLf & "マクロを終了します。" _ , vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With .Range(DateColumn & FirstRow - 1 & ":" & DateColumn & LastRow) _ .AutoFilter Field:=1, Criteria1:="<=" & Now, _ Field:=1, Criteria2:="", Operator:=xlOr .Range(DateColumn & FirstRow & ":" & DateColumn & LastRow) _ .SpecialCells(xlCellTypeVisible).EntireRow.Delete .Cells.AutoFilter End With With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With

専門家に質問してみよう