Excel VBA 質問スレッド №1558 (解決済)

複数列の行削除について

投稿者 : かな     投稿日時 : 2023/09/08(Fri) 11:20:13     OS : 未指定     EXCEL : 未指定
初めて投稿させていただきます。
どうぞよろしくお願いいたします。

例えばA列のA、B、C、D、E含む5種類以上の行(約400行程)があり

A列のA以外の行を削除し、次にB列のB以外の行を削除、次にC列のE以外の行を削除、と続くのですが

(残したいテキストは1行目に表示されている状態)

最終的に、400行が数行まで減るイメージなのですが、

どのような式を組めば削除できますか?

1列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。


お手数ですが、ご教示よろしくお願いします。

スポンサーリンク
[返信 1] Re : 複数列の行削除について
投稿者 : さんこう     投稿日時 : 2023/09/08(Fri) 11:55:17
>1列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。

1列削除したら、次の列を削除していけばよろしいかと思います。

[返信 2] Re : 複数列の行削除について
投稿者 : ヘンリー     投稿日時 : 2023/09/08(Fri) 11:56:50
>どのような式を組めば削除できますか?
「式を組む」というより、「やらせたい事を順番に書く」
という様に考えます。

>1列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。
1列が出来て、その他ができない事は考えにくいです。
例えば、「1列ずつ削除」を「繰り返し実行」するなどを考えます。
「エラーとなり」ではなく、どんなエラーが出たのか、
エラーメッセージを見て、そのエラーを調べる習慣をつける事が、
VBAのスキルUPに繋がります。
なぜなら、エラーメッセージの内容から、どこが間違っているかを考えるからです。

少なくとも、エラーの内容は必ず掲載するようにしましょう。

[返信 3] Re : 複数列の行削除について
投稿者 : かな     投稿日時 : 2023/09/08(Fri) 12:12:43
■[返信 2] ヘンリーさん(2023-09-08 11:56:50)の記事

早々にご教示くださり、ありがとうございます。

VBAは初心者で手探りの状態で進めています。考え方などとても為になりました。

エラーは【引数が正しくない、不足している、または形式が不適切です】と出ています。

いろいろと教えてくださり、ありがとうございます。

[返信 4] Re : 複数列の行削除について
投稿者 : てらてら     投稿日時 : 2023/09/08(Fri) 12:21:33
こんにちは。

行を削除したいのか、列を削除したいのかイマイチわからないのですが、
行の削除でしたら、最終行から先頭方向に向かって繰り返し文を使うのが定石です。

Sub macroLineDelete()
    Dim i As Long
    Dim lastRow As Long
    lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
    
    For i = lastRow To 1 Step -1
        If InStr(Cells(i, "A"), "A") > 0 Then
            Cells(i, "A").EntireRow.Delete
        End If
    Next i
End Sub

>エラーは【引数が正しくない、不足している、または形式が不適切です】と出ています。
エラーに関しては、コードを見ないと何とも言えません。

[返信 5] Re : 複数列の行削除について
投稿者 : ピロリ     投稿日時 : 2023/09/08(Fri) 12:39:54
■[質問] かなさん(2023-09-08 11:20:13)の記事
> A列のA以外の行を削除し、次にB列のB以外の行を削除、次にC列のE以外の行を削除、と続く・・・
C列はC以外の列を削除ということで、下のような感じですか?
例(処理前の入力例と処理後の表示例のような・・・)や、現状のコードを挙げてもらえると有難たかったのですが・・・
文面からは今一理解できなかったので、ご要望の内容と合っているのかどうか分かりません。
的を外しているようならば読み捨てて下さい。

Sub Sample()
    Dim i As Long, j As Long, LastRow As Long
    Dim MyArr() As Variant
    
    '             A列  B列  C列  D列  E列 の文字(各列にそれ以外の文字入力時はその行は削除)
    MyArr = Array("A", "B", "C", "D", "E")
    
    For i = 0 To UBound(MyArr)                              '配列数(列数)分のループ
        LastRow = Cells(Rows.Count, i + 1).End(xlUp).Row    '処理列の最終行を取得
        For j = 1 To LastRow                                '最終行までループ
            If Cells(j, i + 1) <> MyArr(i) Then             '値が配列の文字と異なる場合
                Cells(j, i + 1).EntireRow.Delete            'その行を削除
            End If
        Next j
    Next i
End Sub

[返信 6] Re : 複数列の行削除について
投稿者 : ピロリ     投稿日時 : 2023/09/08(Fri) 13:01:49
[返信 5] コードの10Step目ですが、一部誤っていましたので訂正致します。

    For j = 1 To LastRow                '最終行までループ

下記が正です。

    For j = LastRow To 1 Step -1            '最終行から上へループ

大変失礼しました。(行削除は上側へ向かって削除します。)

[返信 7] Re : 複数列の行削除について
投稿者 : かな     投稿日時 : 2023/09/08(Fri) 13:18:20
皆さん、ありがとうございます。

最終行から行うのですね。ひとつひとつが勉強になります。

コードもありがとうございます。初心者なので非常にありがたいです。

例もない中で、失礼いたしました。

例は下記の内容で、処理後には項目の上にある行だけが残るイメージです。

今まで一つずつソートをかけて消していたので、時間がかかっていて、VBAにたどり着きました。


■処理前の例
A B E D E
項目 1 2 3 4 5

1 A B C D E
2 A B C A C
3 B A C B D
4 C B C C D
5 A B E D C
6 A B E D E
7 D B C D C
8 C B A C A
9 C B D C D
10 A B C A C
11 A B A A A


■処理後の例
A B E D E
項目 1 2 3 4 5

6 A B E D E

[返信 8] Re : 複数列の行削除について
投稿者 : ピロリ     投稿日時 : 2023/09/08(Fri) 14:03:21
サンプルデータ「A」「B」「E」「D」「E」の入力されているセルが A2~E2(2行目)と仮定し、
データ1の「A」「B」「C」「D」「E」 ~ データ11の「A」「B」「A」「A」「A」の入力されている範囲が
A11~E21と仮定して、コードを書いてみます。 参考になれば・・・

コメントは細かく振っておきましたので、必要箇所は適当に修正して下さい。

Sub Sample2()
    Dim i As Long, j As Long, LastRow As Long
    
    For i = 1 To 5                                      'A列(1列目)~E列(5列目)までループ
        LastRow = Cells(Rows.Count, i).End(xlUp).Row    '処理する列の最終行を取得
        For j = LastRow To 11 Step -1                   '最終行から上へ(11行目まで)ループ
            If Cells(j, i) <> Cells(2, i) Then          'そのセル値が2行目の値と不一致なら
                Cells(j, i).EntireRow.Delete            'その行を削除
            End If
        Next j
    Next i
End Sub

[返信 9] Re : 複数列の行削除について
投稿者 : ごんぼほり     投稿日時 : 2023/09/08(Fri) 15:43:14
各列のタイトルが無いようですが、もし列タイトルを付けてもいいなら付けておくとよいです
フィルターの詳細設定が使えます

[返信 10] Re : 複数列の行削除について
投稿者 : higeru     投稿日時 : 2023/09/11(Mon) 10:54:23
■[返信 7] かなさん(2023-09-08 13:18:20)の記事
> ■処理前の例
> A B E D E

 これを最初の質問に書いてくれればもっと早く正解(例)が提示されていたでしょうね。これを見て「残したいテキストは1行目に表示されている」というのに、ようやく合点がいきましたし、「次にC列のE以外の行」も間違いではなかったとだとわかりました(が、それ以外の質問文はほとんど理解できませんでした)。
 早い話が上記の行と同じ行を抽出しろ、ということですよね。

 とまあ、くさしてばかりではなんなので、(最後でなく)最初の行からでも処理できる(素直ではないかも)という例を示しておきます。前提条件はピロリさんの「投稿日時 : 2023/09/08(Fri) 14:03:21」と同じです。

Sub Sample3()
    Const START_ROW As Long = 11
    Dim i As Long, j As Long
    For i = 1 To 5
        j = 0
        Do While Cells(START_ROW + j, i) <> ""
            If Cells(START_ROW + j, i) <> Cells(2, i) Then
                Cells(START_ROW + j, i).EntireRow.Delete
            Else
                j = j + 1
            End If
        Loop
    Next
End Sub

[返信 11] Re : 複数列の行削除について
投稿者 : かな     投稿日時 : 2023/09/11(Mon) 16:33:59
皆さん、本当にありがとうございます。

無事にできました!時間のかかっていたものが超高速化できて、本当に嬉しいです。

質問の方法など、なかなかお伝え出来なかったにも関わらず

コードまでありがとうございました。

皆さんのご厚意に感謝です。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2023-10-02 00:30:09 )
タイトルとURLをコピーしました