• ベストアンサー

エクセル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/17068)
回答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

  • Excel VBAの質問です。

    エクセル2010を使用しています。 Excel VBA で二つのシートを比較して合致するレコードの行を削除する方法 値下げ,まとめのシートがありまして、 値下げ:b列に商品コードのデータ まとめ:a列に商品コードのデータ のようなExcelのデータがあります。 ここから、値下げのシートの商品コードを一つ一つ読み込みながら、まとめの商品コードと比較して、合致した値下げの商品コードの行を削除するプログラムを作りたいです。 商品コードのデータ数は毎回違い、値下げとまとめでも商品コードのデータ数は違います。 どなたかご教示いただけないでしょうか? よろしくお願いいたします。

  • エクセルVBA

    エクセル初心者です。 今、下画像上段のようなデータをエクセルで作っています。 内容は売上表みたいなものです。 表のD列とH列に売上があれば、売上金額が入ります。 ただし、両方ともない場合は、D列とH列に金額は入らず 空白になります。 そこで、「D列とH列が両方空白の場合、その行を非表示にする」 というVBAを作りたいのですが、 コードが分からず困ってしまいました。 データ量がかなり多く、今は1行づつ非表示にしているので 時間がかかってしまいます。 完成版は画像下段です。 何かいいコードはあるのでしょうか。 よろしくお願いします。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

  • Excel VBA の質問です

    Excel VBA でやりたいことがあるのですが、自分ではわからず困っています。。 データ例として、画像を添付しました。 実行前は、A列に名前、B列にそれぞれ選手の打点(ただし、最初の行は空白)というデータです。 これを実行後のように(A列、B列という場所は変わらずに)、それぞれの選手の打点平均を空白に算出するコードを教えてほしいです(ただし、各打点の入っていたデータはクリア)。 なお、画像例は「中田」までしか載せてませんが、その下にも続いていてデータ最後まで計算させるということをやりたいです。 ぜひ、ご教授願います。

  • Excel Vba でデータの範囲を知るには?

    Excelを使用していますが、マクロ(VBA)で、シートのデータの範囲を知るにはどうすればよいのでしょうか。  印刷プレビューを行うと、自動的にページ数が求めらていますが、これは、シートのデータの範囲(列及び行の最大値)を判別しているからできるのだと思います。  これを、VBAで行、及び列のMAX値を取得したいのですが、そのメソッド(プロパティ)を知りたいのです。  どなたかご教授ください。

  • エクセル非表示VBA

    こんばんわ。 エクセル初心者で勉強中です。 今下記画像のようなデータをエクセル2007で作成しています。 データは2行目から1000行目位まであるとします。 そこで質問なのですが、黄色の行のように その行のすべてのセルの値が空白の場合、行を 非表示にしていくコードはあるのでしょうか。 現在目視で非表示にしているので、できればVBAで素早くしたいのですが。 よろしくお願いします。

  • Excel VBAのカウントについて

    Excel2003で表を作成しています。 画像のような表を作成しているのですが、 左のデータから右の表に数を入力するのに、VBAで出来ないでしょうか? COUNTIFを使おうと思ったのですが、COUNTの条件が3つありますし、 左のABCの列は500行くらいデータが入っているので出来ればVBAで出来たらと思いました。

  • Excel VBAでデータを自動処理したい

    Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか? どなたかお知恵をお貸しください。 (1)A、B、C列からなるリストがあります。A,B列にはそれぞれオートフィルタが設定してあり、C列は空白です。A列、B列にそれぞれ条件を設定し、抽出したデータのC列(空白)に特定のデータを入力します。A列、B列2つの条件の組み合わせが100通りくらいあり、現在手動でオートフィルタを設定し、C列にデータを入力しております。例えばA,B列の条件の組み合わせと、それに対応するC列に入力するデータを表にしたテーブルを別に作り、A,B列の条件を自動に設定して、抽出し、C列にデータを自動に入力することを、テーブルの一番上の行から最後の行まで繰り返す、というようなことをVBAでExcelにしてもらいたいのです。自分でちゃんと勉強し、調べて、それでも分からなかったらお聞きするというのが筋だと思うのですが、今この仕事に追われて、時間がありません。(ほとんど毎日午前様です。)この仕事が片付いたら、じっくりVBAを勉強したいと思っております。どうぞよろしくお願いいたします。

  • Excelの集計で65000行のデータが?

    Excelの集計で65000行のデータが? 時々、100行位の表の集計で約65000行のデータが出来てしまい、(Ctrl+End を押すと65***行に飛びます)ファイル容量が60Kが20M位になってしまいます。 集計の時に表データの範囲指定をしなくても自動的に範囲指定してくれるはづなのに、自動ではダメな時があるのでしょうか? 後の修復作業ですが、空白のいらない行を削除しても変わらず、範囲指定のコピーをして別のシートに貼りましたが、もっと簡単な方法はありませんでしょうか?

  • EXCEL VBA 行のコピー

    お世話になります。 添付の表1のデータがあるのですが、これをボタンが押されたら自動で表2のようにしたいのです。 やりたい事・・・ 表1のA3から最下行までREADして品番(A??)と品名(B??)の空白セルを埋めたいのです。(表2黄色部分)各商品は最低でもデータ行が1行あり、各商品の行数は可変です。 最大でも10行程度だと思います。 どなたかご教授いただけますでしょうか? よろしくお願い致します。 環境 Windows XP SP3 Excel2003

専門家に質問してみよう