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

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

たまご

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

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

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

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

このQ&Aに関連する最新のQ&A

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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルの下記表について答えを導く関数式とは?

 下記のような形式の車種別の生産予定表があるとします。


  A   B  C  D  E  F  G  
1車種 4/1 2  3  4  5  6日  
2車1  20    30 50
3車2     60 80
4車3              40
5車4  50
6車5     40 30   
7車6              70 10台

 のような少ロットで変動の多い生産予定表について
 4月X日の車Xの生産数を知るにはINDEX+MATCH関数、VLOOKUP+MATCH関数で表を縦横に検索すれば交差するセルの台数を返しますが、仮に台数が分かっているとして、逆の論理として
 車1の生産があった日が4月1日、3日、4日であるという生産対象日を返したい。
 4月3日の生産は車1、車2、車5であるという車種名を返したい。

 これを出来るように関数式を考えていますが、上手く答えを出せません。セルに返る戻り値が一つではありません。
一つの関数式では無理なんでしょうか?VBAが分からないので関数で出せると助かるのですが、方法がありましたら、どなたかご教導お願い申し上げます。
 
 
 

 下記のような形式の車種別の生産予定表があるとします。


  A   B  C  D  E  F  G  
1車種 4/1 2  3  4  5  6日  
2車1  20    30 50
3車2     60 80
4車3              40
5車4  50
6車5     40 30   
7車6              70 10台

 のような少ロットで変動の多い生産予定表について
 4月X日の車Xの生産数を知るにはINDEX+MATCH関数、VLOOKUP+MATCH関...続きを読む

Aベストアンサー

既存の関数のみで行う場合、結果は連続した文字列として1個のセルに表示することになります。単純化のため、ご例示のシートをさらにコンパクトにします。カラムが揃わない場合、メモ帳に貼り付けてご覧ください。

*| A|B|C|D|E|
1|  |1|2|3|
2|車1|4|3| |
3|車2|7| | |
4|車3| | |5|
5|

E2に定義
=IF(B2<>"",$B$1&" ","")&IF(C2<>"",$C$1&" ","")&IF(D2<>"",$D$1&" ","")
以下、E4まで下へドラッグ

B5に定義
=IF(B2<>"",$A$2&" ","")&IF(B3<>"",$A$3&" ","")&IF(B4<>"",$A$4&" ","")
以下、D5まで右へドラッグ

結果
*| A|   B|  C|   D|E |
1|  |   1|  2|   3| |
2|車1|   4|  3|    |1 2 |
3|車2|   7|   |   3|1 3 |
4|車3|    |   |   5|3 |
5|  |車1 車2|車1 |車2 車3|  |

実際のシートの縦横の大きさはいかほどでしょうか。「数式バー」で編集可能な文字列の長さには限りがあります。この方法では実用に耐えない場合、VBAマクロでユーザ定義関数を作成しセルでそれを参照するという方法を検討してください。

既存の関数のみで行う場合、結果は連続した文字列として1個のセルに表示することになります。単純化のため、ご例示のシートをさらにコンパクトにします。カラムが揃わない場合、メモ帳に貼り付けてご覧ください。

*| A|B|C|D|E|
1|  |1|2|3|
2|車1|4|3| |
3|車2|7| | |
4|車3| | |5|
5|

E2に定義
=IF(B2<>"",$B$1&" ","")&IF(C2<>"",$C$1&" ","")&IF(D2<>"",$D$1&" ","")
以下、E4まで下へドラッグ

B5に定義
=IF(B2<>"",$A$2&" ","")&IF(B3<>"",$A$3&" ","")&IF(B4...続きを読む

Qエクセルでソートをしたときに何件中●件と出るようにしたい。

こんにちは、会社でエクセルを使っている者です。
以前までエクセルをソートで選択したときに
左下のところに何件中●件と表示されていたのですが、
色々使ってマクロなどを使用しているうちに、
表示されなくなりました。。。。とても不便です。
表示される方法はありませんでしょうか?
よろしくお願いしますm__m

Aベストアンサー

オートフィルタでのことでしたら、出なくなったブック内の計算式で
TODAY関数,NOW関数,RAND関数や縦列の集計関数が使われている場合、
「○レコード中 ●個が見つかりました。」は表示後にすぐ消える為、見た目表示されないように見えます。

http://support.microsoft.com/kb/401137/ja

代替策ですが。。。
http://support.microsoft.com/kb/881341/ja

Qエクセルの関数にて【今日の日付から3ヶ月後の日付を入力する関数とは?】

3ヶ月ごとに更新する契約書を作成しています。
ある日付からちょうど3ヶ月後の一日前が出るような関数を探しています。

例えば、
セルに今日の日付「9月6日」と入れると、そのとなりのセルには契約の切れる「12月5日」が出るようにしたいのですが、うまい具合に出来ません。

GOOの賢人様方、お知恵をお貸しください!

Aベストアンサー

アドインで分析ツールが組み込まれている場合は

=EDATE(A1,3)-1

そうでない場合は

=DATE(YEAR(A1),MONTH(A1)+3,DAY(A1))-1

ただし、11月30日をA1に入力した場合、答えが3月1日になってしまうようです。
(うるう年であれば2月29日となりOK)

Qコピー元をある条件のもと貼り付けたい

下の例で言いますとsheet1の黄色い部分(A2~A4)をコピーしてsheet2の黄色い部分(E5~E7)に張り付けたいのです。
sheet2の黄色い部分は毎回位置は変わりますがD列の数値が入っている部分(ここではD5)の隣を先頭にして張り付けたいのです。よろしくお願いいたします。

Aベストアンサー

こんにちは。

Sheet2 の黄色い場所を探すということでしょうか。
それで、D列の数値が入っていて、その右隣が「何もない」セルを探すということで進めていくことにします。一見簡単そうにみえて、ややこしい内容のようです。
説明していない、こちら側では見えてこない部分がありそうです。
ただ、後で直してほしいと言われそうですが、結局は作り直しになってしまうかもしれません。

'//
Sub TestSample1()
 Dim Src As Range
 Dim d As Range
 Dim rng As Range, c As Range
 Dim cnt As Long
 Dim flg As Boolean
 Dim f As Range
 With Worksheets("Sheet1")
  Set Src = .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
  If Application.Count(Src) = 0 Then MsgBox "元データがありません。", 48: Exit Sub
 End With
 With Worksheets("Sheet2")
  Set rng = .Range("D5", .Cells(Rows.Count, 4).End(xlUp))
  For Each c In rng
   If c.Offset(, 1).Value = "" And flg = False Then
    Set d = c: flg = True: cnt = 1 '空白行の先頭を見つける
   ElseIf c.Offset(, 1).Value = "" And flg = True Then
    cnt = cnt + 1  '空白行は連続しているものとし、その数を数える
   End If
  Next c
  If flg Then
   d.Offset(, 1).Resize(cnt).Value = Src.Resize(cnt).Value '値貼り付け
   cnt = 0: flg = False
  End If
 End With
End Sub
'//

こんにちは。

Sheet2 の黄色い場所を探すということでしょうか。
それで、D列の数値が入っていて、その右隣が「何もない」セルを探すということで進めていくことにします。一見簡単そうにみえて、ややこしい内容のようです。
説明していない、こちら側では見えてこない部分がありそうです。
ただ、後で直してほしいと言われそうですが、結局は作り直しになってしまうかもしれません。

'//
Sub TestSample1()
 Dim Src As Range
 Dim d As Range
 Dim rng As Range, c As Range
 Dim cnt As Long...続きを読む

QエクセルのSAM関数の「SAM」とは何かの略語なのでしょうか?

エクセルのSAM関数の「SAM」とは何かの略語なのでしょうか?
例えば、MAX関数であれば「MAX」が日本語で「最大値」だと分かります。
「AVERAGE」であれば、「平均」です。
詳しい方がいましたら、宜しくお願い致します。

Aベストアンサー

SUM は、最初、SUMMARY だと私も思っていました。しかし、Summary には、「合計」という意味はなく、要約するという意味です。現在、私自身は、数学用語の、SUMMATION =Σ (総和、合計)という語の省略形だと思っています。

Summation (サメイション) [数学用語]
the total amount or number when two or more things are added together.
[2つまたはそれ以上のものを一緒に加えた時に、その合計値または数値のこと]

ただ、この命名は、Microsoft ともロースタ社とも関係がなく、1970年代の後半、ハーバード大学ビジネススクールの学生、ダンブルックリンらによるもので、彼らはパテントなどの主張も出来ずに、大手の会社に取り入れられてしまい、その時のものが現在まで流用されています。したがって、誰も、その語源に対して主張ができません。

1980年代に、IBMから出ていた表計算の本に、SUM関数の出来た秘話も読んだことがあります。学生さんが、教授が、授業中に何度も黒板を書いたり消したりするのをみて、PCで、できたらと考えたそうです。当時、すでに大型コンピュータには表計算は存在していましたが、PCにはありませんでした。計算範囲の中に、文字列を入れても、エラーを出さずに、合計が出せるという所が、この関数の特徴です。

SUM は、最初、SUMMARY だと私も思っていました。しかし、Summary には、「合計」という意味はなく、要約するという意味です。現在、私自身は、数学用語の、SUMMATION =Σ (総和、合計)という語の省略形だと思っています。

Summation (サメイション) [数学用語]
the total amount or number when two or more things are added together.
[2つまたはそれ以上のものを一緒に加えた時に、その合計値または数値のこと]

ただ、この命名は、Microsoft ともロースタ社とも関係がなく、1970年代の後半、ハーバード大学...続きを読む

Qエクセルの件

エクセル2002で列の幅が標準と違う場合、列と列の間をクリックして数値を標準にするのですが、もっと簡単な方法はありませんか。

Aベストアンサー

適当な列(例えば標準幅の空き列)を選択して
ツールバーから[書式のコピー/貼り付け]ボタン(ハケの絵のボタン)を使ってできます

Qエクセル関数で使われる10^10とは何でしょうか。

エクセル関数で使われる10^10とは何でしょうか。

他の教えて!gooで書かれていた数式を用いてデータ取得には成功したのですが
関数の内容が知りたいのでわかるかたお願いします。

参考アドレス: http://oshiete.goo.ne.jp/qa/6085476.html
(以下参照文)
----------------------------------------------------------
例えばA1セルからE1000セルの間で数値の入っている下端のデータであれば次のように作業列を設けて求めることができます。
初めに1行目に新たな行を挿入します。
A1セルには次の式を入力してE1セルまでオートフィルドラッグします。

=MATCH(10^10,A2:A1000)+1

----------------------------------------------------------

上記に出てくる10^10は何を表わしているのでしょうか。。
どうぞよろしくお願いいたします。

Aベストアンサー

10^10とは10の10乗で100億です。

=MATCH(10^10,A2:A1000,1)

100億より小さい数字で最大のものを求めるということで、その表で最大値が決まっていれば、それより大きい数字であれば何でもOKです。

ちなみに、MATCH関数で、照合の型に 1又は省略の場合、昇順になっていない場合、検索値より小さいもので、一番下のものの位置を返します。

Qチラシ作成の件

パソコンでチラシを作っているのですが、エクセルで今は作ってますがやはり画像ソフトで作ったほうがいいですか。

Aベストアンサー

フリーソフトの「Print Album」はいかがでしょうか?
http://www.vector.co.jp/magazine/softnews/040602/n0406022.html

印刷イメージそのままレイアウトが出来ますし、
画像のトリミングにもある程度対応してますから。

参考URL:http://www.vector.co.jp/magazine/softnews/040602/n0406022.html

Qワークシート関数とはどのことなのですか?

【1】エクセルのワークシート上で使う=TODAY()などの関数

【2】VBAのCountなどのWorksheetFunction

【3】VBAのLENなどの関数

どれのことを俗に言う「ワークシート関数」と言うのでしょうか?
VBAで使う【2】【3】のことですか?

Aベストアンサー

ワークシート上で使う関数のこと。つまり1です。

Qエクセル集計の件

初めまして。
質問させていただきます。
Office2003を使用しています。

2交代のシフト表フォーマットを作成しています。
従業員の仕事能力を1~5段階でランク付けし、その日その日で平均能力の低い日を自動で探してくれるような数式を探しています。
参考書等読んでみたのですが、わからなかったので・・。
ちなみに40人の従業員で8時~24時までの会社です。

Aベストアンサー

1日のところで説明します。
(A能力┃8872277108で言うと、左の8に該当するとこです)

=SUMIF(検索条件範囲,"=A",計算範囲)

検索条件範囲には、縦に「A〇AB〇」となっているところを指定
計算範囲には、縦に「52325」となっているところ(能力)を指定

で、出来ると思います。


人気Q&Aランキング

おすすめ情報