• ベストアンサー

エクセルVBAで質問です。

エクセルVBAで質問です。 不用な空白行を削除したいのですが、どのようにコードを書いたらいいでしょうか? 添付の画像のような表を作っています。 添付のではAAからGGまでデータが入っていますが、いつもデータ数は違います。ただし20行目 より多くなることはありません。データ範囲の5行目から20行目まででおさまります。 このような条件で、データのない空白行を自動で削除するようにしたいと考えています。 よろしくお願いします

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.6

・データは必ず上から順番に入力されている(途中に空行はない) ・“データあり”の行はA列に必ずデータがある と、言う条件なら、A列にだけ注目してこんな感じで。 Sub Sample()   nRow = Range("A21").End(xlUp).Row + 1   If (nRow <= 20) And (nRow > 5) Then     Rows(nRow & ":20").Delete Shift:=xlUp   End If End Sub

4k3s4r3
質問者

お礼

ありがとうございました。 実行結果がかなり早くコードも短くすごく良かったです。ありがとうこざいました。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

#3,4の回答者です。 よくある話ですが、たぶん、「不用な空白行」の意味が違っているのでしょうね。空白というのは、VBAでは、空白というのはEmpty のことで、何もないということです。そういう所で意味が違ってしまっているから、出来ないはずです。少なくとも、前回の私のVBAコードでは永久的に出来ません。 質問の段階で、こちらもできると思うから回答しているわけです。そうでなければ、回答などしません。 あまり、とやかくいうつもりはありませんが、結局、他人任せでは本当の解決しないことが多いのではないかと思います。初心者でもないのですから、ご自身でもある程度考えてみるべきだと思います。 '// Sub Test2()  Dim rng As Range  Dim delRng As Range  Dim c As Variant  Set rng = Range("A5:E120")  On Error GoTo ErrHandler  Application.ScreenUpdating = False  For Each c In rng.Columns(1).Cells   If Len(Replace(c.Value, Space(1), "", , , 1)) = 0 Then    If delRng Is Nothing Then     Set delRng = c.Resize(, rng.Columns.Count)    Else     Set delRng = Union(delRng, c.Resize(, rng.Columns.Count))    End If   End If  Next  Application.ScreenUpdating = True  With delRng   .Select   '--開始--邪魔だったら、ここは省く   If .Areas.Count = 1 Then    If MsgBox("既に空白は削除されていますが、実行しますか", vbQuestion + vbYesNo) = vbNo Then     GoTo ErrHandler    End If   End If   '--終了--   If MsgBox("選択された部分を削除します。", vbQuestion + vbOKCancel) = vbOK Then    Application.Calculation = xlCalculationManual    Application.ScreenUpdating = False    .Delete (xlShiftUp)    Application.ScreenUpdating = True    Application.Calculation = xlCalculationAutomatic   End If  End With ErrHandler:  If Err.Number > 0 Then    MsgBox Err.Number & ": " & Err.Description  End If  rng.Cells(1).Select End Sub 'なお、一行ずつ削除すれば遅いのは当たり前です。 '行全体は削除しません。.Resize(, rng.Columns.Count) 行全体なら、.EntireRow に替える。 '対話型が邪魔なら全て削除してください。分からない話にならないように、削除する部分を見えるようにさせました。

4k3s4r3
質問者

お礼

ありがとうございました。できました。 ただ私なりにやった結果質問に来たわけですし、決め付けは心外ですし、VBAでは云々と仰られても勉強の浅い私には説明のし様がありません。私なりに画像もつけ、説明も誤解のないように文言に気おつけて書いたつもりです。

回答No.7

ん? コードの記載ミスしてませんか? ワタシの環境だときちんと削除されますよ!

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

補足要求。 >添付のではAAからGGまでデータが入っていますが 添付画像では、そうではないようだが。A列からE列までが見えている。 >いつもデータ数は違います。ただし20行目 データのある行数のことか?当たり前のことでは。 >データ範囲の5行目から20行目まででおさまります データ範囲内とは。エクセルは、主に、途中に空白行のないデータのかたまりを扱います。わざわざ書いた意味は? >このような条件で、データのない空白行を自動で削除するようにしたいと 「>このような条件」が良くわからない。 ーー データの終わりの次は空白セルばかりでないのか。 データ行 空白行(複数行)<--A データ行 空白行(複数行)<--B ・・ 最終行 のようになっているのか。 上記のようなA,B・・の部分を削除したいのか。 データのある列はA列から何処列までか

4k3s4r3
質問者

補足

>添付のではAAからGGまでデータが入っていますが 添付画像では、そうではないようだが。A列からE列までが見えている。 ■AA、GGは入力している文字列です >いつもデータ数は違います。ただし20行目 データのある行数のことか?当たり前のことでは。 ■当たり前ではないと思います。行数のことです。何行かは固定ではないということです >データ範囲の5行目から20行目まででおさまります データ範囲内とは。エクセルは、主に、途中に空白行のないデータのかたまりを扱います。わざわざ書いた意味は? ■何らかのA列からE列までで行に何らかの入力があればその行は削除の対象にしたくないということです。 >このような条件で、データのない空白行を自動で削除するようにしたいと 「>このような条件」が良くわからない。 ーー ■このような条件とはそれまで書いた条件ということです。 データの終わりの次は空白セルばかりでないのか。 データ行 空白行(複数行)<--A データ行 空白行(複数行)<--B ・・ 最終行 のようになっているのか。 ■意味がわかりません・・・ 上記のようなA,B・・の部分を削除したいのか。 データのある列はA列から何処列までか ■画像を載せてあるようにAからE列です

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3の回答者です。 >データ範囲の5行目から20行目まででおさまります あくまでも、20行目という条件で書かれているのであって、それ以外では、うまく行きません。 >Set rng = Range("A5:E129")としてますが・・・ こちらは、削除する全体の範囲を入れるとは書いていません。5~20行なら、現行の方法では、その範囲を129行まで16行ずつ増やしていくしかありません。20行目以降の先がみえているわけではありません。 結果的に129行をどういう状態にしたいのか分かりません。そのような設定にしても、絶対にできるとは思いません。正しく削除する行を選択できれば、一発で消えます。こちらにマクロに必要な情報を正しく伝えていれば、正しく回答はできるますが、それを伝えていなけば、たぷん無理です。いずれかやっていれば当たるかもしれませんが、そこまでは出来ません。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

たぶん、連続してマクロを使うものだと思いますが、もしそうなら、  Set rng = Range("A5:E20") この部分を換えてください。 '// Sub DeleteRow() Dim r As Range Dim rng As Range  Set rng = Range("A5:E20")  On Error Resume Next  With rng  Set r = .SpecialCells(xlCellTypeBlanks)  If r Is Nothing Then Exit Sub  On Error GoTo 0   r.Delete   .Cells(1).Select  End With End Sub

4k3s4r3
質問者

お礼

こんばんは。ありがとうございました。 ためさせていただいたのですが、残ってしまう行が出てきてしまいます。 129行まであるので、Set rng = Range("A5:E129")としてますが・・・

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 A5:A20の該当セルが空白の場合、行削除します。 Sub sample() For i = 20 To 5 Step -1 If Cells(i, "A") = "" Then Rows(i).Delete Next End Sub

4k3s4r3
質問者

お礼

こんばんは。No.1の方に間違えてmu2011さんにする御礼コメントを書いてしまいました。。。 うまくいったのですが、時間がかなりかかってしまってます。データ範囲を拡張していくと129行ぐらいありまして・・・

4k3s4r3
質問者

補足

補足させていただきます。 “データあり”の行はA列に年月日は必ずありますが、あとの列の項目には空白のセルもあります。

回答No.1

Sub 削除() Dim c As Range Dim 開始行 As Long Dim 最終行 As Long 開始行 = 5 最終行 = Range("a65536").End(xlUp).Row For Each c In Range("a" & 開始行 & ":a" & 最終行) If c.Value = "" Then Rows(c.Row).Delete End If Next End Sub

4k3s4r3
質問者

お礼

こんばんは。ご提示ありがとうございました。うまくいきました! ただデータ範囲を拡張していくと遅くなってしまいかなり時間がかかってしまいました・・・ 実際129行ぐらいありまして・・・

4k3s4r3
質問者

補足

申し訳ございません。No.2の方にお礼するのと間違えてしまいました・・・ スミマセン。 マクロためさせていただいたのですが、削除されずに行が残ってしまいます。 私の説明不足でしょうか・・・

関連するQ&A