- ベストアンサー
エクセルのVBAの問題
エクセルのVBAでどうしてもわからない問題があるので教えて下さい。 問題. Aさんは日頃の功績を評価されて、ご褒美をもらえることになりました。そこで、「今日は米を1粒、明日は2粒、あさっては4粒…のように前の日の倍を次の日にいただきたい」と申し出ました。 さて、Aさんは30日間で何粒の米をもらうことができるでしょうか? また、1俵が40万粒だとすると、Aさんがもらった米は、全部で何俵になるでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
[イミディエイト] ? 1 + 1*2 3 ? 3 + (1*2)*2 7 ? 7 + ((1*2)*2)*2 15 もっとも簡単なコードはこのようだと思いますね。 [イミディエイト] 1 --- 日目 1 --- 日目のご褒美の米粒 1 --- 日目までのご褒美の米粒の総数 --------------------------------------------------------------------- 2 --- 日目 2 --- 日目のご褒美の米粒 3 --- 日目までのご褒美の米粒の総数 --------------------------------------------------------------------- 3 --- 日目 4 --- 日目のご褒美の米粒 7 --- 日目までのご褒美の米粒の総数 --------------------------------------------------------------------- 4 --- 日目 8 --- 日目のご褒美の米粒 15 ---日目までのご褒美の米粒の総数 --------------------------------------------------------------------- このように中途の計算結果を確認すれば確実かも知れないですね。
その他の回答 (7)
.Cells(x + 1, 3) = z Next x End With MsgBox "総量は、約" & Int((1073741823 / 4000000) + 0.5) & "俵になります。" End Sub ※実は、おじさんは Excel は操作ことはないです。 ※ですから、質問者は十分に検証しないとトンデモナイことに・・・。
お礼
本当に長々とありがとうございました。実はこれは学校を1日休んでしまってその分の課題としての問題でした。いつもは友達と教えあったりしてたんですけど、いざ自分ひとりでやろうとするとできなくてどうしようかと思ってました。とても勉強になりました。
実に意地の私の悪い回答に惑わされることなく正解に一直線。 恐れ入りました。 1__1__1 2__2__3 3__4__7 4__8__15 5__16_31 | | | | | +--> 何日目までの米粒総量 | +-----> 何日目の米粒 +--------> 何日目 このように表示するサンプルコードの一つは次のようです。 Private Sub CommandButton1_Click() Dim x As Integer Dim y As Long Dim z As Long With Sheet1 For x = 1 To 30 y = 2 ^ (x - 1) z = z + y .Cells(x + 1, 1) = x .Cells(x + 1, 2) = y .Cells(x + 1, 3) = z Next x End With End Sub 30__536870912__1073741823 [イミディエイト] ? PowerSum(2, 29) 1073741823 PowerSum 関数と同じ答えですので質問者の方向性は間違っていないと思いますよ。
お礼
俵の数をMsgboxで出す時はどうすればよいのですか?
i ・・・・ループカウンター。 j ・・・・日付(今日はゼロ日目とは言わずに i+1日目と言う。j=i+1) q ・・・・quantity (数、量)の頭文字。2^XXX は総数じゃないことを示唆。 Private Sub CommandButton1_Click() Dim I As Integer Dim J As Integer Dim q As Long For I = 0 To 29 q = xxxxx J = J + 1 Debug.Print J & "日目=" & q Next I End Sub 最終的には q ではなく s を用いるべきでしょうね。 「目で見たら意味が判る書き方を!」と言いたかった訳です。 Private Sub CommandButton2_Click() Dim I As Integer Dim s As Long For I = 0 To 29 xxxxxxx Next I Debug.Print I & "日目の合計は" & s & "です。" End Sub
お礼
Sub ex() Dim x As Integer, y As Integer, z As Long With Sheet1 For x = 1 To 30 .Cells(x + 1, 2) = 2 ^ (x - 1) Next x End With End Sub ここまでできたんですけど、もらったお米の合計がわかりません。
1日目=1 2日目=2 3日目=4 4日目=8 ・・・・・ 29日目=268435456 30日目=536870912 Private Sub CommandButton1_Click() Dim I As Integer Dim J As Integer Dim Q As Long For I = 0 To 29 J = J + 1 Debug.Print J & "日目=" & XXXXXXX Next I End Sub XXXXXXX は質問者の手で・・・。 もちろん、それだけじゃ、先の回答の 15 ---4日目までのご褒美の米粒の総数 が出力されていません。 しかし、一日目、2日目の米粒数はちゃんと計算しています。 ですから、ゴールまでの半ば以上は示したと思いますよ。 この先は、自前のコードを書くことが先決ですね。 おまけ:ご褒美の米粒の総数を求める関数。 Public Function PowerSum(ByVal base As Integer, ByVal n As Integer) As Long Dim I As Integer Dim P As Long Dim S As Long P = 1 S = 1 For I = 1 To n P = P * base S = S + P Next I PowerSum = S End Function [イミディエイト] ? PowerSum(2,0) 1 ? PowerSum(2,1) 3 ? PowerSum(2,2) 7 ? PowerSum(2, 3) 15 <ご褒美の米粒の総数>を求めるヒントにされたし。 もちろん、この PowerSum関数を利用してもパクリと思われるのがオチです。 なお、上述の For文に組み込む場合はS の計算の仕方が違ってきます。 まあ、ヒントのようなヒントでないような・・・。 (訳の判らない回答に変貌させるのに苦心したなー。悪く思わんで下さい!)
お礼
Iは日数ですよね?J、Qはなんですか?
- RX-8_TURBO
- ベストアンサー率60% (12/20)
#2 です。 #3の方のご指摘どおり、A = 2^29/400000 では 30日めの分だけになってしまいますね。 申し訳ございませんでした。 #3の方のおっしゃるとおり、For や Loop を使った計算式となります。 最初、ちょっと工夫がいりますが、がんばってください。
VBAの問題と言うよりは算数~初歩的な数学の問題だと思いますよ。1日ごとに2倍になっていくと言うことはn日目の米粒の数は式にすると下記になります。 2^(日数-1) これをFor文などを使ったループで足し算してやれば良いのです。問題の場合はズバリ回答を載せるのでは勉強にならないのでこれを参考に自分でプログラムを組んで見てください。組みあがったプログラムでエラーが起こった場合や計算結果がおかしい場合は補足欄で聞いてもらえれば回答しますよ。 >エクセルのシートに書き込まないとダメなんです。 これってプログラムで計算したあとにシートのセルに書き込むと言うことですか?それとも計算自体をシートで行うんですか? >VBAですと >A = 2^29/400000 >でしょうか。 考え方は合ってますけどこれでは間違いですね。30日間でもらった数を求めないといけないので2^0~2^29までを全て足さないといけませんよ。
- RX-8_TURBO
- ベストアンサー率60% (12/20)
米粒の数は 1*2*2*2*2*2 ・・・・ *2 つまり 2の29乗 となりますから それを 400000で割る と 1342.17728 となります。 Excel の数式でいえば =POWER(2,29)/400000 ですが VBAですと A = 2^29/400000 でしょうか。
お礼
ご回答ありがとうございます 解き方のヒントとして (1)Aさんが30日間、毎日お米をもらいに行く→繰り返し構造 これが分かりません。 エクセルのシートに書き込まないとダメなんです。