マンガでよめる痔のこと・薬のこと

お世話になります。
以下のような表があるとします。

       項目1  項目2  項目3  項目4  項目5
サンプル1  ○          ○     ○
サンプル2       ○               ○

これらの右に列を設け、○の数をカウントします。
カウント1には項目1と項目3の列のみ。
カウント2には項目2と項目4と項目5のみの○をカウントしたいとします。
つまり以下のようにしたいわけです。


       項目1  項目2  項目3  項目4 項目5  カウント1 カウント2
サンプル1  ○          ○     ○         2      1
サンプル2       ○               ○     0     2


○をカウントするだけならCOUNTIF(B2:C4,"○")で出来ますが
今回のように飛び地を選択する方法がわかりません。
どのようにすれば多数の離れた範囲を選択できるのでしょうか?

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

A 回答 (7件)

#04です。

もしかしたら質問を読み違えたかもしれません。
実際のシートはもっと列が多いのかもしれませんね。
こんな式でもできますよ。

1行目のカウント1の式
=SUMPRODUCT({1,0,1,0,0}*(B1:F1="○"))

1行目のカウント2の式
=SUMPRODUCT({0,1,0,1,1}*(B1:F1="○"))

いずれも下方向にコピーです
    • good
    • 0
この回答へのお礼

zap35さん、再びありがとうございます。
ご推察の通り実際は列がもっと多い状況です。

この関数はすばらしいですね。
=SUMPRODUCT({1,0,1,0,0}*(B1:F1="○"))の場合ですと
項目1に○があれば1に、項目2には○があっても0に・・・
そしてそれらを合算する、という感じですね。

ただ、もしかすると他にも良いアイデアを頂けるかもしれませんので
しばらくは受付中にさせて頂きます。

お礼日時:2008/02/24 22:41

#6です。



対象列を間違えました。
例題は、1,3,5と2,4ではなく、1,3と2,4,5でしたね。
読み替えてください。

それと、最初の2行ですが、
「標準的な処理として#5さんのご回答を支持します」
というニュアンスです。
嫌らしい意味にも解釈できそうなので、念のため。
    • good
    • 0
この回答へのお礼

わざわざ補足ありがとうございます。

私の疑問はとりあえず解決したので
締め切ろうと思います。

ポイントについては悩みますね。
皆様、良解答ばかりですから。

今回の場合はzap35さんの案を採用しようかと思います。
deus_ex_machinaさんの案は今後活かして行きたいと思います。
esupuressoさん、hidewoさんもいろいろとありがとうございました。
今後ともよろしくお願い致します。

お礼日時:2008/02/25 00:42

私も#5さんと同様の回答をするつもりだったのですが、


既に出てしまったので別案を。

●乙案(甲案は#5さんのご回答ということで…)
列番号で指定する。

 カウント1
  =SUMPRODUCT((B1:F1="○")*(COLUMN(B1:F1)={2;4;6}))
 カウント2
  =SUMPRODUCT((B1:F1="○")*(COLUMN(B1:F1)={3;5}))

●丙案
項目名で指定する

 1行目に項目名が入力されているとします。
 カウント1
  =SUMPRODUCT((B2:F2="○")*(B$1:F$1={"項目1";"項目3";"項目5"}))
 カウント2
  =SUMPRODUCT((B2:F2="○")*(B$1:F$1={"項目2";"項目4"}))

※配列定数をセミコロン;で区切っている点に注意。

検索対象の列を列番号や項目名で指定できるので、
列が非常に多ければ利点があるかもしれません。

対象項目名をどこか別の場所に縦に書き出しておけば、
 =SUMPRODUCT((B2:F2="○")*(B$1:F$1=$X$2:$X$5))
のように参照することもできます。

以上ご参考まで。
    • good
    • 0
この回答へのお礼

なるほど、いろいろな方法があるのですね。
項目名で指定するのは後で見た場合に分かりやすいかもしれませんね。

大体わかってきましたが
SUMPRODUCT関数は奥が深いようですね。

いろいろありがとうございました。

お礼日時:2008/02/25 00:33

項目1はB列、項目2はC列…項目5はF列でいいですか



1行目のカウント1の式
=(B1="○")+(D1="○")

1行目のカウント2の式
=(C1="○")+(E1="○")+(F1="○")

いずれも下方向にコピーでいけると思います
    • good
    • 0
この回答へのお礼

こんなカウントの仕方があるとは初めて知りました。
これでも式が煩雑にはなりますが関数よりはすっきりしますね。
参考にさせて頂きます。

お礼日時:2008/02/24 22:17

なるほど、思ったより複雑のようですね。


でも、解決方法はあると思います。

1.解決方法1
単に合計したい項目を並び替える(列の順番を入れ替える)ことはできないのですか?これが一番、簡単ですよね。
もし、カウント1とカウント2で重複するものがあれば、それを真ん中の列においておけば、カウントの範囲を重複して選択することも可能ですよね。

2.解決方法2
項目を並び替えたくないなら・・・
○を1に変換し、◎を1000に変換するのは?
足してみて、23035となれば、○が35個、◎が23個となります。
もし○の数1000以上あるなら、◎を10000にしてもいいでしょうね。

いかがですか?
    • good
    • 0
この回答へのお礼

hideoさん、再びありがとうございます。

かなり柔軟な思考を持ってらっしゃるようですね。
頭の固い私にはものすごく参考になります。

まず解決方法1の方ですが並び換えは困難な状況です。
また重複するものが一つとは限らないので。

解決方法2の方ですが、これは使えるかもしれませんね。
出てきた値を計算すればいけるかもしれません。

ただ、計算の分、式が長くなりそうなのが難点です。
でも他に方法がなければ検討したいと思います。

お礼日時:2008/02/24 22:10

私の知る限り無理です。



対応方法としては、=COUNTIF(B2:B4,"○")+COUNTIF(D2:D4,"○")
などとするしかないです。
でも、これだと煩雑ですよね。

これは提案ですが、○を1などに一括置換してはいかがですか?
それならば単純なsum関数で
=sum(B2,D2,F2)
のように簡単になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
○を1にするとは発想の転換ですね。
いいアイデアです。
ただ、書いてなかったのですが実は記号には○以外にも◎なども使い、
○だけを飛び地で数えるなども行いたかったのでこの方法では無理そうです。
でも、参考になりました。

お礼日時:2008/02/24 20:25

一行目に項目列「項目1」「項目2」「項目3」「項目4」「項目5」


【A】列にサンプル1」「サンプル2」「サンプル3」「サンプル4」とした時・・・
【G2】には 「=COUNTA(B2:B4,D2:D4)」 項目1と項目3
【H2】には 「=COUNTA(C2:C4,E2:E4,F2:F4)」項目2・4・5を数えます
    • good
    • 0
この回答へのお礼

ありがとうございます。
COUNTAはデータの個数を数えるというものですね。
私の書き方が悪かったのですが
○以外にも◎なども使い、それぞれの数をカウントしようともしています。
そのため
=COUNTIF(範囲,○)+COUNTIF(範囲,◎)というのが浮かんだのですが
このうちの範囲が飛び地なのです。
なぜ○と◎に分けるかと言うと記号によって後で処理をするからです。
例えば◎のものは2倍にしたいとしたら
=COUNTIF(範囲,○)+2*COUNTIF(範囲,◎)
の様に。
ただ、範囲が飛び地だとできないのでどうにかならないか、と思った次第です。
=COUNTIF(セル1,○)+COUNTIF(セル2,○)+・・・とやっても良いのでしょうが式が長くなりすぎるのでどうにかしたいと。
そういうことは可能でしょうか?

あと私が最初に式を書き間違えましたが
集計する際はサンプル1とサンプル2で別々に集計したいのです。
つまり最初の例で言うと
サンプル1には項目1・3・4に○があるので
カウント1は項目1と3の○の数なので2となるわけです。

お礼日時:2008/02/24 20:35

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QCOUNTIF関数 離れたセルを選択したい

A列に
10
10
11
11
12
12

がはいっていて、
1行目、3行目、5行目が10以上の数を数えたいのですが
=COUNTIF(A1,A3,A5,">10")
のように離れたセルを選択することは出来ないのでしょうか?

エラーになるようです。
COUNTIF関数じゃなければ可能ですか?

Aベストアンサー

No.1 さん、No.2 さんのご回答で、正しい答えが出ます。No.3 さんの数式については、名前を付ける範囲が連続したセル範囲である場合には、COUNTIF 関数が正しく機能します。

そのほか、作業列を使って答えを出す方法もご紹介します。添付図では、次式を記入しています。

B1 1
C1 =(a1>10)*b1
C8 =sum(c1:c6)

1 行おきに「1」を記入する方法の一例。B1 セルに「1」を記入した後、B2 は空白のままの状態で、B1:B2 のセル範囲を選択。次いで、キーボードの Ctrl キーを押しながら右下隅の角を下方向にドラッグすることで、1 行おきに記入されます。

なお COUNTIF の仕様では、第 2 引数までしかありません。したがって質問文のように、第 4 引数まで持たせた数式を書くことはできません。定められた以外の方法で関数を使っても正しい答えが出ないというのは、ごく当然の結果です。

Qcountif関数で離れた場所を検索範囲にする。

countif関数で離れた場所を検索範囲にしたいのですが、いい方法がありますか?

普通に範囲指定するとA1:F6のようにはできますよね。
2列おきに範囲指定するよい方法はないかと思っています。どなたか教えていただけませんか?


 A B C D E F





Aベストアンサー

いくつか考えてみました。
 (COUNTIF1つで出来る方法は見つかりませんでした。)
気に入る方法があればいいですけど。

1.範囲毎に分ける
=COUNTIF(A1:A6,">5")+COUNTIF(D1:D6,">5")
又は
=SUMPRODUCT((A1:A6>5)+(D1:D6>5))

2.Mod関数とColumn関数を利用する。
  列番号を3で割った時の余りが1で、値が5より大きいセルの個数
=SUMPRODUCT((MOD(COLUMN(A1:F6),3)=1)*(A1:F6>5))
  (こちらは普通の関数。入力後、[Enter]で確定)
又は
=SUM((MOD(COLUMN(A1:F6),3)=1)*(A1:F6>5))
  (こちらは配列数式。入力後、[Enter]の代わりに[Ctrl]+[Shift]+[Enter])

3.VBAでユーザー関数を作成
=Countif2(">5",A1:A6,D1:D6)
(Countif2(条件,セル範囲1,セル範囲2,・・・・)

標準モジュール
Function COUNTIF2(条件, ParamArray セル()) As Long
  Dim i As Long
  For i = 0 To UBound(セル)
    COUNTIF2 = COUNTIF2 + Application.WorksheetFunction.CountIf(セル(i), 条件)
  Next i
End Function

すべて同じ結果になります。
・SUMPRODUCTと配列数式は列全体の指定は出来ません。A:F等
・2列分位なら範囲毎に指定してもいいと思います。

いくつか考えてみました。
 (COUNTIF1つで出来る方法は見つかりませんでした。)
気に入る方法があればいいですけど。

1.範囲毎に分ける
=COUNTIF(A1:A6,">5")+COUNTIF(D1:D6,">5")
又は
=SUMPRODUCT((A1:A6>5)+(D1:D6>5))

2.Mod関数とColumn関数を利用する。
  列番号を3で割った時の余りが1で、値が5より大きいセルの個数
=SUMPRODUCT((MOD(COLUMN(A1:F6),3)=1)*(A1:F6>5))
  (こちらは普通の関数。入力後、[Enter]で確定)
又は
=SUM((MOD(COLUMN(A1:F6),3)=1)*(A1:F6>5))
  ...続きを読む

QExcelで飛び飛びのセルにある文字をカウントする

jcb3092と申します、教えて下さい。

Excel2002を使用しています

飛び飛びに離れた場所のセルに入っている特定の文字

例えば"○""×""△"等を指定してカウントする関数がありまし

らご教授頂けますようお願い申し上げます。

Aベストアンサー

関数と、ちょっとした応用で可能です。

カウントしたいセルを全部選択して、範囲名を設定する。
でもって、COUNTIF関数でカウントさせる。

例:
 A1:A5セル、B4セル、C1:D10セルを Ctrlキーを押しながら選択する。
 「名前ボックス」に "積算範囲" と入力し、選択した範囲に名前を定義付ける。
 =COUNTIF(積算範囲,"○")
 などと関数を入力する。

※ 名前ボックスは、A1セルを選択すると左上に A1 と表示される場所です。

定義付けした範囲名は、
 挿入 → 名前 → 定義
で編集できます。

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?

QVLOOKUP関数の範囲に、複数の範囲を指定したい

VLOOKUP関数の範囲に、複数の範囲を指定したいのですが方法がわかりません。
例えば同じシート内のC3:L8の範囲とM3:V8の範囲とW13:AF18の範囲を同時に
検索範囲として指定したいと考えております。

選択範囲に名前をつけて定義し、それを範囲として指定してみても、
なかなか上手くいきません。

効果的な方法があれば、御教鞭頂きたく思います。

Aベストアンサー

ごめんなさい。手抜きですね。
以下が条件です。

検索値がA1にある
検索範囲の中で検索値に合致する値が複数ない

=IF(ISERROR(VLOOKUP(A1,C3:L8,2,0)),IF(ISERROR(VLOOKUP(A1,M3:V8,2,0)),IF(ISERROR(VLOOKUP(A1,W13:AF18,2,0)),"",VLOOKUP(A1,W13:AF18,2,0)),VLOOKUP(A1,M3:V8,2,0)),VLOOKUP(A1,C3:L8,2,0))

最初の範囲で検索値に一致する物がなければ、次の範囲を探します。
その繰り返しです。
最終的にどこにもなければ空白です。

返す値の列番号は範囲の中で左から2番目です。
たとえば最初の範囲なら、D列の値が帰ります。

Qエクセル 飛び地のカウント

同じような質問を見つけたのですが、それでも解決できなかったので、改めて質問されていただきます。
------------------------------------------------------
【売上表】
    北海道        東北        関東  
  売上数 売上高   売上数 売上高  売上数 売上高 
魚    2      10      4     20       0      0
牛    10    1000      0      0      40      4000
豚    20    2000    90     9000      0      0
------------------------------------------------------

上のような表の中で、魚・牛・豚の売上数が0以上の件数を出したいと思います。
売上数別に並び替えてカウントイフを使えばいいのですが、できるだけ現状のままで行いたいのです。

配列の
{=COUNTIF((IF($J$5:$X$5="売上数",J7:X7,"")),">0")}
が使えればいいのですが、カウントイフは配列で使えないようで、こまっています。

また、
=COUNTIF(J8,">0")+COUNTIF(M8,">0")+COUNTIF(P8,">0")
の方法もあるかと思いますが、量が多く、間違えてしまいそうです。

ミスを防ぐために何か方法があればお教えください。
どうぞよろしくお願いいたします。

同じような質問を見つけたのですが、それでも解決できなかったので、改めて質問されていただきます。
------------------------------------------------------
【売上表】
    北海道        東北        関東  
  売上数 売上高   売上数 売上高  売上数 売上高 
魚    2      10      4     20       0      0
牛    10    1000      0      0      40      4000
豚 ...続きを読む

Aベストアンサー

=SUMPRODUCT(($J$5:$X$5="売上数")*($J6:$X6>0))
または
{=SUM(IF(($J$5:$X$5="売上数")*($J6:$X6>0),1))}

Qエクセルで条件に一致したセルの隣のセルを取得したい

下のような「得点」という名前のシートがあります。
(「田中」のセルがA1です。)

 [ 田中 ][ 10 ][ 200 ]
 [ 山田 ][ 21 ][ 150 ]
 [ 佐藤 ][ 76 ][ 250 ]
 [ 鈴木 ][ 53 ][ 350 ]

別のシートのA1セルに、「佐藤」と入力すると、

 [ 佐藤 ]

「得点」シートから「佐藤」の列を見つけて、B1、C1に

 [ 佐藤 ][ 76 ][ 250 ]

のように表示させたいのですが、B1、C1にはどのような式を書けば良いのでしょうか。
「得点」シートでは氏名が重複する事はありません。
IF文を使うと思うのですが、いまいち良く分かりませんでした。

よろしくおねがい致します。

Aベストアンサー

こんにちは!
VLOOKUP関数で対応できます。
IF関数と併用すればエラー処理が可能です。

Excel2007以降のバージョンであれば
B1セルに
=IFERROR(VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0),"")
としてC1セルまでオートフィルでコピー!
そのまま下へコピーすると行が2行目以降でも対応できます。

Excel2003までの場合は
=IF($A1="","",VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0))

としてみてください、m(_ _)m

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

QSUMIF関数で、「ブランク以外を合計」を指定したい

SUMIF(範囲,検索条件,[合計範囲])
の、検索条件部分に、
「セル内に数字、文字をとわず、とにかく何か入力されていたら合計する」
といった意味合いの条件を指定したいのですが、その方法がわかりません。

画像で説明させていただくと、
A2のセルにSUMIF関数を用いて、
文字が入力されているc,d,e列の数値を合計し、
90という結果が欲しい、ということです。

どなたかご教授をお願いいたしますm(__)m

Aベストアンサー

こんばんは。

なんか皆さん難しく考えすぎのような・・・
SUMIF関数でできますよ。検索条件を空白以外とすればいいだけです。
=SUMIF(B2:F2,"<>",B1:F1) でできます。

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング