COUNTIFSの条件に日付を指定する方法

このQ&Aのポイント
  • Excel 2017のCOUNTIFS関数を使用して、特定の日付範囲でデータを絞り込む方法について質問します。
  • 具体的には、Excel 2007のCOUNTIFS関数を使用して、2つの月日で範囲を指定してデータを絞り込むというマクロを作成しています。
  • しかし、条件値の指定方法について試行錯誤している中で、期待する結果が得られずに困っています。日付の指定方法について、助言や指示があれば教えていただきたいです。
回答を見る
  • ベストアンサー

COUNTIFSの条件に日付を指定する方法

Excel 2007 の COUNTIFS 関数 の条件として 2つの月日で範囲 として データを絞り込むマクロを記述しています 外部からExcel2007形式(.xlsm) 形式のsheet1を読みこみ sheet2 に記述した条件値とCOUNTIFSの条件値と比較しよう としています。 尚、比較対象は sheet1 のA列「出荷時期」のデータで 書式設定は 標準となっていて 文字列データです。 【sheet1】     [A]     [B]      [C] ヘッダ 出荷時期  商品分類   サイズ  [1]  '2014/04  一般     L [2] '2014/05   一般     M [3] '2014/06   特別     M 【Sheet2】 ・B列に =COUNTIFS( Sheet1!$A$1:$A$3,$A2)のように  条件値の$A2の"2"の所を行によって変えて入力してます。     [A]    [B]              [1] 出荷時期   件数   数式の検証=Excelの評価結果              [2] ">=2014/04"   0   """>=2014/04""" [3] >="2014/04"   3   ">=""2014/04"""   [4] >="2014/05"    3 ">=""2014/05"""   ==>>  ""をとる、演算子と 文字列の間に半角スペースを入れる と [5] >=2014/04    0 ">=2014/04"     [6] >= 2014/04   3 ">= 2014/04"     [7] >= 2014/05    3 ">= 2014/05" ==>> アスタリスクをつける 等。 [8] >=2014/04*    2 ">=2014/04*" [9] >=2014/05*    1 ">=2014/05*"    [10] >=2014/06*    0 ">=2014/06*" ==>>  演算子と文字列の間に'(シングルクォーテーション)をつける [11] >='2014/04    2 ">='2014/04" [12] >='2014/05    1 ">='2014/05" [13] >='2014/06    3 ">='2014/06" ==>>  文字列操作関数を入れる [14] >= & DATE(2014,4,1) 3 ">= & DATE(2014,4.1)" (注) 文字列関数を使う方法は http://www.relief.jp/itnote/archives/excel-countif-date-less-greater-than.php の例を参照しました。この方法は sheet1 の出荷時期データが日付データである必要 があるようです。 上記のようにいろいろと条件値のシンタックスを変えて試してみましたが期待する結果 になりません。 sheet1から入力する 出荷時期の元のデータが文字列の部分に修正を加え、日付 データに修正すると sheet2 の件数の値が変わるので元データを修正する方法 もあるかもしれません。 ただし 基本的にには 元データには 手を加えない 方法で対処したいと思います。 条件値の指定を どう記述すれば、利用者が自然に期待した通りの結果が得られるのか ご存知の方があれば教えてください 以上 

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.6

前の回答の訂正と補足です。 >Sheet2 のA2 が 「>=2014/04」では カウント0 となります。  なので >= で比較した時   (Sheet1のA1の文字列) 「’2014/04」< (Sheet2のA2の数字や日付シリアル値)である「2014/04」 が成りたっているのでしょうか?  再度検証したところ、COUNTIF関数では、以下のような挙動をしているようです。 「>=2014/04」のような条件を入力すると、条件式の2014/04の部分が日付(2014/4/1)と自動判定され(この数式の場合は分数と判定されない)、Sheet1のデータの中の数値部分(日付)部分だけの大小を判定するため、文字列データだと該当データがないことになり「0」が返ることになります(2014/4/1以降の日付を入力すると1とカウントされます)。  一方、「>=2014/04*」のような検索値が文字列(数値と認識できない形)になっている場合、文字列データだけの大小を判定しますので、数値やシリアル値が入っていても「以下」の条件でもヒットしないことになります。 >ただ実機では以下のようになり、等号が使えないので見た目が通常の以上や以下の形で表現できないので惜しいですが以下の指定方法でも何とか納得できるレベルだと思います。 たとえば、検索値は「’2014/04」のように入力し、数式を以下のようにすることですっきりした数式にすることができます。   =COUNTIF(Sheet1!A:A,">"&A2&"*") ただし、「以上」の条件の場合に(以下の時は問題ない)1日前の日付を入力できないなら、COUNTIF関数でその値そのもののカウントを加える数式にすることでご希望の処理ができます(開始月と終了月をセルに入力)。 >この場合は2014/03* とすると文字列同士の比較と評価され、"2014/04 > "2014/03 "となって カウント3となる という訳ですよね? その通りですが、以上の場合は条件値のほうが大きいとみなされるため、上記のような工夫が必要となりますが以下の場合は問題なく計算できます。

その他の回答 (5)

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.5

Q1 まず基本的な考え方として  <中略> セルの個数が返される というこ理解で正しいでしょうか? A1 その通りです。 Q2 この方法は凄いテクニックだと思います。 重ねてお聞きして恐縮ですがもし演算子も含めて、取り込ませる ようにするにはどう修正したらよいかご存知でしたら教えてください。 A2 SUMPRODUCT関数では出来ませんね。  やるのだとしたら、VBAでユーザー定義関数を作ったほうが簡単かもしれません。 Q3 今回のテクニックは 指定できる条件は2個だけでなく*でつない  でいくらでも指定できるのでしょうか? A3 条件は複数つなげるのも可能です。ただ計算にメモリーを使うため  条件が多かったり、同様の数式を多量に使う場合、EXCELが重くなり  正常に動かなくなる可能性があることを、考える必要があります。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

ANo.1です。 > (3)最後にWORK列を削除 削除してしまうと、条件を変更した時にもう一度作業列を作るところからやり直す必要がありますので、非表示にして隠すことをお勧めします。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

文字列として入力した「2014/04」のような文字列はExcelが日付あるいは分数として認識するため(今回のケースは分数と判断します)COUNTIF系の関数で大小を判定する場合は、この数字が基準となります。 一方、COUNTIF系の関数では、文字列の大小を比較することもできますが、この場合は基本的に並べ替えの順で大小が判定されます(文字コード順に大小が判定されますが、今回のように桁数の決まった数字なら問題ありません)。 このような仕様になっているため、文字列は数字や日付シリアル値よりも大きいと判定されるため、今回のような結果になります。 具体的な解決策ですが、「2014/04」を文字列として認識させるために「>=2014/04a」のように適当な文字(空白はダメ)を追加すれば、この条件で大小関係を判定できるようになります。 同様に「'」を適当な場所(例:2014の前)に追加した場合も同じです。 しかし、このように末尾に何か追加した場合は「2014/04」の文字列よりも大きいデータと認識されるため、「2014/04」のデータは含まれない数字になります。 すなわち簡便に対応するなら「以上」の条件ではなく「>2014/04a」のように「よりも大きい」条件にすれば通常の数式で計算することができます。

kazusmo
質問者

補足

早速の回答頂き有難うございます。ご教示頂き有難うございます。 恐縮ですが以下の点確認させてください。 Q1  >文字列は数字や日付シリアル値よりも大きいと判定されるため、 >今回のような結果になります。  この点は 実機で確認すると sheet1 のA1:A3が「文字列の数字」で '2014/04 Sheet2 のA2 が 「>=2014/04」では カウント0 となります。  なので >= で比較した時   (Sheet1のA1の文字列) 「’2014/04」  < (Sheet2のA2の数字や日付シリアル値)である「2014/04」 が成りたっているのでしょうか? ここがよくわかっていません。 ただ実機では以下のようになり、等号が使えないので見た目が 通常の以上や以下の形で表現できないので惜しいですが 以下の指定方法でも何とか納得できるレベルだと思います。 条件    件数 >2014/03* 3 >2014/04* 2 >2014/05* 1 となります。  この場合は2014/03* とすると文字列同士の比較と評価され、 "2014/04 > "2014/03 " となって カウント3となる という訳ですよね? 以上

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

COUNTIFS関数にこだわらないなら =SUMPRODUCT((DATEVALUE(Sheet1!$A$1:$A$3&"/1")>=$A2)*1) 上記でかつサイズがMなら =SUMPRODUCT((DATEVALUE(Sheet1!$A$1:$A$3&"/1")>=$A2)*(Sheet1!$A$1:$A$3="M"))

kazusmo
質問者

補足

まず 早速の回答有難うございます。ご支援頂き非常に感謝しております。 Q1 まず基本的な考え方として SUMPRODUCT関数を使って複数条件に合致するセルをカウント 式 SUMPRODUCT((配列1=条件1)*(配列2=条件2)) ということなのですね &”/1” の所が何をしているのかわかりにくかったのですが 出荷時期のデータ が 2014/04 という形式なので "2014/04" & "/1" で "2014/04/1" にしてから DATEVALUE関数で シリアル値にしてそれが sheet2のA2セル の日付データ以上かどうか判定 して *1で 日付以上のデータは すべて条件2でも真になるということでしょうか この場合sheet1 のセル範囲というか配列 A1:A3 のなかで条件にあう セルの個数が返される というこ理解で正しいでしょうか? Q2 この方法は凄いテクニックだと思います。ただ今回は  sheet2 の条件値$A$2の所で >=の演算子も含めて以上、  以下など指定させてそれに応じてカウントしたいと思っています  実機で「>=2014/04」 と入れてみますと個数は0になってしま  いました。他にも色々値のシンタックス変えてみましたが期待  するようには評価されませんでした。 重ねてお聞きして恐縮ですがもし演算子も含めて、取り込ませる  ようにするにはどう修正したらよいかご存知でしたら教えてください。 Q3 今回のテクニックは 指定できる条件は2個だけでなく*でつない  でいくらでも指定できるのでしょうか? 上記の点 教えて頂きたくよろしくお願い致します

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

Sheet1に出荷時期を日付のシリアル値で表す作業列を作ってみては? 添付の図では、Sheet1のD列を作業列として使い、D2セルには↓の式を入れて、書式を日付にしています。 =DATEVALUE(RIGHT(A2,7)&"/1") Sheet2のA列出荷時期は >=2014/04 の様に記入し、B2セルの式を↓のようにしてあります。 =COUNTIFS(Sheet1!D:D,A2&"/01")

kazusmo
質問者

補足

早速の回答頂き有難うございます。ご教示頂き有難うございます。 (1)sheet1 をチェックして、「出荷時期」を格納した 作業列があったら列の最後に作業列を作ってDateValue で日付データ を入れておく。 (2)実行時に、列を識別し、出荷時期の列だけは最後のWORK 列を COUNIFSの抽出範囲にして、各行の値と比較 (3)最後にWORK列を削除 ということですね? 有難うございます。 条件値を工夫する方法でやろうとすると無理 がありそうなので、この方式で切り抜けたいと思います 有難うございました   すべての処理が終わったら作業列WORKを削除する

関連するQ&A

  • COUNTIFS関数で日付データを数えたい

    COUNTIFS関数で日付データを数えたいのですがうまくいかず悩んでいます。 以下のようなデータがあります。 A列       B列 9月1日(日)  件数 9月2日(月)  件数 9月3日(火)  件数 9月4日(水)  件数 データはデータシートに A列 2014/9/1 21:32 2014/9/1 21:31 2014/9/2 20:31 2014/9/2 21:26 2014/9/3 19:25 2014/9/3 21:30 2014/9/4 18:10 このような形にあります 上以外にも条件があるのでCOUNTIFS関数で件数をかぞえようと思い 9月1日の件数を数えるB1に (1) =COUNTIFS(データ!A1:A7,">=A1",データ!A1:A7,"<A2") といれてみましたがうまくいきません。 (2) =COUNTIFS(データ!A1:A7,">=2014/09/01",データ!A1:A,"<2014/09/2") とすると件数がでてきました。 日付データを直接入力せず (1)のようにセルで入力するにはどのようにすればいいのでしょうか また、他に方法があれば教えていただけないでしょうか よろしくお願いいたします。

  • COUNTIFS関数について

    お世話になります。 3つ以上の条件を含む式の間違いが分かりません。 =COUNTIFS(sheet1!A$1:A$200,E$1,sheet1!C$1:C$200,"2",sheet1!G$1:Q$200,B3) のようなブック内の別シートを3つの条件に合うデータ件数を集計したいのですが、#value!が出ます。 ( )内の3つの条件をばらして、 =COUNTIFS(sheet1!A$1:A$200,E$1) (1) =COUNTIFS(sheet1!C$1:C$200,"2") (2) =COUNTIFS(sheet1!G$1:Q$200,B3) (3) および =COUNTIFS(sheet1!A$1:A$200,E$1,sheet1!C$1:C$200,"2") は、正しく計算できるのですが、なぜか(1)~(3)を一つの式にすると、エラーになります。 何が悪いのでしょうか。

  • Excel2007でCOUNTIFS前ゼロ否定条件

    Excel2007 のCOUNTIFS関数での否定条件の 指定方法について教えてください。 VBAのマクロの中で  (略)  For i = 1 to 10    Cells(i, "B").Formula = "=COUNTIFS(" & "A1:A10, $C$" & i & ")"  Next i   のような形で COUNTIFSを利用しています。    COUNTIFSの条件に <>を使って否定条件を指定したいのですが、以下の  ように期待した動作になりません。     例   A      B       C        D            1 '080  一般品    <>'080      =COUNTIFS(A1:A5,C1)  2 '020  一般品    <>一般品  =COUNTIFS(B1:B5,C2) 3 '040  一般品 4 '060   特別品  5 '080    一般品  セルC1の記述を変えた結果は以下の通りです。       C1      D1      備考 1)  <>'080   5    3 が入ってほしい。 2)  <>080   5    ' の有無で結果は変わらず。     '(シングルクォーテーション)は接頭辞で上記結果には無関係と理解。 3)  "<>'080"   0    "<>'080" 全体を条件値として認識してしまう。 4)  '080      2   当然 5)  <='060    3   当然   ちなみに C2に <>一般品 と条件を設定すると D2には1と期待通りの値が入ります。  1)2) の結果から A列に記述されている'080と セルC1の式に書か  れた '080 が、なぜか別の値と評価され 結果 D1が 5 となっていると理解しています。 A列のシングルクォーテーションは削除、A列の書式を文字列とし 文字列"080"とIF関数で比較すると以下の結果でした。   A    B     B列の式            1 080   FALSE  IF(A1<>"080",TRUE,FALSE)   2 020   TRUE IF(A2<>"080",TRUE,FALSE) 3 040   TRUE IF(A3<>"080",TRUE,FALSE) 4 060    TRUE  IF(A4<>"080",TRUE,FALSE) 5 080    FALSE IF(A5<>"080",TRUE,FALSE)   Excelの「数式」メニュー -「ワークシート分析」-「数式の検証」で C1セルに <>'080 、<>080、"<>'080" 、<='060 を指定した時、それぞれ 1) COUNTIFS(A1:A5,"<>'080")   2) COUNTIFS(A1:A5,"<>080")   3) COUNTIFS(A1:A5,"""<>'080""") 5) COUNTIFS(A1:A5,"<='060")  と評価されています。   また VBAのテクニックを解説するWebなどでは、"<>"と値'080を& でつなげる方法も紹介されていましたが、上記の場合結局 COUNTIFS(A1:A5,"<>080") → 5 と評価されて  しまいます。      文字列同士で比較すれば、期待する結果になりそうですが 条件の書き方には工夫がいりそうです。どのように記述すればよいでしょうか   お知恵をお借りしたくいと思います。どうかよろしくお願い致します。 以上

  • Excel2003におけるCountIFS関数

    Excel2003におけるCountIFS関数 Excel2007にはCountIFS関数というのがあり、一覧表から複数の条件を満たしたデータ(行)の件数をカウントできると思います。 この関数のExcel2003版は無いのでしょうか? クロス集計表を作成したいのですが、ピボットテーブルだと、件数がゼロ件の見出しは表示されないので、自分で手作りしたいと思っています。 教えて下さい。宜しくお願い致します。

  • Excel関数で複数条件指定時の式を教えてください

    Excel関数での複数条件指定時の式を教えてください。 A列   B列 DD     ID あ     あ 12    12 ー     11 11     ー ー    ー  このようなデータが入った表から以下の条件でデータを抽出できる関数はありますでしょうか? (1)A列に文字、数字が存在してB列にも文字、数字が存在するデータの件数を求める。 (2)A列に文字、数字が存在してB列に ー が存在するデータの件数を求める。 (3)A列に - が存在してB列にも ー が存在するデータの件数を求める。 ご存知の方がいらっしゃいましたらよろしくお願いします。 Excelは2003を使用しています。

  • エクセル、COUNTIFS関数の範囲指定について

    エクセル2010です。 「A1の文字列が、B列とC列の中から合致し、さらにD列の"○○"という条件を満たすものはいくつあるか」 という数式を作りたいです。 写真でいうと、B・C列の中から中央区があるかどうか、さらにその中に山田がいるか、という検索式です。 そこで、COUNTIFS関数を使い、fxボタンで半自動で作ったところ、 =COUNTIFS(B:C,A1,D:D,"山田") となったのですが、なぜか結果はエラーになってしまっています。 どうやら検索条件の範囲が「B:C」になっているのが問題なのか、B:BやC:Cだけにすると、ひとつの列なら正常に計算するようです。 そこで式を二つに分け、プラスでつなげてみました。 =COUNTIFS(B:B,A1,D:D,"山田")+COUNTIFS(C:C,A1,D:D,"山田") こうしてみると一応成功しました。 しかし動作が重くなり、処理に数秒かかるようになってしまいました。 (B:Bなどひとつの列なら、数式を記入した瞬間に結果がでます) できれば数式は短くシンプルにしたいので、前述の短い形式のようにならないものか、と思います。 COUTIFS関数で、検索範囲を「○列~△列」のようにできないものでしょうか? アドバイスをよろしくお願いします。

  • COUNTIFS関数 条件が日付の場合の入力方法

    いつも回答ありがとうございます。 別シートに一覧があります。この別シートから個数を算出し、集計用シートに個数を表示させようと思っています。COUNTIFSの記述方法通り【集計用のC4セルに=COUNTIFS(一覧!$D$8:$D$76,C3,一覧!B8:B51,B4)】に入力しましたが、結果がVALUEになります。日付の条件記述方法が間違っていると思われますが、何処が間違っているのか分かりません。御指導の程よろしく願い致します。 一覧 B8:B100 に日付 D8:D100 に商品名 集計用シート B4:B100 に日付が連番で入力されている C3:Q3 に商品名が入力されている 集計用シートのセル番地を使用して条件入力。

  • countifs関数

    countifs関数で複数条件に合うものをカウントしたいのですが たとえばA列にあるリンゴとミカンとバナナの中で B列にあるA商店 C列にある掛け売り といったようなカウントをする場合 どのように設定すればいいのでしょうか?

  • VBA にて、条件を指定して文字列結合

    条件を指定して文字列を結合させたく、ユーザー定義関数を作成しております。 第一段階として、ワークシート関数のCONCATENATEを、選択した範囲の文字列が結合されるよう、((A1:A5)の様に)、ユーザー定義関数(仮にCONCATENATERANGE)を作成しました。 平たく言うと、SUMIFのSUMの部分を、この、CONCATENATERANGEに置換えたものが作りたいのです。 検索条件を、数値、文字列、空白以外といった条件に限定すれば、望むものができたのですが、演算子(<>,<=,>=,<,>,?,*)までを考慮するとなかなか厄介で、、、 そこで、どなたかSUMIFをコードで書ける方はいらっしゃいませんか? 私が望む関数(仮にCONCATENATERANGEIF)そのものズバリをご教示いただければありがたいのですが、何かと面倒かと思いますので。 どうぞよろしくお願いいたします。

  • COUNTIFSについて

    EXCEL2007で、=COUNTIFS($U$2:$U$6012,">=1.3",$G$2:$G$6012,">=160") などと書きますが、2番目の条件の $G$2:$G$6012,">=160" を $W$397:$W$6012に,"高血圧"という文字が入っている場合とするには、どう記述するのでしょうか?

専門家に質問してみよう