プロが教える店舗&オフィスのセキュリティ対策術

エクセルで、”好きな食べ物”という列があるのですが、ここからどんなものが人気か調べたいと思っています。

好きな食べ物
-------------
いちご
イチゴ
カレーライス
カレー

たまご

半角か、全角か、も統一されていませんし、漢字やひらがな、など表記がバラバラだったりします。省略した名前のものもあります。

でも、いちごが何件、カレーライスが何件、たまごが何件とトータルで知りたいと思っています。

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

助けて頂いてばかりなのですが、いいお答えばかりなので、すごく勉強になっています。是非今回も教えて頂ければと思っています。よろしくお願い致します。

A 回答 (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 のみにヒット
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/23 11:15

> いちご・イチゴ・苺など条件をたくさん指定し、その文字が含まれていたら、


> カウントするというような関数であればいいのかな、と思っています。

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

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

お礼日時:2005/04/23 11:06

>カウントするというような関数であればいいのかな


ユーザー定義関数を、ちょっと考えてみました。

'標準モジュール設定(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(セル範囲,"いちご,イチゴ,苺")
    • good
    • 0

ベタな方法ですけど



=COUNTIF(セル範囲,"*いちご*")+COUNTIF(セル範囲,"*イチゴ*")+COUNTIF(セル範囲,"*苺*")
とするとか

ユーザー定義関数を作ればすっきりと記述できるけど
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/19 05:47

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