- ベストアンサー
文字の個数
Excel2013 指定した文字の個数を求めたい。 例えば、 A1からJ1に入力された"a"の数をK1に表示。 続いてA2からJ2に入力された"b"の数をK2に表示。 関数ではなくて、VBでコードを書きたいのですが、どなたがVBに詳しい方教えて下さい。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> =COUNTIF(A1:J1,"a")となるのでしょうか。 その場合、abcは個数に入りませんがそういう仕様ですか? > 行は10行くらで、 > 列は10列くらいなので、J1としました。 1行目にはaで2行目にはbで3行目以降は不明ですが、それともすべての行でaとbの個数を合算した結果をそれぞれK列L列にに出すのでしょうか。どちらにしても、回答されたコードをご自身で解析してご自身の仕様に合うように改良する必要がありますが、不明な部分が多いので、とりあえず それぞれの行でaの個数はK列にbの個数はL列に表示するということとして3種類の例を示します。 Sub Example1() 'a及びbの文字総数を求める Dim c As Range Dim i As Integer, j As Integer Dim samplestr(2) As String Range("K:L").ClearContents samplestr(0) = "a" samplestr(1) = "b" For i = 1 To 10 For Each c In Range(Cells(i, "A"), Cells(i, "J")) Cells(i, "K").Value = Cells(i, "K").Value + (Len(c.Value) - Len(Replace(c.Value, samplestr(0), ""))) / Len(samplestr(0)) Cells(i, "L").Value = Cells(i, "L").Value + (Len(c.Value) - Len(Replace(c.Value, samplestr(1), ""))) / Len(samplestr(1)) Next Next End Sub Sub Example2() '文字列にa及びbを含む文字列の個数を求める Dim c As Range Dim i As Integer, j As Integer Dim samplestr(2) As String Range("K:L").ClearContents samplestr(0) = "a" samplestr(1) = "b" For i = 1 To 10 For Each c In Range(Cells(i, "A"), Cells(i, "J")) If InStr(1, c.Value, samplestr(0)) > 0 Then Cells(i, "K").Value = Cells(i, "K").Value + 1 End If If InStr(1, c.Value, samplestr(1)) > 0 Then Cells(i, "L").Value = Cells(i, "L").Value + 1 End If Next Next End Sub Sub Example3() 'COUNTIFと同じ結果 Dim c As Range Dim i As Integer, j As Integer Dim samplestr(2) As String Range("K:L").ClearContents samplestr(0) = "a" samplestr(1) = "b" For i = 1 To 10 For Each c In Range(Cells(i, "A"), Cells(i, "J")) If c.Value = samplestr(0) Then Cells(i, "K").Value = Cells(i, "K").Value + 1 End If If c.Value = samplestr(1) Then Cells(i, "L").Value = Cells(i, "L").Value + 1 End If Next Next End Sub
その他の回答 (3)
- hallo-2007
- ベストアンサー率41% (888/2115)
一応関数案ですが K列に =SUM(LEN(A1:J1)-LEN(SUBSTITUTE(A1:J1,"a",""))) と入れて Ctrl+Shift+Enter で決定して配列関数にする L列も同様 =SUM(LEN(A1:D1)-LEN(SUBSTITUTE(A1:D1,"b",""))) で 下へコピーではだめですか?
お礼
hallo-2007さん、ありがとうございます。 今後のVBの応用にと思ってますので、すいませんが今回はVBで解決したいです。
- nishi6
- ベストアンサー率67% (869/1280)
>例えば、 >A1からJ1に入力された"a"の数をK1に表示。 >続いてA2からJ2に入力された"b"の数をK2に表示。 この例が意味深で、行が進むにつれて逐次、a、b、c・・・と変化する? "a"の値はいいとして、"z"の次は? "aa"を数えることはある? そのとき、"aaaa"の中に"aa"は何個と定義する。などの疑問がありますが、"aaaa"には"aa"が2個と定義して、いずれの場合にも対応できるようにユーザー定義関数を作りました。 =CountCharacter("a",A1:J1) =CountCharacter("b",A2:J2) のように使います。 標準モジュールに貼り付け Function CountCharacter(c As String, SearchRng As Range) Dim rg As Range '検査するセル Dim num As Integer '見つけた個数 For Each rg In SearchRng num = num + (Len(rg.Text) _ - Len(Application.Substitute(rg.Text, c, ""))) / Len(c) Next CountCharacter = num End Function
お礼
早速、ありがとうございます。 まだ試してないのですが、私の質問が不十分ですいませんでした。 行は10行くらで、 列は10列くらいなので、J1としました。 関数だとK1に =COUNTIF(A1:J1,"a")となるのでしょうか。 それをタテ10行、横10列でVBならと思いやってみたんですが、私には難しく質問させて頂きました。 "a"は実際は日本語で簡単な略語なんですが、aとさせて頂きました。 あと、質問の記述に誤りがありました。 K列にaの数 L列にbの数 を求める場合の質問でした。 申し訳ありませんでした。 職場で使う書類を作り替える為にVB勉強中です。 どうか、ご教授お願いします。
- kkkkkm
- ベストアンサー率66% (1719/2589)
たとえば以下のような感じでいかがでしょう。 Sub Example() Dim c As Range Dim i As Integer, j As Integer Range("K:K").ClearContents For i = 0 To 1 For Each c In Range(Cells(i + 1, "A"), Cells(i + 1, "J")) Cells(i + 1, "K").Value = Cells(i + 1, "K").Value + (Len(c.Value) - Len(Replace(c.Value, Chr(Asc("a") + i), ""))) Next Next End Sub
お礼
kkkkkmさん早速、ありがとうございます。 まだ試してないのですが、私の質問が不十分ですいませんでした。 行は10行くらで、 列は10列くらいなので、J1としました。 関数だとK1に =COUNTIF(A1:J1,"a")となるのでしょうか。 それをタテ10行、横10列でVBならと思いやってみたんですが、私には難しく質問させて頂きました。 "a"は実際は日本語で簡単な略語なんですが、aとさせて頂きました。 あと、質問の記述に誤りがありました。 K列にaの数 L列にbの数 を求める場合の質問でした。 申し訳ありませんでした。 職場で使う書類を作り替える為にVB勉強中です。 どうか、ご教授お願いします。
お礼
kkkkkmさん、ありがとうございます。 帰宅したら早速試してみます。