アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel2013

指定した文字の個数を求めたい。

例えば、
A1からJ1に入力された"a"の数をK1に表示。

続いてA2からJ2に入力された"b"の数をK2に表示。

関数ではなくて、VBでコードを書きたいのですが、どなたがVBに詳しい方教えて下さい。よろしくお願いします。

A 回答 (4件)

一応関数案ですが


K列に
=SUM(LEN(A1:J1)-LEN(SUBSTITUTE(A1:J1,"a","")))
と入れて Ctrl+Shift+Enter で決定して配列関数にする
L列も同様
=SUM(LEN(A1:D1)-LEN(SUBSTITUTE(A1:D1,"b","")))

下へコピーではだめですか?
    • good
    • 0
この回答へのお礼

hallo-2007さん、ありがとうございます。

今後のVBの応用にと思ってますので、すいませんが今回はVBで解決したいです。

お礼日時:2014/07/21 21:42

> =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
    • good
    • 0
この回答へのお礼

kkkkkmさん、ありがとうございます。

帰宅したら早速試してみます。

お礼日時:2014/07/21 13:08

>例えば、


>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
    • good
    • 0
この回答へのお礼

早速、ありがとうございます。

まだ試してないのですが、私の質問が不十分ですいませんでした。

行は10行くらで、
列は10列くらいなので、J1としました。

関数だとK1に
=COUNTIF(A1:J1,"a")となるのでしょうか。

それをタテ10行、横10列でVBならと思いやってみたんですが、私には難しく質問させて頂きました。

"a"は実際は日本語で簡単な略語なんですが、aとさせて頂きました。

あと、質問の記述に誤りがありました。

K列にaの数
L列にbの数

を求める場合の質問でした。

申し訳ありませんでした。

職場で使う書類を作り替える為にVB勉強中です。
どうか、ご教授お願いします。

お礼日時:2014/07/21 07:51

たとえば以下のような感じでいかがでしょう。



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
    • good
    • 0
この回答へのお礼

kkkkkmさん早速、ありがとうございます。

まだ試してないのですが、私の質問が不十分ですいませんでした。

行は10行くらで、
列は10列くらいなので、J1としました。

関数だとK1に
=COUNTIF(A1:J1,"a")となるのでしょうか。

それをタテ10行、横10列でVBならと思いやってみたんですが、私には難しく質問させて頂きました。

"a"は実際は日本語で簡単な略語なんですが、aとさせて頂きました。

あと、質問の記述に誤りがありました。

K列にaの数
L列にbの数

を求める場合の質問でした。

申し訳ありませんでした。

職場で使う書類を作り替える為にVB勉強中です。
どうか、ご教授お願いします。

お礼日時:2014/07/21 07:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!