文章の中で使われる記号かどうかを判定するFunction(Word)
文章の中で使われる記号かどうかを判定するFunction
ちょっとやってみたいことがあって、標題のようなFunctionを作ってみようと思い立った。
以前、
文字が漢字かどうかを判定するFunctionを作ったときは、ある意味非常に簡単だった。
文字コードが正の数かどうかで半角/全角の判定ができたし、漢字かどうかの判定も文字コードの大小で判定できた。
しかしながら、今度の場合、
コチラ(出典)を見ていただいてもお分かりの通り、文章の中で使う記号と見なしたいもの(カッコとかリーダとかダッシュの類)とそうでないものが入り組んでいるので、文字コードで判定する方式だと、非常に分かりにくいものになりそう。
考え方
あまり美しいやり方とは言えないかも知れないけれど、後々の加除訂正のしやすさを考えて、次のようにすることにした。
- 文章の中で使われる記号と見なしたいものを列挙
- それらを
Split
関数の引数とし、記号をぶち込んだ配列を作る - 配列の各要素と照合し、一致した時点で
True
を返す
コーディング
次のように書いた。
リスト1 標準モジュール
Private Function isSign(ByVal targetCharacter As String) As Boolean
isSign = False
Dim str As String
str = "、 。 , . ・ : ; ? ! " '……(1)'
str = str & "゛ ゜ ´ ` ¨ ^  ̄ _ 〇 "
str = str & "― ‐ / \ ~ ∥ | … ‥ "
str = str & "‘ ’ ( ) 〔 〕 [ "
str = str & "] { } 〈 〉 《 》 「 」 "
str = str & "『 』 【 】 ° ′ ″ "
str = str & "! "" ' ( ) , - . / : ; ?"
str = str & " " & Chr(&H8167) & " " & Chr(&H8168) '……(2)'
Dim ar As Variant
ar = Split(str)
Dim i As Long
For i = LBound(ar) To UBound(ar) '……(3)'
If targetCharacter = ar(i) Then isSign = True: Exit Function
Next
End Function
まず、(1)からの8行
str = "、 。 , . ・ : ; ? ! "
str = str & "゛ ゜ ´ ` ¨ ^  ̄ _ 〇 "
str = str & "― ‐ / \ ~ ∥ | … ‥ "
str = str & "‘ ’ ( ) 〔 〕 [ "
str = str & "] { } 〈 〉 《 》 「 」 "
str = str & "『 』 【 】 ° ′ ″ "
str = str & "! "" ' ( ) , - . / : ; ?"
str = str & " " & Chr(&H8167) & " " & Chr(&H8168)
は、Split
関数の引数作り。
別に、1行で書いても良いのだけれど、見やすさを考慮してこのように複数回に分けて代入した。
以前
でも触れたように、Split
関数では、第2引数を省略すると半角スペースがDelimiter
と見なされるので、各記号の嵌張を半角スペースにしている。このテクニックを知っているのと知らないのとでは入力効率が大幅に変わると思う。id:t-homさん、ありがとぅー!
(2)の
str = str & " " & Chr(&H8167) & " " & Chr(&H8168)
は、
こいつを参照のこと。
VBEの余計なお世話対策です。
あとは、(3)からの3行
For i = LBound(ar) To UBound(ar)
If targetCharacter = ar(i) Then isSign = True: Exit Function
Next
で、配列ar
にぶち込んだ記号を、引数targetCharacter
と照合し、一致した時点でTrue
を返すだけ。
一つも一致しなければFor
ループを抜けることになるので、False
が返る。
使ってみる
イミディエイトに、次のように打ち込んで、それぞれ[Enter]に中指を振り下ろす。
?ModuleMain.isSign("【")
(全角の「【
」)
?ModuleMain.isSign(":")
(半角の「:
」)
?ModuleMain.isSign("ち")
(全角の「ち
」)
?ModuleMain.isSign("~")
(全角の「~
」)
?ModuleMain.isSign("ん")
(全角の「ん
」)
?ModuleMain.isSign("w")
(全角の「w
」)
おわりに
まあ、これだけだと「何に使うねん???」でしょうねえ。