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

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

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

506閲覧

【VBA】複数の特定文字が入っていない行の削除

nasubikun2

総合スコア1

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2024/03/01 08:31

実現したいこと

タイトルの通りではありますが、
エクセル表のなかで、複数の特定文字を絞り込み、特定文字が入っていない行のデータをクリアしたいです。

発生している問題・分からないこと

Sub 不要行の削除

Dim LastRow As Long
Dim i As Long
Dim i As Long
Dim Target As Variant

‘最終行取得
LastRow = Cells (Rows. Count, 1). End(x|Up). Row

'くだもの
Target =Array (”りんご,ふどう,もも”)

Application. DisplayAlerts = False
With ActiveSheet

’最終行から先頭へルーブ←
For i = LastRow To 12 Step -1

For i = 0 To UBound(Target)

‘くだものに該当しなければ行削除
If Instr(Cells(i, 2), Target (j)) = 0 Then
. Rows (i) .Delete
End If

Next j
Next
End With
Application. DisplayAlerts = True

End Sub

エクセル表(12行目から開始で参照はB列)
1lすいか
2lりんご
3lかき
4lぶどう
5lなし
6lいちご
7lもも

期待する実効値は
2lりんご
4lぶどう
7lもも

なのですが、全て削除されてしまいます。
おそらく複数の特定文字の指定で、
「りんご かつ ぶどう かつ もも」
というフィルターがかかってしまっているとは思うのですが、
「りんご または ぶどう または もも」
が入っている行以外の行を削除するフィルターにするにはどのような関数を使えばよろしいのかおしえていただきたいです!

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

teratailで同様の事案がないか確認したところ、見つかりませんでした。

補足

特になし

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2024/03/01 10:23

提示されたソースをこちらで実行するとコンパイルエラーになります。 手打ちでソースをアップするのはなく、あなたのPCのソースをそのままコピペしてください。 そうでないと、こちらで正しく再現できません。 ソースは、以下のようにしてアップしてください。 ソースのアップ方法 以下のようにすると、きちんとソースが表示されます。 </>をクリックします。 ```ここに言語を入力 コード ``` と表示されるので ```① ② ``` ①の箇所にVBAと入力し ②の箇所にソースをコピペして貼り付けます。 そうすると、きちんと表示されます。 質問は編集可能です。(ソースは再度アップ可能です) 上記のようにして、正しい方法でソースをアップし直してください。
tatsu99

2024/03/01 12:46

If InStr(Cells(i, 2), Target(j)) = 0 Then を If InStr(Target(j), Cells(i, 2)) = 0 Then に変えれば良いかと思います。
guest

回答2

0

VBA

1lastrow = Cells(Rows.Count, 1).End(xlUp).Row 2Target = Array("りんご", "ぶどう", "もも") 3 4For i = LastRow To 12 Step -1 5' 見つかった時はループを途中で抜ける。3つとも見つからなかった時はループを最後まで行く 6 For j = LBound(Target) To UBound(Target) 7 If InStr(Cells(i, 2), Target(j)) > 0 Then Exit For 8 Next j 9 If j > UBound(Target) Then Rows(i).Delete 10Next i

タイプミスだらけのコード掲載はやめましょう。
コードはコピペが原則ですが、「手元に紙しかない。Excelも無い」など、何らかの事情でコピペできない場合は、
「タイプミスが無いことに命賭けられる」と思えるまで確認してから投稿しましょう。

投稿2024/03/01 12:53

otn

総合スコア84618

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

vba

1Target = Array ("りんご,ふどう,もも")
  • 上記の Array 関数によって返されるのは( "りんご", "ぶどう", "もも" の 3 つではなく)1 つの要素( "りんご,ふどう,もも" という 1 つの文字列)を持つ 1 次元配列である。

vba

1If Instr(Cells(i, 2), Target (j)) = 0 Then 2 .Row(i).Delete 3End If
  • アクティブシートの 2 列目に "りんご,ふどう,もも" という文字列と値が一致するセルは存在しないため、上記の Instr 関数の戻り値はどの行においても 0 となり、12 行目以降の全ての行は削除される。

  • 仮に Target が "りんご", "ぶどう", "もも" の 3 つの要素を持つ 1 次元配列であったとしても、3 つの要素のうちどれか 1 つと一致しなかった時点で Delete メソッドを実行しており(「 3 つの要素のどれとも一致しなければ」という条件になっていない)、どの道全ての行が削除されることになる。

(修正例)

vba

1Sub 不要行の削除() 2 3 Dim LastRow As Long 4 Dim Target As Variant 5 6 LastRow = Cells(Rows.Count, 1).End(xlUp).Row 7 8 'Array関数を使用する場合 9 Target = Array("りんご", "ぶどう", "もも") 10' 'Split関数を使用する場合 11' Target = Split("りんご,ぶどう,もも", ",", -1, vbBinaryCompare) 12 13 Application.DisplayAlerts = False 14 15 Dim i As Long 16 Dim j As Long 17 '一致フラグの宣言 18 Dim IsMatch As Boolean 19 20 With ActiveSheet 21 For i = LastRow To 12 Step -1 22 '一致フラグの初期化 23 IsMatch = False 24 For j = LBound(Target) To UBound(Target) 25 'i 行目の 2 列目のセルの値に Target の j 番目の値が含まれている場合 26 If InStr(Cells(i, 2), Target(j)) > 0 Then 27 '一致フラグを True にしてループを抜ける 28 IsMatch = True 29 Exit For 30 End If 31 Next j 32 'Target のどの要素とも一致しなかった場合 33 If IsMatch = False Then 34 ' i 行目を削除 35 .Rows(i).Delete 36 End If 37 Next i 38 End With 39 40 Application.DisplayAlerts = True 41 42End Sub

投稿2024/03/01 09:07

編集2024/03/04 00:45
sk.exe

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasubikun2

2024/03/01 09:31

Array、Split両方で試しましたが、 Arrayでは全て消えてしまい、 Splitでは条件指定一つ目の行以外デリートされてしまいました( ; ; )
sk.exe

2024/03/04 00:46 編集

それは Target に配列を渡すところしか修正していない(上に、たぶん Array または Split 関数ヘの引数の渡し方も正しくない)からではないでしょうか。 プロシージャ全体のそれぞれのステートメントを再度読み直してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問