こんにちは、Ryoです。
文字列を検索する際に統一されていれば良いのですが、全角や半角が混在していたり大文字で書く人もいれば小文字の人もいますので、この場合VBAで普通に検索しても区別して判定されますので、違う文字と認識されます。
全角/半角/小文字/大文字でそれぞれ組合せを考えて、検索する際の条件に指定するのは大変ですし現実的ではありませんので、今回は区別せずに検索する方法について書いてみます。
1.サンプル概要
シート上に半角で書かれた「Excel VBA」の文字があります。
文字が入力されたセルに対し、Instr関数で「EXCEL」を指定し有無を判定させてみると、
Sub Sample1() If InStr(Cells(10, 2).Value, "EXCEL") <> 0 Then MsgBox "含まれています", vbInformation Else MsgBox "見つかりません", vbCritical End If End Sub
当然ながら大文字、小文字を区分するので見つかりませんね。
ここを区分せずに見つけるには、対象とする文字列の全角/半角/大文字/小文字を変換して統一させてから、検索しようとする文字を指定することで解決できます。
そのように記述して検索させれば、この通り判定出来ます。
2.サンプルコード
Sub Sample1() '指定文字の有無を確認する(全角/半角/大文字/小文字を区別しない) If InStr(StrConv(UCase(Cells(10, 2).Value), vbNarrow), "EXCEL") <> 0 Then MsgBox "含まれています", vbInformation Else MsgBox "見つかりません", vbCritical End If End Sub
このサンプルコードで何をしているのかと言いますと、セルに書かれている「Excel VBA」という文字をUCase関数で「大文字」に変換し、StrConv関数で半角(引数:vbNarrow)に変換していますので、セルの文字は大文字&半角の「EXCEL VBA」となり、InStr関数で指定した「EXCEL」を検索することが出来たということです。
UCase関数については、以前記事で解説していますのでよろしければご参照ください。
InStr、StrConv関数については、以下に簡単に解説します。
◆InStr関数
このInStr関数は本来、検索指定した文字があるかを先頭から順に検索し最初に見つかった文字の位置を返してくれる関数です。
InStr(検索元の文字列 , 検索したい文字列)
構文としてはこのように使いますので、概要で示したInStr(Cells(10, 2), “EXCEL”)のように、セルB10の文字列に”EXCEL”があるかどうかを検索したものです。
なければ「0」、あれば文字列内の位置が先頭なので「1」が返りますから、これを利用して
Instr(対象文字列,検索文字列)<> 0 Then
とすることで、検索した文字が含まれているかどうかを判定できるというものです。
◆StrConv関数
StrConv関数は文字の種類を変換してくれるものです。
StrConv(対象文字列,引数)
引数は変換したい文字の種類を指定するもので、設定する定数は以下の通りになります。
本サンプルは半角にしたかったので、「vbNarrow」を指定しています。
定数 | 値 | 説明 |
vbUpperCase | 1 | 文字列を大文字に変換 |
vbLowerCase | 2 | 文字列を小文字に変換 |
vbProperCase | 3 | 文字列の各単語先頭文字を大文字に変換 |
vbWide | 4 | 文字列内の半角文字を全角文字に変換 |
vbNarrow | 8 | 文字列内の全角文字を半角文字に変換 |
vbKatakana | 16 | 文字列内のひらがなをカタカナに変換 |
vbHiragana | 32 | 文字列内のカタカナをひらがなに変換 |
vbUnicode | 64 | システム規定のコードページを使い文字列をUnicodeに変換 |
vbFromUnicode | 128 | 文字列をUnicodeからシステム規定のコードページに変換 |
この中にも全角⇔半角を指定できる定数があるのですが、本サンプルのように複合的な変換をしたい場合であれば全角⇔半角変換はUCaseやLCase関数を使った方が楽です。
また、カタカナ⇔ひらがな変換なども出来ますからStrConv関数は便利なので知っておくと幅がかなり広がると思います。
これらの関数を組み合わせたものが以下サンプルコード内の記述です。
If InStr(StrConv(UCase(Cells(10, 2).Value), vbNarrow), “EXCEL”) <> 0 Then
UCaseで大文字にし、StrConvで半角にしてInStrで文字有無を判定させていることがわかると思います。それぞれの組み合わせで用途に応じて変換し検索~抽出できますので使う機会も多いのではないかと思います。
3.まとめ
サンプルでは大文字/半角に統一する方法を例として書いていますが、ここはLCase/UCase関数やStrConv関数の定数指定によって多様な組み合わせが可能なので、うまく活用すれば概ね区分せずに検索することが出来ると思います。機会があればご検討くださいませ!
以上、全角/半角/大文字/小文字を区別せず文字検索する方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo