文章の中で使われる記号かどうかを判定するFunction(Word)

文章の中で使われる記号かどうかを判定するFunction

ちょっとやってみたいことがあって、標題のようなFunctionを作ってみようと思い立った。

以前、

akashi-keirin.hatenablog.com

文字が漢字かどうかを判定するFunctionを作ったときは、ある意味非常に簡単だった。

文字コードが正の数かどうかで半角/全角の判定ができたし、漢字かどうかの判定も文字コードの大小で判定できた。

しかしながら、今度の場合、

f:id:akashi_keirin:20181019201818j:plain

コチラ(出典)を見ていただいてもお分かりの通り、文章の中で使う記号と見なしたいもの(カッコとかリーダとかダッシュの類)とそうでないものが入り組んでいるので、文字コードで判定する方式だと、非常に分かりにくいものになりそう。

考え方

あまり美しいやり方とは言えないかも知れないけれど、後々の加除訂正のしやすさを考えて、次のようにすることにした。

  • 文章の中で使われる記号と見なしたいものを列挙
  • それらを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行で書いても良いのだけれど、見やすさを考慮してこのように複数回に分けて代入した。

以前

akashi-keirin.hatenablog.com

でも触れたように、Split関数では、第2引数を省略すると半角スペースがDelimiterと見なされるので、各記号の嵌張を半角スペースにしている。このテクニックを知っているのと知らないのとでは入力効率が大幅に変わると思う。id:t-homさん、ありがとぅー!

(2)の

str = str & " " & Chr(&H8167) & " " & Chr(&H8168)

は、

akashi-keirin.hatenablog.com

こいつを参照のこと。

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")(全角の「」)

f:id:akashi_keirin:20181019201830j:plain

おわりに

まあ、これだけだと「何に使うねん???」でしょうねえ。