
No.12ベストアンサー
- 回答日時:
No.3です。
>すみません、出来たのですが、式の意味を教えていただけると大変助かります。
というご要望なので、簡単に説明します。
前半のLEN(TEXTJOIN(~&",")・・・①というマイナス記号の直前までの部分は各セルの内容を","で連結し、さらに最後に","を付けたものの文字数・・・(a)を数えています。
後半のLEN(SUBSTITUTE(TEXTJOIN(~,E2&",","")))・・・②というスラッシュ記号の直前までの部分は①の数式の文字列をSUBSTITUTE関数を使って数える対象の数字と","の組合せを空白(長さ0の文字列)に置換しています。そうすることで、数える対象の数値と","の組合せがあれば、その分、文字列が短くなります。その短くなった後で文字数・・・(b)を数えています。
ここで(a)と(b)差は「数える対象の数値と","の組合せ」が幾つあるのかによって変わります。
組合せが1つなら「数える対象の数値と","の組合せ」の文字数分短くなるはずです。
従って
=((a)-(b))/「数える対象の数値と","の組合せの文字数」
を計算すれば「数える対象の数値と","の組合せ」が幾つ含まれるのか、つまり数える対象の数値の個数が判るということになります。
ただし、既にNo.10で修正数式をお示ししておりますが、No.3の数式はカウント対象のセル内に2桁以上の数値が混在する場合、正しい結果になりませんので、ご注意ください。
また、TEXTSPLIT関数が使用可能なら、F2セルに
=SUM((TEXTSPLIT(TEXTJOIN(" ",,TRIM(SUBSTITUTE($C$2:$C$7,","," ")))," ")*1=E2)*1)
というもっと短い数式でカウントできます。
No.11
- 回答日時:
こんばんは
すでに、いくつもの回答がありますが、ユーザ定義関数での例をご参考までに。
使い方は、通常の関数と同様にセルに
=countLetter( 検索文字 , 対象セル範囲 )
を入力するだけです。
・「検索文字」はご質問文の1~の検索したい値に相当します。
・「対象セル範囲」対象とするセル範囲。
例えば、A1:A10にカンマ区切りで文字がある場合に1の個数を数えたければ
=couontLetter(1, A1:A10)
と入力する要領です。
1、2、3・・・と順に数えたければ
=couontLetter(Row(A1), A$1:A$10)
などを入力して下方にフィルコピーすれば、順に1、2、3の個数を数えられます。
ひとつのセル内に複数同じ数字がある場合(例:「1,11,1,2」)、「1」の数は2とカウントします。
ただし、スペースを無視しませんので、 「1,11, 1,2」 などとなっている場合には「1」の数は1になります。
区切り文字のデフォルトはカンマ "," になっていますが、変更することが可能です。
例えば、「1|2|3|2」という値を区切り文字を "|" にして同様のことを行いたければ、
=countletter(2, 対象セル範囲 ,"|")
とすれば、「2」の数は2としてカウントできます。
=countletter(2, 対象セル範囲 )
だと、カンマで分割しますので、一致するものは存在しないことになり値は 0 になります。
検索値は数字に限定してありませんので、文字を同様にカウントすることもできます。
※ 事前の準備として、VBE(=マクロのエディター)の画面で、標準モジュールに以下の関数をコピペしておけば、関数 countLetter() が使用可能になります。
Function countLetter(ByRef s As String, ByRef rg As Range, _
Optional ByVal d As String = ",") As Long
Dim c As Range, ws, w
countLetter = 0
For Each c In rg
For Each w In Split(c.Text, d)
If w = s Then countLetter = countLetter + 1
Next w
Next c
End Function
No.10
- 回答日時:
No.9です。
連投失礼します。前回回答で配列数式を用いた数式を投稿しましたが、配列数式でなくても対応可能なことに気づきました。F2セルに以下の数式を記述する方法です。
=(LEN(" "&SUBSTITUTE(TRIM(SUBSTITUTE(TEXTJOIN(",",,$C$2:$C$7),","," "))," "," ")&" ")-LEN(SUBSTITUTE(" "&SUBSTITUTE(TRIM(SUBSTITUTE(TEXTJOIN(",",,$C$2:$C$7),","," "))," "," ")&" "," "&E2&" ","")))/LEN(" "&E2&" ")
しかし、例によって正しい数式を投稿できないので、以下のURLで、正しい数式をご確認ください。
https://ideone.com/5iFZgU
No.9
- 回答日時:
No.3です。
enunokokoroさん、ご指摘ありがとうございます。
前回回答は、確かに2桁以上の数値が混在すると正しい結果を返さない数式でした。大変失礼いたしました。
TEXTSPLIT関数が使えないバージョンでも利用可能なものをと考えたのですが、考察が足りなかったようです。
お詫びして、F2に記述する数式を以下のように修正いたします。さらにこの数式はスピル機能のないバージョンでは、数式バーに入力後、ENTERではなく、「CTRL+SHIFT+ENTER」で確定して配列数式とする必要があります。
(※上記手順で数式全体が波括弧で括られた状態になるばずです)
残念ながら、結果としてとても長い数式になってしまいました。
=(LEN(" "&SUBSTITUTE(TRIM(TEXTJOIN(" ",,SUBSTITUTE($C$2:$C$7,","," ")))," "," ")&" ")-LEN(SUBSTITUTE(" "&SUBSTITUTE(TRIM(TEXTJOIN(" ",,SUBSTITUTE($C$2:$C$7,","," ")))," "," ")&" "," "&E2&" ","")))/LEN(" "&E2&" ")
なお、このサイトの仕様として「半角スペースの繰返しは繰返し無しに修正される」ようです。
従って上記数式は当方投稿が正しく反映されません。仕方ないので以下のURLにアップしました。コピーしてご確認ください。
https://ideone.com/DnZWrj
No.8
- 回答日時:
たびたびすみません。
No.7の補足です。
参照するセルを変更したい場合は
buf = Cells(i, 1)
をいじってください。
Cells(i+1,1)
とすればA2から始まります。
Cells(i,2)
とすればB1から始まります。
空白行があると止まりますが、数字以外が入力されたセルがあるとエラーになります。
結果の書き出し先を変更したい場合は
Cells(i, 2) = arr(i)
Cells(i, 3) = cnt(arr(i))
をいじってください。
動かし方は参照と同じです。
No.7
- 回答日時:
NO.1です。
すいません。
そもそも質問文を読み違えていました。
1は何個、2は何個の数字を勝手にセルだと思い込みました。
考えてみれば当たり前ですね・・・。
というわけでお詫びもかねてセルにある数字を数えるコードを書いてきました。
VBEに突っ込んで動かしてみてください。
A列に突っ込んだらB列に存在する数字を書き出し、C列にその個数を書き出します。
2桁以上の数字があっても、数字の順番がばらばらでも大丈夫です。
Sub Sample()
Dim buf As String
Dim cnt() As Integer
Dim arr() As Integer
Dim i As Long
Dim j As Long
Dim k As Long
Dim buf1 As Long
Dim buf_max As Long
i = 1
k = 1
Do
buf = Cells(i, 1)
If buf = "" Then Exit Do
j = 1
Do
If Mid(buf, j, 1) = "" Then Exit Do
If InStr(j, buf, ",") = 0 Then
buf1 = Right(buf, Len(buf) - j + 1)
If buf1 > buf_max Then
ReDim Preserve cnt(buf1) As Integer
buf_max = buf1
End If
If cnt(buf1) = 0 Then
ReDim Preserve arr(k) As Integer
arr(k) = buf1
k = k + 1
End If
cnt(buf1) = cnt(buf1) + 1
Exit Do
Else
buf1 = Mid(buf, j, InStr(j, buf, ",") - j)
j = InStr(j, buf, ",") + 1
End If
If buf1 > buf_max Then
ReDim Preserve cnt(buf1) As Integer
buf_max = buf1
End If
If cnt(buf1) = 0 Then
ReDim Preserve arr(k) As Integer
arr(k) = buf1
k = k + 1
End If
cnt(buf1) = cnt(buf1) + 1
Loop
i = i + 1
Loop
For i = 1 To k - 1
For j = k - 1 To i Step -1
If arr(i) > arr(j) Then
swap = arr(i)
arr(i) = arr(j)
arr(j) = swap
End If
Next j
Next i
For i = 1 To k - 1
Cells(i, 2) = arr(i)
Cells(i, 3) = cnt(arr(i))
Next i
End Sub

No.6
- 回答日時:
COUNTIF関数でワイルドカードを使えば、数字が一桁なら
対応できますよ。
=COUNTIF($C$2:$C$11,"*"&E2&"*")
私の添付画像で確認できるかと思いますが、数えたい数字の
列がE列として、C列が文字列としてあれば対応できます。
(標準だと一つだけの数字のセルがカウントされないことも)
No.3の回答者さんの数式も二桁以上の場合、特定の数値では
正しく判定されないことがあるようです。

No.3
- 回答日時:
ご質問者は
>1つのセルに1つの数ならcountifで簡単に数えられますが、、、、
と仰っているので、セルごとに数えるのではなく、掲出された画像で言えばC列全体の中に、1は何個、2は何個、3は何個・・・と数えたいということだと理解しました。
添付画像をご覧ください。
数えるべき数値をE列に列挙するためE2セルに
=ROW(A1)
という数式を記述して下方向へコピーしています。その上で、F2セルに
=(LEN(TEXTJOIN(",",,$C$2:$C$5)&",")-LEN(SUBSTITUTE(TEXTJOIN(",",,$C$2:$C$5)&",",E2&",","")))/LEN(E2&",")
という数式を入れて下方向へコピーしています。
これで、E列に表示された数値のそれぞれの個数がF列に表示されることになります。

回答ありがとうございます。
教えていただいたとおり行ないましたら出来ました。
もう少し式の意味を教えていただけないでしょうか
前半の
(LEN(TEXTJOIN(",",,$C$2:$C$5)&",")
はコンマ(,)でつなげられた文字列を数え、
後半の
LEN(SUBSTITUTE(TEXTJOIN(",",,$C$2:$C$5)&",",E2&",","")))/LEN(E2&",")
は、コンマ(,)を空白に変換し他後の文字数を文字数で割り
前半の数値から後半の数値を引く?
すみません、出来たのですが、式の意味を教えていただけると大変助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Excelでなぜこのような式をつかっているのでしょうか、行に1,2,3と連番を振るだけなのに
Excel(エクセル)
-
エクセルで在庫表を作っています。 それぞれの表で、入庫、出庫、残高が表示される表を作っています。 任
Excel(エクセル)
-
Excel列条件×行条件=合計の計算
Excel(エクセル)
-
-
4
Excelに関して質問があります。 写真のようなことが起こりました。 解決方法が分かりません。 どな
Excel(エクセル)
-
5
win10でexcel2003は動かないのか
Excel(エクセル)
-
6
至急お願いします
Excel(エクセル)
-
7
Excelの計算について質問です。11月で止まってるんですが、2022の12月と2023の一月からを
Excel(エクセル)
-
8
エクセルの関数を教えてください。②
Excel(エクセル)
-
9
LEFT関数で文字数を指定しないで取りだす方法
Excel(エクセル)
-
10
Excelが苦手過ぎて、まともに使えません。 根本的に、この資料はどのExcelを使えば良いのかが分
Excel(エクセル)
-
11
セルに入力があれば表示させるには?
Excel(エクセル)
-
12
勤務表ですが、思うように出来ません。
Excel(エクセル)
-
13
ExcelのFIND関数について
Excel(エクセル)
-
14
Excel 一つのセルに2つの関数を入れたい
Excel(エクセル)
-
15
西暦の下一桁と月を表示させたい。但し、10,11,12月はXYZにしたい。
Excel(エクセル)
-
16
特定のデータの抽出方法を教えてください@Excel
Excel(エクセル)
-
17
能力が問われると思う
Excel(エクセル)
-
18
EXCEL 和暦を西暦に変換する方法について
Excel(エクセル)
-
19
Excelで、昭和の西暦換算
Excel(エクセル)
-
20
VLOOKUP 構造化参照について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel初心者です、教えてくださ...
-
【エクセル】IF関数 Aまたは...
-
エクセル 足して割る
-
Excelで数式内の文字色を一部だ...
-
エクセルで指定したセルのどれ...
-
excelのCOUNTIF関数で、『範囲=...
-
貼り付けで複数セルに貼り付けたい
-
エクセルのセルの枠を超えて文...
-
Excelでのコメント表示位置
-
EXCEL VBA セルに既に入...
-
対象セル内(複数)が埋まった...
-
セルをクリック⇒そのセルに入力...
-
Excelで住所を2つ(町名迄と番...
-
エクセルの一つのセルに複数の...
-
エクセル オートフィルタで絞...
-
ドロップダウンさせるボタンを...
-
【Excel】 セルの色での判断は...
-
Excelで教えてください。 バー...
-
エクセルの機能について 計算結...
-
COUNTIF セルに色を塗るとカウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【エクセル】IF関数 Aまたは...
-
エクセルで指定したセルのどれ...
-
エクセル 足して割る
-
excelのCOUNTIF関数で、『範囲=...
-
貼り付けで複数セルに貼り付けたい
-
Excelで数式内の文字色を一部だ...
-
対象セル内(複数)が埋まった...
-
セルをクリック⇒そのセルに入力...
-
Excelで、「特定のセル」に入力...
-
【Excel】 セルの色での判断は...
-
EXCEL VBA セルに既に入...
-
COUNTIF セルに色を塗るとカウ...
-
エクセルのセルの枠を超えて文...
-
Excelで教えてください。 バー...
-
エクセルの一つのセルに複数の...
-
Excel2003 の『コメント』の編...
-
Excelでのコメント表示位置
-
エクセル オートフィルタで絞...
-
Excelで住所を2つ(町名迄と番...
-
ドロップダウンさせるボタンを...
おすすめ情報