🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

691閲覧

VBA - 複数のAND条件のコードを簡略化できないか

koyamashinji

総合スコア45

VBA

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

マクロ

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

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/12/04 13:09

編集2020/12/04 14:28

下記のコードは、cells(i, "B")の値が「特定の文字列」でないものを、行ごと削除するマクロです。
条件文And Notを以下のように条件数の分だけ書くほかに、もっと簡略な記述方法があれば教えていただきたく。
是非よろしくお願いします。

(省略) For i = LastRow To 2 Step -1 Dim cellValue As String cellValue = Cells(i, "B").Value If Not cellValue = "文字列1" And Not cellValue = "文字列2" _ And Not cellValue = "文字列3" _ And Not cellValue = "文字列4" _ And Not cellValue = "文字列5" _ And Not cellValue = "文字列6" _ And Not cellValue = "文字列7" _ And Not cellValue = "文字列8" _                  ・                  ・                 (省略)                  ・                  ・ And Not cellValue= "文字列20" Then Cells(i, "B").EntireRow.Delete End If Next i

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

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

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

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

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

guest

回答3

0

アルファベットのa~zまでの場合でないもの

Like演算子を使うと簡単です。

vba

1 cellValue = Cells(i, "B").Value 2 If Not cellValue Like "[a-z]" Then 3 Rows(i).Delete 4 End If

Like 演算子 | Microsoft Docs


単純に抽出したい条件が膨大な量存在する(cells(i,"B").valueが●●でもなければ、■■でもなく、▽▽でもなく、▲▲でもなく・・・(続く)」場合、

vba

1 Dim strList As String 2 strList = ";●●;■■;▽▽;▲▲;" 3 4 cellValue = Cells(i, "B").Value 5 If InStr(strList, ";" & cellValue & ";") = 0 Then 6 Rows(i).Delete 7 End If

数が膨大かつ修正することを結構あるのなら、シート上に入力しておいて、FindメソッドがMatch関数で検索するのがいいでしょう。

Match関数を使用する場合のコード例

ItemListシートのA1からワードのリストを入力しておく。

標準モジュールに下記の関数を作成

vba

1'Item が List に存在したら True を返す 2Public Function ListCheck(Item As String) As Boolean 3 Dim r As Double 4 On Error Resume Next 5 r = Application.Match(Item, Worksheets("ItemList").Range("A1").CurrentRegion, 0) 6 ListCheck = (Err = 0) 7End Function

行削除処理

vba

1 cellValue = Cells(i, "B").Value 2 If Not ListCheck(cellValue) Then 3 Rows(i).Delete 4 End If

投稿2020/12/04 14:41

編集2020/12/04 15:45
hatena19

総合スコア34073

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

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

koyamashinji

2020/12/04 23:36

ご回答誠に有難うございました。簡潔なコードで大変わかりやすいです。またよろしくお願いいたします。
guest

0

ベストアンサー

正規表現を使うなど、他にもいろいろ手段はありそうですがこの条件であればASCIIコードを利用してチェックするのが手っ取り早そうです。

前提知識

  • 文字には1文字ずつ ASCIIコード と呼ばれる番号が振られている
  • a は 97 、以降アルファベット順に z は 122 まで連番で振られている(つまりASCIIコードの数値比較で判定できる)
  • 対象の文字のASCIIコードが 97 ~ 122 でなければ、a ~ z ではない
  • ただし、VBAでASCIIコードを取得する関数 ASC() は引数に与えられた文字列の1文字目のASCIIコードを返すため対象の文字列が1文字かどうかを判定しておく必要がある

コード例

VBA

1 2' 文字列が1文字でない場合、 3' または 文字列のASCIIコードが "a" のものより小さい 4' または 文字列のASCIIコードが "z" のものより大きい 5If (Len(cellValue) <> 1) _ 6 Or (Asc(cellValue) < Asc("a")) _ 7 Or (Asc(cellValue) > Asc("z")) Then 8 9 ' i 行を削除 10 Rows(i).Delete 11End If 12 13

参考) https://www.relief.jp/docs/excel-vba-for-next-from-a-to-z.html

追記 2020-12-04 23:40

コメントでいただいた要件を踏まえたサンプルコードです。

メイン処理側の呼び出し例

別途作成した str_check関数 を条件として行削除するコード例。

VBA

1 2If str_check(cellValue) Then 3 ' i 行を削除 4 Rows(i).Delete 5End If 6

チェック関数例

同じファイルのシート cond のA列に A1セル A2セル ・・・ にチェック対象となるリストが作られている想定。
リストに空白はなく、各行を評価して空白セルが出てきたらリストの終了とみなす

VBA

1 2' チェック関数 : この関数の返り値が true の場合、行削除 3Function str_check(check_strings As String) As Boolean 4 Dim tmpRet As Boolean ' チェック結果を管理しておく変数 5 tmpRet = True ' デフォルト True (=削除対象)と考える 6 7 8 ' 仮に同じブックの cond シートのA列に対象外としたい文字列のリストがあるとした場合 9 Dim ws As Worksheet 10 Set ws = ActiveWorkbook.Sheets("cond") ' cond シート 11 12 Dim rowCount As Long ' cond シートの参照行番号 13 rowCount = 1 14 15 16 ' cond シートのA列を1行目からたどる 17 ' A列の rowCount 行が空白となった場合、リストの終了とみなす 18 Do Until ws.Cells(rowCount, 1).Value = "" 19 20 ' 文字列と一致した場合、関数の結果を false としてチェックを終了する 21 If check_strings = ws.Cells(rowCount, 1).Value Then 22 tmpRet = False 23 Exit Do 24 End If 25 26 ' リストの次の行を参照先としてループ 27 rowCount = rowCount + 1 28 Loop 29 30 31 ' 関数の返り値を設定 32 str_check = tmpRet 33End Function 34

投稿2020/12/04 13:56

編集2020/12/04 14:41
kaz.Suenaga

総合スコア2037

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

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

koyamashinji

2020/12/04 14:02

なるほど。大変勉強になります。 条件がアルファベットa~zに限らず、単純に抽出したい条件が膨大な量存在する(cells(i,"B").valueが●●でもなければ、■■でもなく、▽▽でもなく、▲▲でもなく・・・(続く)」場合、どのような簡略化が考えられるでしょうか。
kaz.Suenaga

2020/12/04 14:16

規則性がない文字列、ということであれば別途用意したシート上でも、ソースコード内でコードとして書くにしても、何かの形でリストを作ることは必要になりますね。 そのリストを基に、別途チェック関数を作り、その関数の結果を true / false で返すようにし、その関数を If の条件式に使う、というのが標準的な方法になると思います。 条件に利用したい文字列がどこかで定義されている、など、何か要件はありますか。
koyamashinji

2020/12/04 14:25

条件に利用したい文字列は、コードの中に直接記述してしまおうかと思っていましたが、都度管理が大変なので(対象文字列の数が増えたり減ったりする)、別シートに記載し可変範囲として定義するのが良いかと考えています。
kaz.Suenaga

2020/12/04 14:42

回答に追記しました。
koyamashinji

2020/12/04 23:40

ご回答誠に有難うございました。 丁寧に具体的なコードの説明をしてくださり、考え方を理解することができました。週明けに会社で早速試してみます。
guest

0

以下でどうでしょうか。

VBA

1・・・省略・・・ 2 cellValue = Cells(i, "B").Value 3 If Len(cellValue) <> 1 Or Asc(cellValue) < Asc("a") Or Asc(cellValue) > Asc("z") Then 4 Cells(i, "B").EntireRow.Delete 5 End If 6・・・省略・・・ 7

投稿2020/12/04 14:09

tatsu99

総合スコア5493

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問