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
使ってみる。
こんな風に、文章の一部を選択して、イミディエイト・ウインドウに、次のコードを書いて、それぞれ返り値を確かめる。
?Module1.getFirstCharPosition(Selection.Sentences(1))
?Module1.getFirstCharPosition(Selection.Sentences(2))
?Module1.getFirstCharPosition(Selection.Sentences(3))
ちなみに、選択部分の第1~3文は、それぞれ
- 「ここと長安の間は、長駆すれば十日で達する距離です。
- もしお許しあれば、秦嶺を越え、子午谷を渡り、虚を衝いて、敵を混乱に陥れ、彼の糧食を焼き払いましょう。
- ――丞相は斜谷から進まれ、咸陽へ伸びて出られたら、魏の夏侯楙などは、一鼓して破り得るものと信じますが」
この通り。
それぞれ、「2
」、「1
」、「3
」が返ったら正解。
意図どおり。
おわりに
これで、準備完了。