- ベストアンサー
エクセル関数で、「ある文字列が含まれるセルを数える」という式?
エクセルで、”好きな食べ物”という列があるのですが、ここからどんなものが人気か調べたいと思っています。 好きな食べ物 ------------- いちご イチゴ カレーライス カレー 卵 たまご 半角か、全角か、も統一されていませんし、漢字やひらがな、など表記がバラバラだったりします。省略した名前のものもあります。 でも、いちごが何件、カレーライスが何件、たまごが何件とトータルで知りたいと思っています。 例えば、 いちご・イチゴ・苺など条件をたくさん指定し、その文字が含まれていたら、カウントするというような関数であればいいのかな、と思っています。 助けて頂いてばかりなのですが、いいお答えばかりなので、すごく勉強になっています。是非今回も教えて頂ければと思っています。よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ja7awu様へ、気を悪くしないでくださいね。 アイデア頂戴いたしました。m(__)m '標準モジュール登録 Option Compare Binary Function CountifPhonetic(セル範囲 As Range, _ 検索語 As String, _ Optional WCard As Boolean = True, _ Optional TextBase As Boolean = False) '引数:セル範囲:e.g.A1:A10, 検索語:"文字列", 'ワイルドカード:(省略可)標準あり eq. "*文字列*" Falseでなし, 'TextBase:(省略可)標準なし e.g. A≠a ,Trueで A =a Dim DataArray() As Variant, DataTmp As String Dim i As Long, j As Long, g As String, k As Long Set Rng = セル範囲 kensaku = StrConv(検索語, 8) If WCard Then g = "*" For Each c In Rng ReDim Preserve DataArray(i) If TextBase Then DataTmp = StrConv(Application.GetPhonetic(c.Value), 8) DataArray(i) = StrConv(DataTmp, 2) Else If Not IsNumeric(c.Value) Then DataArray(i) = StrConv(Application.GetPhonetic(c.Value), 8) Else DataArray(i) = c.Value End If End If i = i + 1 Next c For j = LBound(DataArray) To UBound(DataArray) If DataArray(j) Like g & kensaku & g Then k = k + 1 End If Next j CountifPhonetic = k End Function 使用例: ワイルドカードで、検索 =CountifPhonetic(A1:A10,"イチゴ") =CountifPhonetic(A1:A10,"?イチゴ",False) 野苺 のみにヒット =CountifPhonetic(A1:A10,"abc",,True) Abc aBc abc abc のみにヒット
その他の回答 (3)
- ja7awu
- ベストアンサー率62% (292/464)
> いちご・イチゴ・苺など条件をたくさん指定し、その文字が含まれていたら、 > カウントするというような関数であればいいのかな、と思っています。 この3種類の「イチゴ」という読み方は、日本語IME等を使っていると取得できる ことですので、全ての品目を「読み」に直してしまうことをお勧めします。 文字種一定の「読み」を取得するには、次のユーザー定義関数を使用します。 ここでは、「半角カタカナの読み」に統一する GetPhoneNaro 関数を作ります。 これにより、あとは、CountIf 等の関数で容易に部分一致カウントが容易に出来ます。 GetPhoneNaro 関数の書式: =GetPhoneNaro(文字列式) 使用例: =GetPhoneNaro("苺") ----> 半角カタカナのイチゴ =GetPhoneNaro("いちご") ----> 〃 =GetPhoneNaro("イチゴ") ----> 〃 =GetPhoneNaro("卵") ----> 半角カタカナのタマゴ =GetPhoneNaro("タマゴ") ----> 〃 セルA1に "林檎" が入力されているとき、 =GetPhoneNaro(A1) ----> 半角カタカナのリンゴ その手順は、 1.Alt + F11 で VBE(Visual Basic Editor)を開きます。 2.VBE のメニューから[挿入] -->[標準モジュール] を指定します。 3.コードウィンドウに下記コード(たった3行)をコピーして貼り付けます。 4.Alt + Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。 5.メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を 「中」にして[OK]します。 これで、GetPhoneNaro 関数が使えます。 Function GetPhoneNaro(CelStr As String) As String GetPhoneNaro = StrConv(Application.GetPhonetic(CelStr), vbNarrow) End Function
お礼
ありがとうございます。 気楽に考えていたのですが、すごくためになります。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
>カウントするというような関数であればいいのかな ユーザー定義関数を、ちょっと考えてみました。 '標準モジュール設定(Excel 2000以上) Function myCountIf(セル範囲 As Range, _ 検索文字列 As String, _ Optional グローバル As Boolean = True) As Long '引数の検索文字列が、複数の場合は、「,」で区切り、" "で括ること 'グローバルとは、*検索文字列* のワイルドカードのこと '結果がいくつもあっても、セル1つで1つと数える Dim Rng As Range, c As Range, strArg As String, aryArg As Variant Dim g As String, flg As Boolean Set Rng = セル範囲 strArg = 検索文字列 If グローバル Then g = "*" If InStr(strArg, ",") > 0 Then aryArg = Split(strArg, ",") End If If IsArray(aryArg) Then For Each c In Rng For Each s In aryArg If WorksheetFunction.CountIf(c, g & s & g) > 0 Then flg = True End If Next s If flg Then k = k + 1: flg = False Next c Else k = WorksheetFunction.CountIf(Rng, g & strArg & g) End If myCountIf = k End Function 使用例: =myCountif(セル範囲,"いちご,イチゴ,苺")
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ベタな方法ですけど =COUNTIF(セル範囲,"*いちご*")+COUNTIF(セル範囲,"*イチゴ*")+COUNTIF(セル範囲,"*苺*") とするとか ユーザー定義関数を作ればすっきりと記述できるけど
お礼
ありがとうございます。 こういった方法が分かり易く、自分にとってはすごく為になります。ありがとうございます。
お礼
ありがとうございます。 インターネットを通してより良いアイデアが出てくる、感動です!ありがとうございました。