web-dev-qa-db-ja.com

Excel VBA:ActiveCellが「* string *」のような場合にケースを選択

私はActiveCellの現在の値を取得し、選択したケースに基づいてその値を変更するマクロに取り組んでいます。

ただし、ActiveCellにワイルドカード文字列が含まれているかどうかを判断できません。構文が正しいかどうかわかりません。選択したケースを比較するにはどうすればよいですか?

Select Case ActiveCell.Value

    Case ActiveCell.Value Like "*string*"
        ActiveCell.Value = "contains string"

End Select
9
thedeepfield

ワイルドカードを使用することは可能です。これら2つのことを念頭に置いてください。まず、文字列比較式はブールデータ型(True/False)に評価されます。 2番目に、Select ... Caseステートメントの開発者リファレンスに従って、すべてのCase式(s)は同じデータ型に「暗黙的に変換可能」でなければなりませんSelect Caseテスト式のように。デモのために、上記の元の投稿のコードを使用してみましょう。

Select Case ActiveCell.Value  '-->ActiveCell.Value is the test expression

    Case ActiveCell.Value Like "*string*"  '-->(ActiveCell.Value Like "*string*") is the Case expression.
        ActiveCell.Value = "contains string"

End Select

ワークシートで文字列値を含むセルを選択し、イミディエイトウィンドウを使用して、TypeName()関数を使用してこれら2つの式のデータ型をテストすると、次のようになります。

?TypeName(ActiveCell.Value)
 String
?TypeName(ActiveCell.Value Like "*string*")
 Boolean

ご覧のとおり、Select ... Caseはここでは機能しません。これは、データ型が暗黙的に同じではないためです(これに対するマイナーな例外は、次の単一ワードの値を含むワークシートのセルでマクロが実行された場合です。 Excelが自動的にブール値に変換する「True」または「False」。

解決策は実際には非常に簡単なものです。テスト式をTrueに変更するだけです。

Select Case True

    Case (ActiveCell.Value Like "*string*")
        ActiveCell.Value = "contains string"

End Select

これは本質的に次の記述と同じです。

If (ActiveCell.Value Like "*string*") = True Then ActiveCell.Value = "contains string"

If ... Thenを使用するか、Select ... Caseを使用するかは、個人的な好みの問題です。個人的には、コードの読みやすさのためにSelect ... Caseコンストラクトが好きですが、他の利点(各CaseにOR演算子を使用するのではなくコンマで区切られた式のリストを渡す機能など、コードをより簡潔にする)。

23
Nero057

Is and likeは、VBAのselect caseステートメントで比較演算子として使用できません。
可能であれば、if-thenステートメントで置き換えることをお勧めします。

If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string"

比較演算子のVBA用語集から:

2つ以上の値または式の間の関係を示す文字または記号。これらの演算子には、より小さい(<)、以下(<=)、より大きい(>)、以上(> =)、等しくない(<>)、等しい(=)が含まれます。追加の比較演算子には、IsおよびLikeが含まれます。 IsおよびLikeは、Select Caseステートメントで比較演算子として使用できないことに注意してください。

4
Aaron Thomas