[[20211125095151]] 『「:」(コロン)の数をカウント』(無印) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『「:」(コロン)の数をカウント』(無印)

以下のコードで「,」の個数がカウントできますが、
「:」(コロン)の数はカウントできません。

どうすればカウントできますか ?

Sub Sample3()

    Dim buf As String, n As Long, cnt As Long
    buf = "ABC,DEF,GHI"
    Do
        n = InStr(n + 1, buf, ",")
        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If
    Loop
    MsgBox cnt & "個あります"
End Sub

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 ここが何をしているかは理解しているだろうか?
 >n = InStr(n + 1, buf, ",")

(ねむねむ) 2021/11/25(木) 09:58


 ここのそのままか。
 どこから持ってきたかは明記した方がいいと思うが。
http://officetanaka.net/excel/vba/tips/tips152.htm
(ねむねむ) 2021/11/25(木) 10:09

ここが何をしているかは理解しているだろうか?
 >n = InStr(n + 1, buf, ",")

カンマがbufの中の何番目にあるかをカウントしているですよね。

カンマは、bufの中の4番目と8番目の2回ある

単純に「,」を「:」に置き換えると
 n=0 でゼロ個と表示される
(無印) 2021/11/25(木) 10:12


 >「:」(コロン)の数はカウントできません。 

 一応できたけどね。

 Sub Sample3()
    Dim buf As String, n As Long, cnt As Long
    buf = "::ABC:DEF:GHI::"
    Do
        n = InStr(n + 1, buf, ":")
        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If
    Loop
    MsgBox cnt & "個あります"
 End Sub
(一応) 2021/11/25(木) 10:13

 >n = InStr(n + 1, buf, ",")
                         ↑
              ここを書き換えるのを忘れたってオチ?
              ギャグですか?
(一応) 2021/11/25(木) 10:19

 全角・半角が違っているとかは無いだろうか?
(ねむねむ) 2021/11/25(木) 10:20

実際のコードは、以下です

For I = 2 to 500

     Do
        n = InStr(n + 1, Cells(I, "A"), ":")
        If n = 0 Then
            MsgBox "[:]がありません。"
            End
        Else
            cnt = cnt + 1
        End If
     Loop
     Cells(I, "B").Value = cnt
Next
(無印) 2021/11/25(木) 10:28

 これだと:が含まれていないセルで処理を終わってしまってそれより下のセルは調べないがそれでよいのだろうか?
(ねむねむ) 2021/11/25(木) 10:47

 For I = 2 to 500
     Do
        n = InStr(n + 1, Cells(I, "A"), ":")
        If n = 0 Then
            MsgBox "[:]がありません。" '←最後の「:」を見つけた後に必ずここを経由します。
            End
        Else
            cnt = cnt + 1
        End If
     Loop
     Cells(I, "B").Value = cnt
 Next

上記コードでは、もし「:」があっても必ず"[:]がありません。"のメッセージを発します。
また、cntのリセットをしていないので行を経るごとにcntの値が増えていきます。
(きまぐれおじさん) 2021/11/25(木) 10:50


 全角、半角対応です

 Sub Test()
    Dim i As Long, n As Long

    For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
        n = UBound(Split(StrConv(Cells(i, "A").Value, vbNarrow), ":"))
        If n <= 0 Then
            Cells(i, "B").Value = "[:]がありません。"
        Else
            Cells(i, "B").Value = n
        End If
    Next
 End Sub

(ピンク) 2021/11/25(木) 10:52


 For i = 2 To 500
     cnt = 0    '←cntをリセット
     Do
        n = InStr(n + 1, Cells(i, "A"), ":")
        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If
     Loop
     If cnt < 1 Then
         MsgBox "[:]がありません。" '←cntが1未満のときにメッセージを発出します。
         End
     Else
         Cells(i, "B").Value = cnt
     End If
 Next

無印さんのコードをベースに改修を加える案です。
(きまぐれおじさん) 2021/11/25(木) 10:55


 まえの私の書き込みは間違い。
 一つ目のセルで処理を終わってしまう。
 >If n = 0 Then
 はあくまでも検索が終わったかの判断で検索文字がなかったかどうだかはcntで判断しないとならない。
(ねむねむ) 2021/11/25(木) 10:56

 >実際のコードは、以下です 

 また、はじめはでたらめな適当コードですか…。
 こんなのが多いな。
 実は・・・・・・。
 回答者をあきれさせる言葉。
(一応) 2021/11/25(木) 11:03

>一応さん

適当コード大歓迎ですよ。
実際のコードを見せてもらえないのが一番困ります。
(きまぐれおじさん) 2021/11/25(木) 11:07


ねむねむさん、ありがとうございます。
>これだと:が含まれていないセルで処理を終わってしまってそれより下のセルは調べないがそれでよいのだろうか?

かまいません。
無い場合は、A列のDATAに不備があるので
DATAに問題が無いか?のチェックを兼ねています。

ピンクさん、ありがとうございます。
全角、半角対応のコードで上手く数値がでました。

きまぐれおじさん、ありがとうございます。
コードを下記のようにして試してみました。
数値は、カウントされて表示されました。

Sub コロンの数を数える2()

 Dim i As Long, cnt As Long, n As Long

For i = 2 To 500

     cnt = 0    '←cntをリセット
     Do
        n = InStr(n + 1, Cells(i, "A"), ":")
        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If
     Loop
     If cnt < 1 Then
         MsgBox "[:]がありません。" '←cntが1未満のときにメッセージを発出します。
         End
     Else
         Cells(i, "B").Value = cnt
     End If
 Next
End Sub

(無印) 2021/11/25(木) 11:15


 解決後ですが、こんな書き方も。
 Sub test()
     Dim i As Long, cnt As Long
     For i = 2 To 500   ' ここは手抜き
         cnt = countColon(Cells(i, "A").Text)
         If cnt = 0 Then
             Cells(i, "B").Value = "[:]がありません。"
         Else
             Cells(i, "B").Value = cnt
         End If
     Next
 End Sub
 Function countColon(s As String) As Long
     s = StrConv(s, vbNarrow)
     countColon = Len(s) - Len(Replace(s, ":", ""))
 End Function
(γ) 2021/11/25(木) 13:43

参考までに、下記のような書き方も。

 Function countColon(s As String) As Long
     countColon = UBound(Split(s, ":", -1, vbTextCompare))
 End Function

(hatena) 2021/11/25(木) 15:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.