• ベストアンサー

エクセルの行を削除したい。

VBAを使用して以下の処理をしたいと思ってます。 セルの中が小計ならば、小計行を含めて5行削除するっと言う処理を最終行まで繰り返したいんですが、上手く行きません。 よろしくお願いします。

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

  • ベストアンサー
回答No.5

訂正です (誤)' 1行ごっそりとデータがないとか、1列ごっそりデータがないと仮定しています (正)' 1行ごっそりとデータがないとか、1列ごっそりデータがないとそこで対象から外れると仮定しています

noname#143014
質問者

お礼

ありがとうございます。 削除できました。 回答が遅くなってすみません。 諸事情ありまして、閲覧は出来るのですが書き込みが出来ないパソコンを使ってまして、携帯からなので言葉少なく、お礼が短文ですみません。

すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.6

解決できてよかったです。

すると、全ての回答が全文表示されます。
回答No.4

こんにちは。 基本的に「すぐに回答ほしいです」であるなら回答がつき次第、すぐにレスポンスするのが マナーだと思っています。 私の前回の考え方をコードにするとこうなります。 コピペでは動かないでしょう。条件を合わせてください。 行は下から消さず、一度に消し去っています。 行の削除はExcelにとって重い処理なので、(ループで)何度もやらない方がいいからです。 「アクティブセル領域」とかわからない言葉はネットで調べたり、Excelのヘルプで調べられると思います。 「CurrentRegion」が使えるようになるととっても便利です。 「Cells(Rows.Count).End(xlUp)」などというくだらない表現を使わないで済みます。 逆に「CurrentRegion」が使えるようにシートのデータ配置構造を考えて作れるようになります。 Option Explicit Sub test() Dim WS As Worksheet Dim MyR As Range Dim DelRng As Range Dim MyC As Range Set WS = ActiveSheet ' アクティブなシートを対象としています ' データ領域はA1から、ところどころ虫食い状態は許せても ' 1行ごっそりとデータがないとか、1列ごっそりデータがないと仮定しています Set MyR = WS.Range("A1").CurrentRegion WS.AutoFilterMode = False ' たとえオートフィルタがかかっていても解除します MyR.AutoFilter Field:=1, Criteria1:="小計" ' 1列目に「小計」が入っているとしています ' 1列目は項目行だとして1列目を対象からはずします。可視セルを取り出します Set DelRng = MyR.Resize(MyR.Rows.Count - 1, 1).Offset(1).SpecialCells(xlCellTypeVisible) WS.AutoFilterMode = False ' オートフィルタを解除します For Each MyC In DelRng ' 対象範囲のすぐ右の列を使って「小計」のある行を含めて下に5行「1」を書き込みます MyC.Resize(5).Offset(, MyR.Columns.Count).Value = 1 Next Set MyR = WS.Range("A1").CurrentRegion ' 再度A1セルのアクティブセル領域を対象とします MyR.AutoFilter Field:=MyR.Columns.Count, Criteria1:=1 ' 「1」を書き込んだ行を取り出します ' 1列目は項目行だとして1列目を対象からはずし、可視セルを含む行を取り出します Set DelRng = MyR.Resize(MyR.Rows.Count - 1, 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow WS.AutoFilterMode = False ' オートフィルタを解除します DelRng.Select ' 実際はここを「DelRng.Delete」に変えてください End Sub

すると、全ての回答が全文表示されます。
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.3

Sub sample() Dim target As Range Dim rng As Range Set target = Cells '"小計"を探す範囲(カレントシート全て) Do Set rng = target.Find("小計", LookIn:=xlValues, LookAt:=xlWhole) If rng Is Nothing Then Exit Do rng.Resize(5, 1).EntireRow.Delete '削除 Loop End Sub "小計"を探す範囲を必要に応じて >Set target = Cells '"小計"を探す範囲(カレントシート全て) を Set target = Columns("B") 'B列 Set target = Sheets("Sheet2").Columns("C") 'Sheet2のC列 とかに変えてください。 削除でなくデータを消すだけなら >rng.Resize(5, 1).EntireRow.Delete '削除 を target.Resize(5, 0).EntireRow.ClearContents '削除でなくクリアの場合(書式を残す場合) target.Resize(5, 0).EntireRow.Clears '削除でなくクリアの場合(全部消す場合) に変えてください。

noname#143014
質問者

お礼

きちんと処理は進むけど行が削除されません。 コピペしたので間違いないと思うんですが。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • kazne
  • ベストアンサー率66% (8/12)
回答No.2

差し支えなければ、コードの開示をお願いします。 無理だった事を想定して、参考コードを書いておきます。 Sub RowDelete() Dim TargetSheet As Worksheet '処理対象シートオブジェクト Dim FindRange As Range '小計セル検索用セル範囲 Dim HitCell As Range '検索で見つかったセル範囲 Set TargetSheet = Worksheets("Sheet1") '←ここに対象シート名を入れてください ReFind: Set FindRange = TargetSheet.Range("A1:A100") '←ここに小計セルが含まれる範囲を指定して下さい。 With FindRange Set HitCell = .Find(What:="小計", LookIn:=xlValues, LookAt:=xlWhole) '検索開始 If Not HitCell Is Nothing Then '小計セルが見つかったら TargetSheet.Rows(HitCell.Row & ":" & HitCell.Row + 4).Delete '小計を含む5行を削除 GoTo ReFind End If End With End Sub

noname#143014
質問者

お礼

回答ありがとうございました。 処理は進むけど行が削除されません。 もう少し頑張ってみます。

すると、全ての回答が全文表示されます。
回答No.1

こんばんは。 どううまくいかないかを書かないと答えにくいですよ。 「小計行を含めた5行」って、たとえば ・ ・ 小計 ←削除 ・  ←削除 ・  ←削除 ・  ←削除 ・  ←削除 ・ って理解でいいんでしょうか? 「行削除は下から」 っていう大原則はご存知? まぁ、でもそれは削除をループで行う場合であって 「小計」の入っている行をフィルタかなんかで取り出し、 作業列でも作ってそこから5行に「1」でも書き込み、 フィルタで「1」を取り出して「可視セル」を含む行をいっぺんに 削除すれば下からやる必要はないです。

noname#143014
質問者

お礼

まさにイメージ通りです。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A