- ベストアンサー
エクセルVBAで質問です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
・データは必ず上から順番に入力されている(途中に空行はない) ・“データあり”の行は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
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
#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 に替える。 '対話型が邪魔なら全て削除してください。分からない話にならないように、削除する部分を見えるようにさせました。
お礼
ありがとうございました。できました。 ただ私なりにやった結果質問に来たわけですし、決め付けは心外ですし、VBAでは云々と仰られても勉強の浅い私には説明のし様がありません。私なりに画像もつけ、説明も誤解のないように文言に気おつけて書いたつもりです。
- aloha88600
- ベストアンサー率17% (10/58)
ん? コードの記載ミスしてませんか? ワタシの環境だときちんと削除されますよ!
- imogasi
- ベストアンサー率27% (4737/17070)
補足要求。 >添付のではAAからGGまでデータが入っていますが 添付画像では、そうではないようだが。A列からE列までが見えている。 >いつもデータ数は違います。ただし20行目 データのある行数のことか?当たり前のことでは。 >データ範囲の5行目から20行目まででおさまります データ範囲内とは。エクセルは、主に、途中に空白行のないデータのかたまりを扱います。わざわざ書いた意味は? >このような条件で、データのない空白行を自動で削除するようにしたいと 「>このような条件」が良くわからない。 ーー データの終わりの次は空白セルばかりでないのか。 データ行 空白行(複数行)<--A データ行 空白行(複数行)<--B ・・ 最終行 のようになっているのか。 上記のようなA,B・・の部分を削除したいのか。 データのある列はA列から何処列までか
補足
>添付のではAAからGGまでデータが入っていますが 添付画像では、そうではないようだが。A列からE列までが見えている。 ■AA、GGは入力している文字列です >いつもデータ数は違います。ただし20行目 データのある行数のことか?当たり前のことでは。 ■当たり前ではないと思います。行数のことです。何行かは固定ではないということです >データ範囲の5行目から20行目まででおさまります データ範囲内とは。エクセルは、主に、途中に空白行のないデータのかたまりを扱います。わざわざ書いた意味は? ■何らかのA列からE列までで行に何らかの入力があればその行は削除の対象にしたくないということです。 >このような条件で、データのない空白行を自動で削除するようにしたいと 「>このような条件」が良くわからない。 ーー ■このような条件とはそれまで書いた条件ということです。 データの終わりの次は空白セルばかりでないのか。 データ行 空白行(複数行)<--A データ行 空白行(複数行)<--B ・・ 最終行 のようになっているのか。 ■意味がわかりません・・・ 上記のようなA,B・・の部分を削除したいのか。 データのある列はA列から何処列までか ■画像を載せてあるようにAからE列です
- Wendy02
- ベストアンサー率57% (3570/6232)
#3の回答者です。 >データ範囲の5行目から20行目まででおさまります あくまでも、20行目という条件で書かれているのであって、それ以外では、うまく行きません。 >Set rng = Range("A5:E129")としてますが・・・ こちらは、削除する全体の範囲を入れるとは書いていません。5~20行なら、現行の方法では、その範囲を129行まで16行ずつ増やしていくしかありません。20行目以降の先がみえているわけではありません。 結果的に129行をどういう状態にしたいのか分かりません。そのような設定にしても、絶対にできるとは思いません。正しく削除する行を選択できれば、一発で消えます。こちらにマクロに必要な情報を正しく伝えていれば、正しく回答はできるますが、それを伝えていなけば、たぷん無理です。いずれかやっていれば当たるかもしれませんが、そこまでは出来ません。
- Wendy02
- ベストアンサー率57% (3570/6232)
たぶん、連続してマクロを使うものだと思いますが、もしそうなら、 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
お礼
こんばんは。ありがとうございました。 ためさせていただいたのですが、残ってしまう行が出てきてしまいます。 129行まであるので、Set rng = Range("A5:E129")としてますが・・・
- mu2011
- ベストアンサー率38% (1910/4994)
一例です。 A5:A20の該当セルが空白の場合、行削除します。 Sub sample() For i = 20 To 5 Step -1 If Cells(i, "A") = "" Then Rows(i).Delete Next End Sub
お礼
こんばんは。No.1の方に間違えてmu2011さんにする御礼コメントを書いてしまいました。。。 うまくいったのですが、時間がかなりかかってしまってます。データ範囲を拡張していくと129行ぐらいありまして・・・
補足
補足させていただきます。 “データあり”の行はA列に年月日は必ずありますが、あとの列の項目には空白のセルもあります。
- aloha88600
- ベストアンサー率17% (10/58)
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
お礼
こんばんは。ご提示ありがとうございました。うまくいきました! ただデータ範囲を拡張していくと遅くなってしまいかなり時間がかかってしまいました・・・ 実際129行ぐらいありまして・・・
補足
申し訳ございません。No.2の方にお礼するのと間違えてしまいました・・・ スミマセン。 マクロためさせていただいたのですが、削除されずに行が残ってしまいます。 私の説明不足でしょうか・・・
お礼
ありがとうございました。 実行結果がかなり早くコードも短くすごく良かったです。ありがとうこざいました。