goo blog サービス終了のお知らせ 

エクセル備忘録

質問が多いがテキストでは説明しづらい内容と、
超高度な技の紹介

うるう年って?

2008-07-13 03:40:16 | Weblog
某サイトに以下の質問
--------------------------------------------
~課題EX3~
1.A4に西暦を入力すると、その年の1年間の日数がB4に表示されるようにしなさい。
※0以下の数字は入力しないものとする。例えばA4に2008と入力すればB4に366と表示されるようにする。
ヒント:IFを複数使う。うるう年は4年に1度だが、100で割り切れる年はうるう年ではなく、400で割り切れる年はうるう年である。割り切れるかどうかを判定→MOD関数(余りを求める関数)を使う。
例:MOD(13,5)=3(13÷5=2余り3)、MOD(4,3)=1(7÷3=2余り1)となる。

2.A4に西暦を入力すると、西暦1年から数えて何回うるう年があったかをC4に表示されるようにしなさい。
ヒント:切捨てを行う、ROUNDOWNを使って計算するとよい。
ROUNDOWNは切り捨てを行う関数。例:ROUNDDOWN(123.45,0)=123となる。
----------------------------------------------------------------------
Aさん
そもそも
>うるう年は4年に1度だが、100で割り切れる年はうるう年ではなく、400で割り切れる年はうるう年である。
というグレゴリオ暦が制定されたのは1582年でそれ以前は別の方法によっているし国によってもばらばらなんですが…
ごもっとも
-----------------------------------------------------------------------
Bさん
1.=DATE(A4+1,1,1)-DATE(A4,1,1)
2.=INT(A4/4)-INT(A4/100)+INT(A4/400)
アレンジしてください。
課題に沿った答えからはわざと外しているので。
まぁ、Excelの問題というよりは、考え方の問題ですよね。
Cさん
=AND(MOD(A1,4)=0,OR(MOD(A1,100)<>0,MOD(A1,400)=0))
=SUM((MOD(ROW(A1:A2008),4)=0)*((MOD(ROW(A1:A2008),100)<>0)+(MOD(ROW(A1:A2008),400)=0)))
ctrl+shift+enterで確定
Dさん
学校の課題を自分でやらずに
回答者にやらせるのはやめましょう。
暦の決まりは度外視して
1
=365+((MOD(A4,4)=0)*(MOD(A4,100)<>0))+(MOD(A4,400)=0)
2
=TRUNC(A4/4)+TRUNC(A4/400)-TRUNC(A4/100)
Bさんと同じく
あえてヒントからはずれた回答をしています。
------------------------------------------------------------------
Eさん
お晩です。
スレ主さん
学校の宿題は既に学習している問題です。
「ひょーどる」さんが分かり易く明確に指摘しています。
貴方の質門が不明確です。
一見、IF関数とかMOD関数を使用する内容なのでExcelを使用して求めるものと誤解しやすい内容です。
Excelでの日付関数を求める範囲は「1900/1/1」をシリアル値「1」として計算しておりますので、それ以前の西暦1年の計算は出来ません。
西暦年での閏年を求めることについては、Aさんが明確にご指摘しているとおりです。
西暦年のみ取り出し計算するのは、Aさんがご指摘している内容に反します。
当初、私はグレゴリオ暦をユリウス日に変換計算 (ユリウス日 <-4712年1月1日(BC4713年)から起算> への変換計算はちと面倒 ? ) で求められると思いましたが、ちと無理です。
Excelでは1900/1/1以前の日付は文字列として扱われるため。
もし、貴方の質門内容に誤りがないと仮定した場合、宿題を出した先生は何を考えての宿題なのか不明ですので、再度先生に質問しては。
Excelでは、1901以降は下記の式で求められます。(グレゴリオ暦をユリウス日に変換した日付けの場合は、OK ?? 例 : グレゴリオ暦「2008/1/1」は、ユリウス日「2454466.5日」)
=IF(OR(AND(MOD(A4,4)=0,MOD(A4,100)<>0),MOD(A4,400)=0),"366日","365日")
ごもっとも
-----------------------------------------------------------------------
Bさん
あくまでも関数(MOD、ROUNDDWON)の使い方の練習でしょ。
それにクイズ ヘキサゴンの計算問題と同じく計算の過程が加味されるだけ。
Eさん
>あくまでも関数(MOD、ROUNDDWON)の使い方の練習でしょ。
関数の使い方なら論理関数の使い方
-----------------------------------------------------------------------

Excelも暦もわからない人が教鞭をとっているのですね。
なんかがっかりしてしまいます。
間違った知識&使い方で覚えてしまうというのは痛手だな~
以前にもありましたね、おかしな宿題のスレッドが。

これについて噛み付くアホがいた!
-----------------------------------------------------------------
□投稿者/ 知ったかぶり、御託を並べる -(2008/07/12(13:08))
□U R L/

10M四方の土地の面積は?
上の方は

地球は球体なので表面積を考えると100平方メートルではない
と言うような御託を並べているだけなのでは?


簡単に
>うるう年は4年に1度だが、100で割り切れる年はうるう年ではなく、
>400で割り切れる年はうるう年である
と言う条件で、式をたてる勉強をしているだけなのでは?

論理演算ではなく、IF関数を使用してと言うことなのでは
--------------------------------------------------------------------
私のことを「知ったか」扱い(;´Д`A ```
しかも例えがアホそのもの
切れかかる感情を抑え、冷静に以下のレス
--------------------------------------------------------------------
御託というか…
こういった宿題を出すと西暦4年がうるう年だと学生が勘違いする
可能性があるということをいいたいだけです。

前提の話として、AさんやEさんがレスされていることが
説明されていて、Excelのシリアル値についての講義がなされた上で
出された宿題なら何もいわないです。

ヒントを見てもExcelに精通した人が出した宿題でないことはわかるでしょ。

あとExcelでは1900/2/29が存在しますので(1904年から計算する、を省く)
この日を含むうるう年関係の計算をシリアル値で行った場合、
1日ずれる場合があることも補足しておきます。

私なりの回答も載せておきます。
(グレゴリオ暦を西暦1年まで当てはめたとして)
この場合、Excelにシリアル値で計算させるには2000年足して
計算させればいいわけで、A4に西暦年を入力
A4の西暦年の1月1日までのうるう日の回数は
=(DATE(A4+2000,1,1)-"2001/1/1")-(A4-1)*365
となります。

A4がうるう年のとき数える場合、これに1加えるわけで
=(DATE(A4+2000,1,1)-"2001/1/1")-(A4-1)*365+(DAY(DATE(A4,3,0))=29)
となります。

日付の計算はシリアル値が基本ですので、Excelが直接シリアル値で
取り扱わない日付の対応には柔軟な発想を必要とします。
---------------------------------------------------------------------
そりゃあさ~最近掲示板からは遠ざかっていたけど昔からいる人なら
「知ったか」は無いと思うよ、新参者さん、(='m') ウププ
私に噛み付こうなんざ4年は早いよ!

非復元抽出の確率計算

2007-09-29 19:25:49 | Weblog
お世話になります。
確率の計算式がわからないので、教えていただきたく書き込ませていただきました。

福引のような抽せんがあります。
例えば、50個(母数)の中に当たりが5つ(当たり数)あり、2回抽せん(抽せん回数)することができるとします。
1回抽せんすると、出た玉は戻さないので、2回目の母数は49個になります。

このような場合、少なくとも1回は当たりを引く場合(答え)の計算をしたいと思っています。

セルA1に抽選回数
セルB1に母数
セルC1に当たり数

がある場合、
D1に答えを出したいのです。

このような場合、D1にはどういった計算式を入れればよいのでしょうか?

よろしくお願いします。
----------------------------------------------------------------------
こんばんは

数学の知識がなくてもエクセルがわかれば計算できますよ。
1回目に当たる確率 5/50
1回目にはずれて2回目にあたる確率は (1-5/50)*(5/49)
この和が2回目までに少なくても1回は当たる確率になります。
これをシミュレートすればいいです。

A B C D
1 2 50 5 0.191836735
2 1 50 0.1 0.1
3 2 49 0.091836735 0.191836735
4 3 48 0.084183673 0.276020408
5 4 47 0.077019106 0.353039514
6 5 46 0.070321792 0.423361306
7 6 45 0.064070966 0.487432272
8 7 44 0.058246333 0.545678604
9 8 43 0.052828069 0.598506674

A2 = ROW()-1
B2 = B1
C2 = C1/B1
D2 = C2
A3 = ROW()-1
B3 = B2-1
C3 = (1-D2)*(C$1/B3)
D3 = D2+C3
A3:D3を下にフィル
D1 = INDEX(D2:D50,MATCH(A1,A2:A50,0))
です。

結局、
>「1-(一回も当たらない確率)」
1-FACT(B1-C1)/FACT(B1-C1-A1)*FACT(B1-A1)/FACT(B1)
と同じ結果になります。

私はエクセル的に解く上のやり方のほうが好きです。
---------------------------------------------------------------------
>=1-HYPGEOMDIST()で求められます。
そんな関数もあったんですね。
=SUM(IF(ROW(A1:A50)<=A1,HYPGEOMDIST(ROW(A1:A50),A1,C1,B1),))
Ctrl + Shift + Enter で確定です。

3段階入力規則~50音~

2006-09-03 23:21:22 | Weblog
作業シートに
A B C D E F G H I J
1 あ行 あ い う え お
2 か行 か き く け こ
3 さ行 さ し す せ そ
4 た行 た ち つ て と
5 な行 な に ぬ ね の
6 は行 は ひ ふ へ ほ
7 ま行 ま み む め も
8 や・ら・わ行 や ゆ よ ら り る れ ろ わ
A B C
9 あ あいおい自動車 あべ商店 …
10 い いとう産業 …

52 わ    わじま企画 …
--------------------------------------------------------------------
上記のようなデータテーブルを用意します。
9行目以降B列にデータがなければダミーでスペースを入れておきます。
1~52行目を選択して、Ctrl + G→セル選択→定数→OK
挿入→名前→作成→左端列のみにチェックを入れてOK
A1:A8を選択して、Ctrl + F3→名前を リスト としてOK
あとは入力するセルを選択して(例:G1)、データ→入力規則→
入力値の種類:リスト
元の値:=IF(G1="",INDIRECT("リスト"),INDIRECT(G1))
OK

入力間違いのときは一度Deleteして最初から選択しなおします。

可変串刺し計算

2006-06-09 20:50:54 | Weblog
串刺し計算で、たとえばSheet3のB1に=SUM(Sheet1:Sheet3!A1)とすれば、Sheet1からSheet3までのA1を合計することができますが、Sheet3をシート複写してSheet4を作ったときにSheet4のB1にSheet1からSheet4までのA1の合計を出すようにしたいんです。今それをやろうとすると、その式ではエラーになってしまいます。
-----------------------------------------------------------------
=SUMPRODUCT(SUMIF(INDIRECT("Sheet"&ROW(INDIRECT("1:"&SUBSTITUTE(RIGHT(CELL("filename",A1),2),"t","")))&"!A1"),"<>"))


参照数式の自動作成

2006-04-09 21:52:01 | Weblog
sheet1に以下のような一覧表があります。

  A列 めがね コンタクト ケース
 日付  合計  合計  合計
 4/1   0    1 3
 4/2   1 2 4
:   : : :
 4/30  0    5    30

sheet2以降は日付毎のシートになっております。
sheet1のセルB3に「='sheet2'!C3」セルC3に「='sheet2'!D3」セルD3に「='sheet2'!E3」
 〃 のセルB4に「='sheet3'!C3」セルC4に「='sheet3'!D3」セルD4に「='sheet3'!E3」

sheet2~sheet30まで手入力しているのですがとても手間がかかります。
この作業をオートフィルなど簡単に処理できる方法はないでしょうか。
どなたかお知恵をお貸しください。
----------------------------------------------------------------
B3 = "Sheet"&ROW(A2)&"!C$3"
として B32 までフィル。
B列をコピー、そのまま、形式を選択して貼り付け→値→OK
そのまま Ctrl + H
検索する文字列:Sheet
置換後の文字列:=Sheet
すべて置換
B3:B32を横にフィルでどうでしょう。