見出し画像

マクロのある暮らし(16回目) - もっと文字列であそぼう

こんにちは!なるーらぼです!天気が良くなって、夏日になるかもしれませんね。わたしは寒いより暑い方がまだいいので助かりますね。そして、とうとうブレイクはアイスコーヒーになりました。

文字列の種類変換(カタカナひらがな、全角半角)

今回はVBAにおいて数値のほかに最も利用しそうな文字列をさらにあそんでみたいと思います。以前に投稿した「文字列であそぶ」の回では文字列結合や置換、切り出しなどをやっています。

今回はさらに遊んでみたいと思います!サブルーチンは文字列を返す関数にしましょう。

Function note_mu(text As String) As String
End Function

イミディエイトウィンドウから遊んでもいいですし、ワークシート関数として遊んでもかまいません。

カタカナからひらがな、ひらがなからカタカナへの変換をしようとおもったら「StrConv関数」が便利です。ただし、これができるのは日本語版のときだけです。以下はカタカナの入力をひらがなへ変換します。

Function note_mu(text As String) As String
 note_mu = StrConv(text, vbHiragana)
End Function

全角と半角の切り替えも同じ関数ですが、指定する値が変わります。以下は半角文字を全角にします。

Function note_mu(text As String) As String
 note_mu = StrConv(text, vbWide)
End Function

これまた日本語でしか使えません。全角文字はコンピュータの世界ではかなり特殊なもののようです。

反転

あまり用途が思いつきませんが、面白そうなので。与えられた文字列を左右ひっくりかえして返すようにしてみます。

Function note_mu(text As String) As String
 Dim t() As String
 Dim i As Integer
 If Len(text) = 0 Then: note_mu = ""
 ReDim t(0 To Len(text) - 1)
 For i = Len(text) To 1 Step -1
  t(Len(text) - i) = Mid(text, i, 1)
 Next
 note_mu = Join(t, "")
End Function

上記では文字列を1文字ずつ取り出しては同じ長さの配列へセットしていって配列を最終的に1つの文字列に結合することで反転させています。ポイントとしては与えられた文字列が反転不要な場合はそのまま空文字とみなして空文字を返すようにしています。

部分一致

VBAでは便利な演算子がありまして、「Like演算子」というものがあります。ほかのプログラミング言語ではあまりみかけないものなんですが、便利です。

例えば、ファイルの拡張子みたいなものを考えてみます。「.xlsx」であればExcel、「.pptx」ならPowerPoint、「.docx」ならWordなんてことが分かりますよね。一致してほしいところを「.xlsx」、そのほかのところを「*」として(ワイルドカードと言います)チェックすると部分的に一致していればTrueを返します。ですから、次のようにすることができます。

Function note_mu(text As String) As String
 Dim result As String
 
 If Len(text) = 0 Then: result = "Not Asign": GoTo Normal_End
 
 If text Like "*.xlsx" Then
  result = "Excel"
 ElseIf text Like "*.pptx" Then
  result = "PowerPoint"
 ElseIf text Like "*.docx" Then
  result = "Word"
 Else
  result = "Unknown"
 End If
Normal_End:
 note_mu = result
End Function

この関数に「aaa.xlsx」と与えてやると「Excel」と文字列が返されます。ただ、この演算子はIfステートメントでしか使えません。Select Caseでも使えるとうれしいんですけどね…

これは数値?

さて、質問です。半角の1は数値でしょうか?もちろんですが、数値です。
では、全角の1は数値でしょうか?普通に考えたら数値でしょうね。
そのようになっているのは実はVBAくらいだと思いますが、これを調べる組み込み関数があります。「IsNumeric関数」です。
セルなどでは入力規則で縛ることができますが、フォームなどで入力されるときには数値を期待しているところへアルファベットや漢字などの文字が来てしまうと、考えていなかった問題が起きることがあります。

ではIsNumericであそんでみましょう。

Function note_mu(text As String) As String
 note_mu = IsNumeric(text)
End Function

この関数は渡されたテキストをIsNumeric関数に渡して、その結果をそのまま返すだけのものです。いわゆるラッパー(wrapper、包んでいるやつ)というやつですね。準備もできたので試していきましょう。

次のものはどうでしょうか?

note_mu("")

これはどうみても数値ではありませんが、プログラミング言語によっては数値として扱うものもあります。VBAではFalseになるので数値ではありません。では次は?

note_mu("1")

これはTrueですね。どうみても。次のものは?

note_mu("あ")

これももちろんFalseですね。では次は?

note_mu("1")

これはTrueになります。わたしも昔ひっかかったことがあるのですが、数値かどうかだけを判別します。よって、日本語版ではこれは数値とみなされます。なんと、半角か全角かによらずそのまま計算もすることができます。便利なんだかなんなんだか。これ、もしも全角のままデータを入力することができないものへ入れてしまうと…ということが発生するかもしれません。

正規表現

ということで登場するのが正規表現です。英語ではRegular Expressionといいます。VBAでも利用することができますが、参照設定をする必要があります。メニューの「ツール」→「参照設定」から「Microsoft VBScript Regular Expressions x.x」にチェックを入れます(x.xのところは数字が入ります)。

これで正規表現を利用するための準備ができました。ではさきほどの関数を書き換えてみます。

Function note_mu(text As String) As String
 Dim exp As New RegExp
 exp.Pattern = "[0-9]"
 note_mu = exp.Test(text)
End Function

どうでしょう?今度は全角の1がFalseになりましたよね?これは半角の0から9までのみということにしてあるからです。次は2桁の数字のみということにしてみましょう。普通なら数値かどうかをチェックして、OKならさらに長さが2なのかをチェックします。しかし、次のようにすると一度でチェックすることができます。

Function note_mu(text As String) As String
 Dim exp As New RegExp
 exp.Pattern = "^[0-9]{2}$"
 note_mu = exp.Test(text)
End Function

パターンに波括弧で数字が書かれています。これが何回ヒットするかということを表しています。ですから、数値に2回ヒットするという意味になります。それから山型の記号「^」は「~ではじまる」、ドル記号「$」は「~で終わる」を意味します。つまり、数値に2回ヒットするもので始まって終わるというパターンだということです。

なお、数値は便利なショートカットがありまして、「\d」とすると[0-9]と同じ意味になります。

とすると…?もしかして郵便番号かどうかをチェックしようとしたら次のような形でできるのでは??と思った方は天才ですね!

Function note_mu(text As String) As String
 Dim exp As New RegExp
 exp.Pattern = "\d{3}-\d{4}"
 note_mu = exp.Test(text)
End Function

これならフォームでもセルでも郵便番号が入力されたかどうか簡単にチェックすることができますね!

最後に

今回は種類の変換(ひらがなカタカナ、全角半角)、切り出しと配列の結合を応用した文字の反転、部分一致、数値のチェック、正規表現をやってあそんでみました。これらをさらに応用すれば複雑なアプリケーションとしてマクロを活用することができると思います。

それではまた!良い一日を!

この記事が気に入ったらサポートをしてみませんか?