質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • VBA

    1800questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1538questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

VBA【空白行・特定の文字を含む行を削除する方法】

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 5,549

Ashi

score 10

空白行・特定の文字を含む行を削除する方法を教えていただきたいです。

――――――――――――――――――――――――――――――――――――――――
■ 概要 (添付画像を参照しながらご確認ください)
――――――――――――――――――――――――――――――――――――――――

A列に、空白を含む文字列が並んでおり、

A5から、A列最終行までの範囲内にある

「空白」と「特定の文字(ここでは"あ"とします)」を削除したい

という要望です。

※どちらも「行ごと」削除したいです。
※空白と文字列の削除を同時に実行したいです。
※削除する文字列は常に固定されているので、inputboxなどによる削除したい文字列の入力のフローは不要です。

以上、どうぞよろしくお願いいたします。

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

A列の最終行位置を把握した後で、最終行から次の処理を繰り返することで簡単に処理することができます。

処理するシートをsheetとして、Rows.CountとEnd(xlUp)を使って、最下行「r」を取得します。なお、sheetは、ブック内ののシートを示すデータ構造でありシート名を"Sheet1"とした場合には、「Set sheet = Worksheets("Sheet1")」で設定することができます。

r = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row


次に最終行から以下の処理を行います。

行(r)のA列セルが「空白」か、「特定の文字」を含んでいるのか調べます。「特定文字をふくんでいるか」では、VBAのInStr関数を使っています。
0 < InStr(sheet.Cells(r, 1).Value, "あ")であれば、r行A列のセルに"あ"が含まれていればその位置を示しますので0以上であれば、"あ"を含んでいることになります。

そこで、行削除を行うことになりますが、

sheet.Rows(r).Delete Shift:=xlUp


とすることで、該当行を削除してその行よりあとの部分が上がります。
そこで、rを前の行にして同じ処理を続け、rが5になるまで続けます。

全体とすると次のようなコードとなります。

    Dim sheet As Worksheet
    Dim r As Long

    Set sheet = Worksheets("Sheet1")
    r = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row
    Do While (5 <= r)
        If sheet.Cells(r, 1).Value = "" Or 0 < InStr(sheet.Cells(r, 1).Value, "あ") Then
            sheet.Rows(r).Delete Shift:=xlUp
        End If
        r = r - 1
    Loop

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/13 08:59

    ご丁寧に回答していただきありがとうございました。

    非常に参考になる内容でした。

    キャンセル

+1

・A5からA列最終行までの範囲から全体行数を取得する
・A5セルから行方向へ順番に処理する
・セルの文字列を取得する
・「空白」または「特定の文字」が含まれているかチェックする
・「空白」または「特定の文字」が含まれていたらその行を削除する
・削除した場合は行が1行詰まるので全体行数を-1する
・削除した場合は次行が今回行に上がってくるので同じ行をチェックする
・削除しない場合は次の行のチェックに進む
・処理行数が全体行数に達するまで処理を繰り返す

処理はこんな感じだと思います

・全ての行が削除対象だった場合
・全ての行が削除対象にならなかった場合
・処理行が1行も無い場合
などのケースも想定が必要でしょうかね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 19:25

    ご回答ありがとうございます。

    VBAは初心者レベルなので、実際のコードを書いていただけると嬉しいです!

    キャンセル

  • 2017/09/12 20:13

    先ずはご自身でどのくらいできるかを提示ください
    ひとつひとつの処理は、調べればどういうコードを書けばよいかわかるものばかりです
    もし1行も書けないほどの初心者でしたらまだこのサイトを利用するには早いと思います
    推奨していない質問 > https://teratail.com/help/avoid-asking

    キャンセル

  • 2017/09/13 08:59

    大変失礼いたしました。
    私の質問の仕方があいまいでした。

    以後ご指摘いただいた点についてはしっかりと配慮しますので、
    機会があればまたご回答いただけると嬉しいです。

    キャンセル

0

上から行削除をすると面倒なので、データ最終行から
1行目まで順に見ていく方が楽かと思います。

Public Sub 行削除()
    Dim i As Long
    Dim LastRow As Long

    LastRow = Range("A1048576").End(xlUp).Row   'データの最終行を取得

    For i = LastRow To 1 Step -1        'データの最終行から1行目までループ
        If Cells(i, "A").Value = "あ" Or Cells(i, "A") = "" Then        '文字列"あ"を削除するのであればこの条件
        'If InStr(Cells(i, "A"), "あ") Or Cells(i, "A") = "" Then            '文字"あ"を含む列を削除したいのであればこの条件
            Cells(i, "A").EntireRow.Delete
        End If
    Next i
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/13 08:57

    ご回答していただきありがとうございます。

    参考にさせていただきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1800questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1538questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。