| 
    
     |  | 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
 
 
 |  |