• 締切済み

VBAで空白行を削除する

VBAでリストの空白行を削除するための適当なコードを探しているのですがどんぴしゃのものが中々見つかりません。ご教授下さい。 ブックBのシートBのリストにはA2~AN●まで値が入っています。 別のブックAからVBAで値を取り出し貼り付けています。 いくつかの方法を試しました。 (1)ブックを開いたときに空白行を削除 Sub Auto_Open() '空白行を削除 Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True End Sub 5分以上砂時計のままで結局終わりません。 強制終了させ再度ブックを開くと空白行は削除されているのですが、こんな動作では使うことができません。 (2)ブックAの値を貼り付けた後、空白行を削除し上書き保存する Sub エクスポート() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Range(Cells(5, 7), Cells(79, 46)).Select Selection.Copy 'コピー Workbooks.Open Filename:="\\パス\ブックB.xlsm" '貼り付け先ファイルオープン Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '貼り付け Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True  '空白行を削除 ActiveWorkbook.Save '上書き保存 Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub (3)空白行を削除の部分は以下のコードも試しました Worksheets("SheetB").Range("A1").Select Set currentCell = Worksheets("sheetB").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If Not IsEmpty(currentCell) Then 'カレントセルが空白でなく、 If IsEmpty(nextCell) Then '次のセルが空白のとき nextCell.EntireRow.Delete End If End If Set currentCell = currentCell.Offset(1, 0) Loop '空白行削除 宜しくお願い致します。

みんなの回答

回答No.4

空白行の範囲選択をする前に、 With ActiveSheet'←できれば、Workbooks("Book1").Worksheets("Sheet1")とかのほうが… lRow = .Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If .Range("A" & i) = "" Then .Range("A" & i) = "" End If Next i End With これで、見た目空白なら、空白にしています。 元のプログラムを拝借しました(笑 これを、空白行選択する前にやれば 上手くいくかと思います^^

回答No.3

追記です。 http://veaba.keemoosoft.com/2012/12/376/ すみません。空白行が無かった場合にエラーが出ます。 例) On Error Resume Next Range("A1:A10").SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete On Error GoTo 0 このようにしたら、エラーは出ないと思います。

oimoita
質問者

補足

たびたびご回答ありがとうございます。 ご指摘の点を直したのですが、うまくいかず 試しに空白セルを一度選択して数式と値のクリアをしてからマクロを実行すると削除してくれました。 コピー元では対象セルに =IF(Z6="","",Z6) のようなIF関数を入れているのですが 関数の結果が""で空白の場合にコピー先で値と認識されているのではと思いました。 どのように直せばいいのでしょうか? たびたびの補足で申し訳ありませんが宜しくお願い致します。

回答No.2

ブックA,ブックB等しっかり選択されていないのかな?と思います。 例) With Workbook("ブックA.xls").Worksheets("Sheet1") .select 'ブックAのSheet1をselectします。     .Range("A1")=”テスト” 'ブックAのSheet1のA1にテストと入力します。 End with ブック間で色々やる場合、 単に「Range」と記入してしまうと ブックAなのか、ブックBなのか。判断できなくなり 違うブックで動作してしまっていたりすることが良くあります。 しっかり、ブックAですよ~、Bですよ~としてあげることが一番かもしれません。 (もしかしたら私が言っていることは違うかもしれませんが…) Withでやるのが面倒だという場合は、 Workbook("ブックB.xls").Activeと入力したり Workbook("ブックB.xls").selectと入力したりすれば解決するかと思います。

回答No.1

例) Range("A1:A10").SpecialCells(xlCellTypeBlanks).Select こうすると、空白セルを選択することができます。 そして、 Selection.EntireRow.Delete で、選択したセルの行を削除…というのが早いかもしれません。

oimoita
質問者

補足

ご回答ありがとうございます。 On Error Resume Next Range("A2:A60000").SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete On Error GoTo 0 'A列から空白行を探し出しその列全体を削除ぶkk 上記のコードをブックBで実行したところうまくいきました。 ところがブックAに以下のように記述し実行したところ削除されませんでした。 どこか悪いのでしょうか? Sub エクスポート() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Range(Cells(5, 7), Cells(79, 46)).Select Selection.Copy 'ブックAの指定の範囲をコピー Workbooks.Open Filename:="\\●●~パス~●●\ブックB.xlsm" '貼り付け先ファイルオープン Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 'ブックBのシートBに値を貼り付け   On Error Resume Next   Range("A2:A60000").SpecialCells(xlCellTypeBlanks).Select   Selection.EntireRow.Delete   On Error GoTo 0 'ブックBのシートBのA列から空白行を探し出しその列全体を削除 ActiveWorkbook.Save '上書き保存 Windows("ブックA.xlsm").Activate Range("B5").Select                  'ブックAに戻りB5をアクティブにする Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub お忙しいところ恐縮ですが宜しくお願いします。

関連するQ&A

  • VBAで空白行を削除する。

    初めまして、VBA初心やです。なので具体的にご教授願います。環境WindoesXP SP3 EXCEL2010です。やりたい事Book1に空白行が沢山あるSheetが一枚あります。Sheetの中身は下記の通りです。 一行目に項目があります。n行目にも項目があります。nは、10個です。項目の下の行には、デターがあります。以下のようになっております。初めの位置はB2です。    B2    項目A 項目B 項目C 項目D・・・・・    項番1 データ1 データ2 データ3 データ4・・・・・・    項番2 データ1 データ2 データ3 データ4・・・・・・    項番3 データ1 空白  データ3 データ4・・・・・・    項番4 データ1 データ2  空白 データ4・・・・・・    項番5 データ1 データ2  空白 空白・・・・・・    項番6 データ1 データ2  空白 空白・・・・・・ 項番7 データ1 データ2  空白 空白・・・・・・ 項番8 空白   空白   空白 空白・・・・・・ ・    ・ ・     ・   ・     Bn    項目A 項目B 項目C 項目D・・・・・ 項番1 データ1 データ2 データ3 データ4・・・・・・ と続きます。この項番1は残して、項番8の様な空白セルが続く行だけ削除したいので、 以下のマクロを組みました。 Dim ii As Long Dim MaxRow(1 To 100) As Long Dim MaxCol As Long '============================ MaxRow(1) = Cells(Rows.Count, 2).End(xlUp).Row MaxRow(2) = Cells(Rows.Count, 21).End(xlUp).Row MaxRow(3) = Cells(Rows.Count, 22).End(xlUp).Row MaxRow(4) = Cells(Rows.Count, 23).End(xlUp).Row MaxCol = Range("IV4").End(xlToLeft).Column Application.ScreenUpdating = False '============================ For i = MaxRow(1) To 3 Step -1 '配列にした。 '============================ For j = 1 To MaxCol Step 1 '============================ If Cells(4, j).Value = "" Then GoTo Label22 'Else GoTo Label11 Label22: Range(4 & ":" & MaxCol).Delete Label11: Next j 'End If Next i Application.ScreenUpdating = True MsgBox "マクロが終了しました" End Sub しかし、ソートしてMaxRowの配列のいくつになるかを計算する処が判りません。 なので、空白行を削除できません。 ようするに、各項目(行)の空白セルがまちまちで(凹凸があり)、全ての項目が空白である処を探す事が出来ません。 何卒宜しくご教授願います。

  • Excelの空白行を上に詰めるVBAについて

    Excelにて特定の列のみの空白を上に詰めるVBAを組んだのですが、 全ての列に適用してしまって困っております。 Sub 空白を上に詰める() Dim Lrow, i As Long Dim myRange As Range Lrow = Range("AH65536").End(xlUp).Row Set myRange = Rows(Lrow + 1) For i = 1 To Lrow If Cells(i, 34) = "" Then Set myRange = Union(myRange, Rows(i)) End If Next i myRange.Delete End Sub 上記のように「AH」列にのみ適用するように組みましたが、 うまくいきません。 VBAは初心者レベルです。 VBAにお詳しい方のご意見をお聞かせ願えますでしょうか。 宜しくお願い致しますm(_ _)m

  • 条件に合った行を削除するマクロについて

    こんにちは 今、現在、とある条件にあった行を削除するマクロ作っているのですが、 インターネットを調べてみると後ろから探索して、1行ずつ消していくのがいいと書いてありました。 まぁ、その理屈はわかるんですが、それなら 「Unionでセルの範囲を結合してから、最後に一度に消してしまった方が速いのでは」 (消す作業が1度だけで済むから) と思い試してみたんですが、実際試したところ・・・ ものすごく遅かったです。 (ちなみに、1万件のデータで削除した行数は6000ほどでした) 何故Union結合だと遅いのでしょうか? 速いマクロを作成するには、やはり後ろから探索して、1行ずつ消していくしかないのでしょうか? 以下は試したマクロです。 (test が unionで試したマクロ、test2が後ろから1行ずつ削除したマクロ) Option Explicit Public Sub test() Dim r As Range Dim r1 As Range 'Cells.Replace "-", " " For Each r In Range("A2", Range("A65536").End(xlUp)) If r = r.Offset(1, 0) And r.Offset(0, 1) < r.Offset(1, 1) Then If r1 Is Nothing Then Set r1 = r Else Set r1 = Union(r1, r) End If End If Next r1.EntireRow.Delete ' r1.Select End Sub Public Sub test2() Dim r As Range Dim r1 As Range Dim i As Integer 'Cells.Replace "-", " " Application.ScreenUpdating = False For i = Range("A65536").End(xlUp).Row To 1 Step -1 If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) < Cells(i + 1, 2) Then Cells(i, 1).EntireRow.Delete End If Next Application.ScreenUpdating = True End Sub

  • VBAで削除を早くしたいのですが…

    Excel2007のVBAです。キー記録を眺めながら四苦八苦しております。 数千行あるデータで、A列が"d"以外の行を削除したいのですが PCスペックが低いせいか、時間がかかってしまいます。 簡単に効率化することは可能でしょうか? よろしくお願いします。 ※1行目はタイトル列、全体行数は可変です。 Sub A05_A列がd以外は削除する() Application.ScreenUpdating = False Dim sh2 As Worksheet Set sh2 = Worksheets("削list") For i = Cells(Rows.Count, "C").End(xlUp).Row To 2 Step -1 If sh2.Cells(i, "A").Value <> "d" Then Rows(i).Delete End If Next Application.ScreenUpdating = True End Sub

  • VBA一定の範囲内からデータが入っている行を検索

    現在VBAにて作成中です。 内容は、各シートの全く同じ範囲内から1シートへ自動で貼り付けを行い日付順に並べ替えるということです。 各シートは全て同じ表になっていますので、コピー範囲のセル番地は全シート同じです。 コピー範囲は、BF4:BM81で、BF4に日付が入っています。 81行までありますが、82行には、合計行が入っていることや、その下行もデータが入っている為、範囲指定をしています。また、81行設けていますが、上から順にデータは入っているものの、81行まで全て埋まっているとは限りません。 その為、下記のVBAにすると、各シートの81行までのデータが反映され1シートに全てのシート分が貼り付けられるので、かなりの行数になり、空白や0の行が出てしまいます。 範囲内から日付(列BF)のデータが入っている行までを検索し選択、貼り付けを行えるようにしたいと思っています。 どなたかご教授頂ければと思いますのでよろしくお願い致します。 見よう見まねで下記を作成しました。 Sub matome() Dim i As Integer Dim lRow As Long, lCol As Long, lRow4 As Long Application.ScreenUpdating = False '----全データシートの有無をチェックします sh_check '----列見出しをコピーします Worksheets(2).Range("bf1:bm3").Copy Worksheets(1).Range("A1") For i = 2 To Worksheets.Count With Worksheets(i) 左上 = "Bf4" 右下 = "bm81" 範囲 = 左上 & ":" & 右下 lRow = .Cells(Rows.Count, 1).End(xlUp).Row lCol = .Cells(58, Columns.Count).End(xlToLeft).Column '----シートのデータが4行以上の場合にコピーします If lRow >= 4 Then lRow4 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 .Activate Range(範囲).Select Selection.Copy Worksheets(1).Cells(lRow4, 1).PasteSpecial Paste:=xlPasteValues End If End With Next i End Sub 説明に不足がありましたら、追って書き込みさせていただきます。

  • 重複行削除のマクロ

    重複行を削除するマクロを作っていますが、うまくいきません。 2行目にタイトルが入っていて、3行目以降が必要なデータになります。 この中でA列が一致しているデータ行を削除したいと考えており、 重複データが削除された後、タイトル行がなぜか一番下の行にはりついてしまいます。 どなたか詳しい方助けてください!!!よろしくお願いします。 ちなみに以下が現在使用しているVBAコードです。 =============================================================== Sub GoodRemoveDuplicates() 'A列にデータが入力されており、そのデータを並べ替えた後、 '重複するデータが含まれている行を削除するマクロ Worksheets("貼り付け用用マクロ").Range("A1").Sort _ key1:=Worksheets("貼り付け用用マクロ").Range("A1") Set currentCell = Worksheets("貼り付け用用マクロ").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCell Loop End Sub ===============================================================

  • エクセルVBAの別sheetの空白行削除について

    エクセルVBAでBOOK1のsheet1とsheet2とsheet3があり、 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめるようにしました。 マクロを実行するには、Visual Basicを開いてF5を押しています。 それをsheet1かsheet2の中身の一部分でも変更すると そのときに自動的にマクロが実行されるようにしたいです。 sheet1とsheet2(sheet3は空白のまま)に Private Sub Worksheet_Change(ByVal Target As Range) Call マクロ() End Sub を入れ、 次に、標準モジュールに Sub マクロ() '下記よりsheet1とsheet2の内容をsheet3にコピーする Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") Worksheets("sheet2").Range("C1:BE100").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C51:BE150") '下記より上記sheet3の状態から余分な空白行を削除する Dim UsedCell As Range Dim Max_Row, RowCount As Integer Set UsedCell = ActiveSheet.UsedRange Max_Row = UsedCell.Cells(UsedCell.Count).Row Application.ScreenUpdating = False For RowCount = Max_Row To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(RowCount)) = 0 Then Rows(RowCount).Delete End If Next Application.ScreenUpdating = True End Sub をやって、sheet1かsheet2のセルを変更すると エクセルが固まってしまいます。 デバックでは Rows(RowCount).Delete がよくないようです。 書き方が間違っているのでしょうか?

  • 空白行を削除するマクロ

    空白行を削除するマクロについて質問です。 「Aが空白の場合」ではなく「A~Lセルすべてが空白の場合」に行を削除したいです。 下記のマクロでは、Aが空白の場合に行がすべて削除されてしまいます。 Aが空白でも、BやLに数字や文字があれば、その行は残るようにしたいです。 このマクロをどう変化させれば、うまく作業が実行されますか? マクロは初心者です。よろしくお願いいたします。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ sub macro1()  dim s as long  dim e as long  dim r as long  s = 5  e = range("A65536").end(xlup).row  for r = e to s step -1   if application.trim(cells(r, "A")) = "" then    cells(r, "A").entirerow.delete shift:=xlshiftup   end if  next r end sub

  • エクセルの行の削除を配列で高速化したい

    A列にID番号(012345等の文字列化した数字) B列に属性(A、B、C等の文字列) C列に数値  のようなデータがあります。 1行目はタイトル行です。 最優先されるキーをA列、2番目に優先されるキーをB列にして並べ替えてあります。 A列、B列のデータは重複するものがあります。 このデータを、 A列のID番号が同じだった場合、上の属性がA、次の行の属性がBの組み合わせだった場合のみ、下の行のC列の数値データを上の行のC列の数値に加算して、下の行を削除します。 以下のマクロを書き、うまくいきました。 Sub 集計() Dim i As Long, r As Long r = Cells(65536, 1).End(xlUp).Row Application.ScreenUpdating = False For i = r To 2 Step (-1) If Cells(i, 1) = Cells(i - 1, 1) Then If Cells(i, 2) = "B" And Cells(i - 1, 2) = "A" Then Cells(i - 1, 3) = Cells(i - 1, 3) + Cells(i, 3) Rows(i).Delete End If End If Next Application.ScreenUpdating = False End Sub しかし、データ数が多いので1分以上かかってしまいます。 多分、配列に取り込んで処理できれば飛躍的に高速化できるとは思うのですが、 V = Range(Cells(2, 1), Cells(r, 3)).Value と取り込んだあと、どう処理したらいいのかわかりません。 教えてください。

  • E列が空白のとき、その空白行を削除し、番号を振り直す

    windows7 Excel2003でマクロ勉強中です。 あるサイトにE列が空白のとき、その空白行を削除し、番号を振り直すという コードがありました。 自分で作った表(表の最上段の2行は項目名が入っています。)で  実行すると「Rangeメソッドは失敗しました。Globalオブジェクト」と エラーが出ます。エラーはでますが、処理自体は正しく実行されます。 このエラーの原因と回避するにはどうしたらよろしいでしょうか。 Sub E列が空白のとき、その空白行を削除し、番号を振り直す() Dim i As Long, j As Long '行削除の処理 For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 If Range("A" & i).Value <> "" And IsNumeric(Range("A" & i).Value) = True Then If Range("E" & i).Value = "" Then Rows(i).Delete End If End If Next '番号振りなおし処理 '’’Range("A" & Rows.Count).End(xlUp).Offset(1).Select For i = 0 To Range("A" & Rows.Count).End(xlUp).Row If Range("A" & i).Value = "番号" Then j = 1 ・・・・・ここでエラー発生 If Range("A" & i).Value <> "" And IsNumeric(Range("A" & i).Value) = True Then Range("A" & i).Value = j j = j + 1 End If Next ActiveSheet.Protect End Sub

専門家に質問してみよう