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列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。
お手数ですが、ご教示よろしくお願いします。
初めて投稿させていただきます。
どうぞよろしくお願いいたします。
例えば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列削除したら、次の列を削除していけばよろしいかと思います。
>1列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。
1列削除したら、次の列を削除していけばよろしいかと思います。
[返信 2] Re : 複数列の行削除について
投稿者 : ヘンリー 投稿日時 : 2023/09/08(Fri) 11:56:50
>どのような式を組めば削除できますか?
「式を組む」というより、「やらせたい事を順番に書く」
という様に考えます。
>1列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。
1列が出来て、その他ができない事は考えにくいです。
例えば、「1列ずつ削除」を「繰り返し実行」するなどを考えます。
「エラーとなり」ではなく、どんなエラーが出たのか、
エラーメッセージを見て、そのエラーを調べる習慣をつける事が、
VBAのスキルUPに繋がります。
なぜなら、エラーメッセージの内容から、どこが間違っているかを考えるからです。
少なくとも、エラーの内容は必ず掲載するようにしましょう。
>どのような式を組めば削除できますか?
「式を組む」というより、「やらせたい事を順番に書く」
という様に考えます。
>1列だけなら削除できるのですが、それ以上だとエラーとなり削除できませんでした。
1列が出来て、その他ができない事は考えにくいです。
例えば、「1列ずつ削除」を「繰り返し実行」するなどを考えます。
「エラーとなり」ではなく、どんなエラーが出たのか、
エラーメッセージを見て、そのエラーを調べる習慣をつける事が、
VBAのスキルUPに繋がります。
なぜなら、エラーメッセージの内容から、どこが間違っているかを考えるからです。
少なくとも、エラーの内容は必ず掲載するようにしましょう。
[返信 3] Re : 複数列の行削除について
投稿者 : かな 投稿日時 : 2023/09/08(Fri) 12:12:43
■[返信 2] ヘンリーさん(2023-09-08 11:56:50)の記事
早々にご教示くださり、ありがとうございます。
VBAは初心者で手探りの状態で進めています。考え方などとても為になりました。
エラーは【引数が正しくない、不足している、または形式が不適切です】と出ています。
いろいろと教えてくださり、ありがとうございます。
■[返信 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以外の列を削除ということで、下のような感じですか?
例(処理前の入力例と処理後の表示例のような・・・)や、現状のコードを挙げてもらえると有難たかったのですが・・・
文面からは今一理解できなかったので、ご要望の内容と合っているのかどうか分かりません。
的を外しているようならば読み捨てて下さい。
■[質問] かなさん(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 '最終行から上へループ
大変失礼しました。(行削除は上側へ向かって削除します。)
[返信 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
皆さん、ありがとうございます。
最終行から行うのですね。ひとつひとつが勉強になります。
コードもありがとうございます。初心者なので非常にありがたいです。
例もない中で、失礼いたしました。
例は下記の内容で、処理後には項目の上にある行だけが残るイメージです。
今まで一つずつソートをかけて消していたので、時間がかかっていて、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と仮定して、コードを書いてみます。 参考になれば・・・
コメントは細かく振っておきましたので、必要箇所は適当に修正して下さい。
サンプルデータ「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」と同じです。
■[返信 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 )