- ベストアンサー
エクセルVBAのIFとLikeについて
- エクセルVBAのIF文とLike演算子を使用して、特定の文字列パターンに一致するセルを処理するコードを作成しましたが、正常に動作しない場合があります。問題の原因が不明であるため、コードの記述方法に問題がある可能性が懸念されます。初心者に近い知識しかなく、実際のコードも載せています。
- コードでは、指定された範囲内のセルに対してFor Eachループを使用して処理を行っています。セルの値が「re:〜」または「fwd:〜」または「決定」または「募集」などの特定のキーワードに一致する場合に処理が実行されるようになっています。
- また、指定のキーワードに一致しない場合には別の条件式があり、それに一致する場合には別の処理が行われます。具体的には、「要員」や「人材」、「紹介」といったキーワードに一致する場合に特定のセルの値が変数に代入され、後続の処理で使用されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>最初から全文を提示すれば良かったです。 >If Cells(Rr.Row, 2).Value Like "re:*" Or _ >Cells(Rr.Row, 2).Value Like "Re:*" Or _ >Cells(Rr.Row, 2).Value Like "RE:*" Or _ >Cells(Rr.Row, 2).Value Like "fwd:*" Or _ >Cells(Rr.Row, 2).Value Like "Fwd:*" Or _ >Cells(Rr.Row, 2).Value Like "FWD:*" Then > ElseIf Cells(Rr.Row, 2).Value Like "*案件*" Or _ >Cells(Rr.Row, 2).Value Like "*急募*" Or _ >Cells(Rr.Row, 2).Value Like "*募集*" Then それでは質問文に書かれているVBAとは異なっているではありませんか。 回答者は質問者が提示した情報に基づいて回答をしているのですから、間違った情報を提示されてしまったのでは正しく回答する事が出来ないのは当たり前の話です。 ですから、間違った情報を提示しておきながら、正しい回答を得ようとするのはやめて下さい。 正しい回答を得たいのであれば、正しい情報を提示する様にして下さい。 >上記が全文になりますが、この場合でも下記のセル内容になっているのがヒットされてしまいます。(Re:が含まれているので除外したいのですが。。。) >「ご連絡: Re: 案件のご紹介: 【T・・・」 "re:"、"Re:"、"RE:"、"fwd:"、"Fwd:"、"FWD:"の除外条件は Like "re:*" Like "Re:*" Like "RE:*" Like "fwd:*" Like "Fwd:*" Like "FWD:*" となっており、これらは全て対象となる文字列の右側にのみ「*」(アスタリスク)が付いているだけで、文字列の左側には「*」が付いていません。 従って、"re:"、"Re:"、"RE:"、"fwd:"、"Fwd:"、"FWD:"が除外されるのは、これらの文字列が検索対象となる文字列の左端にある場合だけであり、文字列の途中に"re:"、"Re:"、"RE:"、"fwd:"、"Fwd:"、"FWD:"が含まれている文字列は除外の対象とされていません。 「ご連絡: Re: 案件のご紹介: 【T・・・」という文字列は 「Re:」の前に「ご連絡: 」という文字列が付いているのですから、 Like "Re:*" の判定に引っかからないのは当たり前です。 もし途中のどこかに1個でも「Re:」が含まれている文字列を除外の対象としたいのでしたら、"Re:*"の様に片側だけに「*」を付けるのではなく、両側に「*」を付けて"*Re:*"の様にして下さい。 "re:"、"RE:"、"fwd:"、"Fwd:"、"FWD:"に関しても同様です。
その他の回答 (3)
- kagakusuki
- ベストアンサー率51% (2610/5101)
>対象シートを選択して検索しているにも関わらず >検索結果が伴わない場合があります。 いいえ、質問文に挙げられているVBAでは「対象シートを選択して検索して」はおりません。 Withで選択したシートではなく、「ActiveSheet(現在開いているシート)を検索」しているだけです。 「re:」、「Re:」、「RE:」、「RE:」等々の文字列を含んでいるデータがWithで選択したシート上にあっても、そのシートとは別のシートであるActiveSheetという見当違いな所を検索しているのですから、Withで選択したシート上にある「re:」、「Re:」、「RE:」、「RE:」等々の文字列を含んでいるデータがヒットしないのは当たり前です。 IfやLikeの使い方が原因ではないのですから、そんな使い方を考えていても意味がありません。 解決方法は回答No.1で既に述べているのですから、その通りにして下さい。 >例) >【長期/急募/実績有現場】事務業務(男性希望) >セル[B22]に上記の文字がありますが、テストで下記を実行しても動いてくれません。 >Sub ttsstt() >Rr = 22 > If Cells(Rr, 2) Like "*急集*" Then > MsgBox "除外" >End If > End Sub >本来であればメッセージボックスが出てくるはずですが、Likeの使い方が変ですかね? Likeの使い方は間違っていません。 「【長期/急募/実績有現場】事務業務(男性希望)」の中には「急募」ならば含まれていますが、「急集」などという文字列は含まれていないのですから、本来であればメッセージボックスが出てくるはずがありませんので、それが正常な結果です。
補足
ダメですね。 言葉が行き来してしまっております。 最初から全文を提示すれば良かったです。 Sub DBより案件抽出() Debug.Print Time & " - 案件スタート" Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim Nakami As Variant '// 本文の格納 Dim Rr, Cc As Range '// Rr+CcはDBシートの格納 Dim AC As Worksheet '// 案件シート Dim Hizuke As Date '// 抽出シート Dim Aite, kenmei As String Dim KR As Integer On Error Resume Next Set AC = Sheets("案件抽出") KR = 2 AC.Range("A2:E20000").Clear Sheets("DB").Select Cells(1, 1).Select For Each Rr In Range("A2:A" & Cells(1000000, 1).End(xlUp).Row) If Cells(Rr.Row, 2).Value Like "re:*" Or _ Cells(Rr.Row, 2).Value Like "Re:*" Or _ Cells(Rr.Row, 2).Value Like "RE:*" Or _ Cells(Rr.Row, 2).Value Like "fwd:*" Or _ Cells(Rr.Row, 2).Value Like "Fwd:*" Or _ Cells(Rr.Row, 2).Value Like "FWD:*" Then ElseIf Cells(Rr.Row, 2).Value Like "*案件*" Or _ Cells(Rr.Row, 2).Value Like "*急募*" Or _ Cells(Rr.Row, 2).Value Like "*募集*" Then '// 対象アイテムの代入 Hizuke = Cells(Rr.Row, 1) Aite = Cells(Rr.Row, 3) kenmei = Cells(Rr.Row, 2) For Each Cc In Range(Cells(Rr.Row, 4), Cells(Rr.Row, 200)) If Cells(Rr.Row, Cc.Column) <> "" Then If Nakami = "" Then Nakami = Cells(Rr.Row, Cc.Column) Else Nakami = Nakami & Chr(10) & Cells(Rr.Row, Cc.Column) End If End If Next '// 対象アイテムの入力 AC.Cells(KR, 1) = Hizuke AC.Cells(KR, 2) = Aite AC.Cells(KR, 3) = kenmei AC.Cells(KR, 4) = Nakami KR = KR + 1 Nakami = "" Range("FO" & Rr.Row) = 2 End If Next Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Debug.Print Time & " - 終り" End Sub 上記が全文になりますが、この場合でも下記のセル内容になっている のがヒットされてしまいます。(Re:が含まれているので除外した いのですが。。。) 「ご連絡: Re: 案件のご紹介: 【T・・・」
- kagakusuki
- ベストアンサー率51% (2610/5101)
>ご指摘を受けてWithを考えた所不要だったので削除をしております。 御質問文に記述されているVBAの構文では、 .Range("A2:A" & .Cells(1000000, 1).End(xlUp).Row) という様にRange(やCells(の前に「.」が付いているのにもかかわらず、その「.」の前にはシートが指定されていないのですから、 .Range("A2:A" & .Cells(1000000, 1).End(xlUp).Row) よりも前の行の所でWithを用いてシートを指定しておかなければエラーとなってしまいます。 従って、質問者様のVBAの構文の組み方ではWithは必要不可欠であり、Withが不要などという事はあり得ません。 >Ifで条件を指定しているものを除外し、Elseifで条件を指定している文字があるにも係らず、抽出をしてくれません ですから、IfやElseifで条件を指定しているのはActiveSheetのセルに対してだけであり、Withで指定したシートのセルに対する条件を判定している訳ではないのですから、Withで指定したシートに該当する文字があったからと言って、判定条件には関係しない様な構文になっているのです。 IfやElseifで条件を指定しているシートであるActiveSheetには、該当する文字が無い事が原因だという事になります。
補足
お返事が遅くなりました。 言葉足らずですね。困惑させて申し訳ないのですが、 .select 単純に対象となるシートを選択する為だけにWithを 使用していたので、削除をしたって意味でした。 なので、対象シートを選択して検索しているにも関わらず 検索結果が伴わない場合があります。 LIKEについての質問になってしまいますが、 例えば、「Re:」と「RE:」と「RE:」大文字小文字の分けて 検索されてしまうのでしょうか? 小文字で「re:」と条件式を記載するだけで面長な条件式にならない のでシンプルになるのに。。。っと、思っております。 要するに大文字小文字をそれぞれで条件に追加しないと 目的の結果にならないのでしょうか? LIKE以外のシンプルな条件式の手順があれば、それを教えて 欲しいです。
- kagakusuki
- ベストアンサー率51% (2610/5101)
For Each Rr In の後の所に記述されているセル範囲が存在しているシートと、 If や ElseIf の後に記述されている判定の対象としているセルが存在しているシートが異なっている事が影響しているのではないでしょうか? 御質問文にはVBAの構文の全文が記載されていないので、はっきりとは判らないのですが、For Each Rr In の後の所に記述されている .Range("A2:A" & .Cells(1000000, 1).End(xlUp).Row) というセル範囲は、For Each Rr In よりも前の所で記述されている Withステートメントで指定されているシート上のセル範囲だと思われます。 それに対して、If や ElseIf の後に記述されている Cells(Rr.Row, 2) には Cells( の前に「.」が付いていないのですから、「Withステートメントで指定されているシート」上のセルではなく、ActiveSheet(現在開いているシート)上のセルになっていますので、「Withステートメントで指定されているシート」のB列のセルに対してLikeを使った判定をしているのではなく、 ActiveSheet(現在開いているシート)のB列のセルに対してLikeを使った判定を行っている事になります。 ですから、もし「Withステートメントで指定されているシート」とActiveSheetが異なるシートであった場合には、「Withステートメントで指定されているシート」のB列のセルに対してLikeを使った判定をしているのではないのですから、判定結果がおかしくなる訳です。 ですから、もし「Withステートメントで指定されているシート」のB列のセルに対してLikeを使った判定を行うのであれば、If や ElseIf の後に記述されている全ての Cells(Rr.Row, 2) の前の所に「.」を付けて .Cells(Rr.Row, 2) としなければなりません。 また、もし逆に「Withステートメントで指定されているシート」のB列のセルに対してLikeを使った判定をするのではなく、ActiveSheet(現在開いているシート)のB列のセルに対してLikeを使った判定を行う場合には、For Each Rr In の後の所に記述されている .Range("A2:A" & .Cells(1000000, 1).End(xlUp).Row) という箇所の中の .Range( と .Cells( の先頭に付いている「.」を消して Range("A2:A" & Cells(1000000, 1).End(xlUp).Row) にしなければなりません。
補足
回答ありがとうございます。 全文を記載しなかったので分かりずらいかと思いました。 回答の回答になりますが、ご指摘を受けてWithを考えた所 不要だったので削除をしております。 しかし、Ifで条件を指定しているものを除外し、Elseifで条件を 指定している文字があるにも係らず、抽出をしてくれません。。。 新しい条件で「急募」の文字が出て来たので、こちらを参考資料と させて下さい。 例) 【長期/急募/実績有現場】事務業務(男性希望) セル[B22]に上記の文字がありますが、テストで下記を実行しても 動いてくれません。 Sub ttsstt() Rr = 22 If Cells(Rr, 2) Like "*急集*" Then MsgBox "除外" End If End Sub 本来であればメッセージボックスが出てくるはずですが、 Likeの使い方が変ですかね? 宜しくお願い致します。
お礼
ご指摘ありがとうございます。 余計な手間を掛けてしまっておりました。 ご指示の通りで行っても何故か取りこぼしが出て しまっておりますが、個別処理を(構文は同一) 再度行うって形を取った結果、RE:等の検出が 出来ましたので解決とさせて頂きます。 ありがとうございました。