|
InStr関数で取得できるのは、最初に見つかった位置だけです。だから複数の検索値
が含まれていると、初めに検索スタート位置を 1 にして 0 を返すかどうかチェックし
>0 ならカウンタ変数に +1 する。次に、見つかった位置 +1 をスタート位置にして
再度 InStr関数で調べる・・という処理を、0 が返るかスタート位置が検索対象文字列の
長さになるまで繰り返し行わないと、正しくカウントできません。これを検索文字の
種類の数だけ一つのセルについて調査し、それが終わってやっと次のセルへ移動・・。
という面倒なことをするしかなくなります。そこでこのような調査をする場合は、
正規表現を使うと簡素化できるわけです。以下のサンプルを試してみて下さい。
C列に文字列を入力したセルがないと、何も表示されずに終了します。
Sub MyCount_St()
Dim C As Range
Dim Sta As String, CkSt As String
Dim Ct1 As Long, Ct2 As Long, Ct3 As Long, Ct4 As Long
Dim ObjRE As Object, Match As Object, Matches As Object
Sta = "・"
Set ObjRE = CreateObject("VBScript.RegExp")
With ObjRE
.Pattern = "[\40\42\47" & Sta & "]"
.Global = True
End With
On Error GoTo ErLine
For Each C In Range("C:C").SpecialCells(2, 2)
CkSt = C.Value
If ObjRE.Test(CkSt) Then
Set Matches = ObjRE.Execute(CkSt)
For Each Match In Matches
Select Case Match.Value
Case " "
Ct1 = Ct1 + 1
Case "・"
Ct2 = Ct2 + 1
Case """"
Ct3 = Ct3 + 1
Case "'"
Ct4 = Ct4 + 1
End Select
Next
Set Matches = Nothing
End If
Next
MsgBox "半角スペース = " & Ct1 & vbLf & _
"中黒 = " & Ct2 & vbLf & "ダブルクォーテーション = " & _
Ct3 & vbLf & "シングルクォーテーション = " & Ct4, , _
"検索文字の個数": Exit Sub
ErLine:
Set ObjRE = Nothing
End Sub
|
|