Sentencesコレクションの要素の一番最初の「文字」が何文字目かを調べるFunction(Word)

Sentencesコレクションの要素の一番最初の「文字」が何文字目かを調べるFunction

分かりにくいタイトルですまぬ。

文の最初の文字の位置を調べたい。たとえば、

「……『ち~んw』とか言うな!」と言った。

みたいなときに、最初の文字「ち」の位置が知りたいということ。

考え方

次のように考えた。

  • Sententcesコレクションの要素(Rangeオブジェクト)を取得する。
  • RangeオブジェクトのCharactersコレクションを取得する。
  • Charactersコレクションの要素(String型の値)を一つづつisSignメソッドを用いて調べる。
  • isSignの返り値がFalseになったときのインデックスを返す。

こんな感じ。

コード

リスト1 標準モジュール
Private Function getFirstCharPosition( _
                   ByVal targetSentence As Range) As Long
  Dim ret As Long
  ret = 0
  Dim i As Long
  With targetSentence
    For i = 1 To .Characters.Count
      If Not isSign(.Characters(i)) Then ret = i: Exit For
    Next
  End With
  getFirstCharPosition = ret
End Function

短いコードなので、説明は省略……っていうか、上で書いた通りのことしかしていない。

参考に、isSignメソッドのコードを載っけておく。

【参考】リスト2 標準モジュール
Private Function isSign(ByVal targetCharacter As String) As Boolean
  isSign = False
  Dim str As String
  str = "、 。 , . ・ : ; ? ! "
  str = str & "゛ ゜ ´ ` ¨ ^  ̄ _ 〇 "
  str = str & "― ‐ / \ ~ ∥ | … ‥ "
  str = str & "‘ ’ ( ) 〔 〕 [ "
  str = str & "] { } 〈 〉 《 》 「 」 "
  str = str & "『 』 【 】  ° ′ ″ "
  str = str & "! "" ' ( ) , - . / : ; ?"
  str = str & " " & Chr(&H8167) & " " & Chr(&H8168)
  Dim ar As Variant
  ar = Split(str)
  Dim i As Long
  For i = LBound(ar) To UBound(ar)
    If targetCharacter = ar(i) Then isSign = True: Exit Function
  Next
End Function

使ってみる。

f:id:akashi_keirin:20181020085922j:plain

こんな風に、文章の一部を選択して、イミディエイト・ウインドウに、次のコードを書いて、それぞれ返り値を確かめる。

?Module1.getFirstCharPosition(Selection.Sentences(1))
?Module1.getFirstCharPosition(Selection.Sentences(2))
?Module1.getFirstCharPosition(Selection.Sentences(3))

ちなみに、選択部分の第1~3文は、それぞれ

  1. 「ここと長安の間は、長駆すれば十日で達する距離です。
  2. もしお許しあれば、秦嶺を越え、子午谷を渡り、虚を衝いて、敵を混乱に陥れ、彼の糧食を焼き払いましょう。
  3. ――丞相は斜谷から進まれ、咸陽へ伸びて出られたら、魏の夏侯楙などは、一鼓して破り得るものと信じますが」

この通り。

それぞれ、「2」、「1」、「3」が返ったら正解。

f:id:akashi_keirin:20181020085929j:plain

意図どおり。

おわりに

これで、準備完了。