• ベストアンサー

エクセル関数で、「ある文字列が含まれるセルを数える」という式?

エクセルで、”好きな食べ物”という列があるのですが、ここからどんなものが人気か調べたいと思っています。 好きな食べ物 ------------- いちご イチゴ カレーライス カレー 卵 たまご 半角か、全角か、も統一されていませんし、漢字やひらがな、など表記がバラバラだったりします。省略した名前のものもあります。 でも、いちごが何件、カレーライスが何件、たまごが何件とトータルで知りたいと思っています。 例えば、 いちご・イチゴ・苺など条件をたくさん指定し、その文字が含まれていたら、カウントするというような関数であればいいのかな、と思っています。 助けて頂いてばかりなのですが、いいお答えばかりなので、すごく勉強になっています。是非今回も教えて頂ければと思っています。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 のみにヒット

noname#107402
質問者

お礼

ありがとうございます。 インターネットを通してより良いアイデアが出てくる、感動です!ありがとうございました。

その他の回答 (3)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

> いちご・イチゴ・苺など条件をたくさん指定し、その文字が含まれていたら、 > カウントするというような関数であればいいのかな、と思っています。 この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

noname#107402
質問者

お礼

ありがとうございます。 気楽に考えていたのですが、すごくためになります。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>カウントするというような関数であればいいのかな ユーザー定義関数を、ちょっと考えてみました。 '標準モジュール設定(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)
回答No.1

ベタな方法ですけど =COUNTIF(セル範囲,"*いちご*")+COUNTIF(セル範囲,"*イチゴ*")+COUNTIF(セル範囲,"*苺*") とするとか ユーザー定義関数を作ればすっきりと記述できるけど

noname#107402
質問者

お礼

ありがとうございます。 こういった方法が分かり易く、自分にとってはすごく為になります。ありがとうございます。

関連するQ&A