• ベストアンサー

エクセルのVBAの問題

エクセルのVBAでどうしてもわからない問題があるので教えて下さい。 問題. Aさんは日頃の功績を評価されて、ご褒美をもらえることになりました。そこで、「今日は米を1粒、明日は2粒、あさっては4粒…のように前の日の倍を次の日にいただきたい」と申し出ました。 さて、Aさんは30日間で何粒の米をもらうことができるでしょうか? また、1俵が40万粒だとすると、Aさんがもらった米は、全部で何俵になるでしょうか?

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

  • ベストアンサー
noname#140971
noname#140971
回答No.1

[イミディエイト] ? 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 ---日目までのご褒美の米粒の総数 --------------------------------------------------------------------- このように中途の計算結果を確認すれば確実かも知れないですね。

yoshihito
質問者

お礼

ご回答ありがとうございます 解き方のヒントとして (1)Aさんが30日間、毎日お米をもらいに行く→繰り返し構造 これが分かりません。 エクセルのシートに書き込まないとダメなんです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

noname#140971
noname#140971
回答No.8

      .Cells(x + 1, 3) = z     Next x   End With   MsgBox "総量は、約" & Int((1073741823 / 4000000) + 0.5) & "俵になります。" End Sub ※実は、おじさんは Excel は操作ことはないです。 ※ですから、質問者は十分に検証しないとトンデモナイことに・・・。

yoshihito
質問者

お礼

本当に長々とありがとうございました。実はこれは学校を1日休んでしまってその分の課題としての問題でした。いつもは友達と教えあったりしてたんですけど、いざ自分ひとりでやろうとするとできなくてどうしようかと思ってました。とても勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.7

実に意地の私の悪い回答に惑わされることなく正解に一直線。 恐れ入りました。 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 関数と同じ答えですので質問者の方向性は間違っていないと思いますよ。

yoshihito
質問者

お礼

俵の数をMsgboxで出す時はどうすればよいのですか?

全文を見る
すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.6

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

yoshihito
質問者

お礼

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 ここまでできたんですけど、もらったお米の合計がわかりません。

全文を見る
すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.5

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 の計算の仕方が違ってきます。 まあ、ヒントのようなヒントでないような・・・。 (訳の判らない回答に変貌させるのに苦心したなー。悪く思わんで下さい!)

yoshihito
質問者

お礼

Iは日数ですよね?J、Qはなんですか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

#2 です。 #3の方のご指摘どおり、A = 2^29/400000 では 30日めの分だけになってしまいますね。 申し訳ございませんでした。 #3の方のおっしゃるとおり、For や Loop を使った計算式となります。 最初、ちょっと工夫がいりますが、がんばってください。

全文を見る
すると、全ての回答が全文表示されます。
noname#78947
noname#78947
回答No.3

VBAの問題と言うよりは算数~初歩的な数学の問題だと思いますよ。1日ごとに2倍になっていくと言うことはn日目の米粒の数は式にすると下記になります。 2^(日数-1) これをFor文などを使ったループで足し算してやれば良いのです。問題の場合はズバリ回答を載せるのでは勉強にならないのでこれを参考に自分でプログラムを組んで見てください。組みあがったプログラムでエラーが起こった場合や計算結果がおかしい場合は補足欄で聞いてもらえれば回答しますよ。 >エクセルのシートに書き込まないとダメなんです。 これってプログラムで計算したあとにシートのセルに書き込むと言うことですか?それとも計算自体をシートで行うんですか? >VBAですと >A = 2^29/400000 >でしょうか。 考え方は合ってますけどこれでは間違いですね。30日間でもらった数を求めないといけないので2^0~2^29までを全て足さないといけませんよ。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

米粒の数は 1*2*2*2*2*2 ・・・・ *2 つまり 2の29乗 となりますから それを 400000で割る と 1342.17728 となります。 Excel の数式でいえば =POWER(2,29)/400000 ですが VBAですと A = 2^29/400000 でしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 指数・対数

    自分で問題を作ったのですが、意外に解けません。 どうやって解けばよいでしょうか。 やり方だけでもいいので、教えてください。 できたら、計算もお願いします。  問題 あなたは2024年1月1日(月曜日)から毎日2倍の米をもらう。 (つまり、1日目は1粒、2日目は2粒、3日目は4粒、4日目は8粒という具合です。) そして、毎週日曜日には3倍の米をもらう。だが、その日は2倍の3倍、つまり6倍の米とはならず、あくまでも3倍である。 (つまり、5日目は16粒、6日目は32粒で、7日目にはその3倍の96粒だけもらいます。) また、毎月最後の日にはあなたは1/4倍の米をもらう。 (つまり、その前日に20粒もらっていたとしたら、その月最後の日にもらうのは、5粒のみです。) では、5年後にはあなたは合計で何粒もっているか。  この問題の難しいところは、まず一定の倍数ではないことと、月の日にちが一定ではないことと、閏年を考慮しなければいけないところにあります。 それで頭を悩ませています。

  • エクセルVBAについて

    VBAに関しての質問です。 A列に日付(10行目から) B列にその日の売上が 300行(300日分)入力されてる表があるとします。 C列にその日を含めた過去N日間の最大の売上を表示させたいのです。 例えば 過去5日間なら過去5日間の最大売上げを毎日表示させたいのです 当然この場合は5日間なのでCの13行目までは空白になります。 「N」日はA1セルに任意の日数で入力することによって希望の期間の数値 が表示できるようにしたいのです。 関数を使ってできるのいですが、事情がありましてエクセルのマクロの 繰り返しのプログラムでやりたいのですが VBAに関しては全く素人ですの。どなたかご教授願えませんでしょうか よろしくお願いします。

  • エクセルVBAについて教えて下さい。

    エクセルVBAの質問です。 (1)の一覧から「出張」の項目のみを抽出し、別シートへ(2)のような形で記載したいのですが、VBA初心者なのでこれが出来るのかもよく分かりません。もし出来るならやり方を教えてください。 (1)  A     B     C   D E  F   G     H    I JOB NO   内容   担当者   日付    日数   行先   時間 02AAA001  出張   田中  2/2 ~ 2/4  3日間   名古屋  日勤 02AAA002  出張   佐藤  2/3 ~ 2/4  2日間   大阪   夜勤 02AAA003  作業   鈴木  2/5 ~ 2/8  4日間   工場   日勤 02AAA004  出張   吉田  2/4 ~ 2/6  3日間   東京   夜勤  ・  ・   ↓↓ (2)  A B   C     D     E     F       佐藤   田中   鈴木   吉田 2/1 日 2/2 月         名古屋 2/3 火  *大阪   名古屋 2/4 水  *大阪   名古屋     *東京 2/5 木                   *東京 2/6 金                   *東京 2/7 土  ・  ・ ☆出張の場合のみ(2)表に記載する ☆日付、曜日、氏名は既に入っていて、日付と氏名の交差する所に行先を入れる。 ☆夜勤の場合、行先の前に『*』を入れる。 説明が下手ですみません。分かる方いらっしゃいましたらお願い致します。

  • ExcelのVBAで高速に組換え処理がしたい

    スケジュールの組み合わせを何通りか導き出すプログラムを作成しているのですが、苦戦しております。 開発言語はExcelのVBAです。VBAの中で配列か変数を使って設計しようと考えております。 やりたいことは、数値=コース番号としまして、複数あるコースを一列に並べて、1日に他のコースと被らないように並べ替えたいのです。 コースによって受講日数が変動しますので、例えばコースAは3日間なので111となります。コースF だと66になります。 これらを連結したものを、上下で同じコースが被らないように4つ配置したいのです。 コース同士は隣接するようにします。間が空かないように配置します。 【 コース番号 】 1・・・コースA(3日間)  5・・・コースE(1日間) 2・・・コースB(3日間)  6・・・コースF(2日間) 3・・・コースC(3日間)  7・・・コースG(1日間) 4・・・コースD(2日間) 【 条件 】 ・コースは互いに隣接しているようにする(コース間が空くことがないようにする) ・7のコースGはコースとコースの間に挟まるように配置し、1行目と2行目が同じ日になるように配置します。また、3行目と4行目が同じ日になるようにします。 ・コースの順序に制限はありません。 下記のように数値を一列に並べて、 1 1 1 2 2 2 3 3 3 4 4 5 6 6 7 更に上下で被らないように4行分並べます。 例外として7のコースBだけは端っこには配置させないようにして、尚且つ1行目2行目が同じ日に実施するようにし、3行目と4行目も同じ日になるようにします。1行目2行目と3行目4行目が同じ日にならないようにします。 下のは最終的に組み替えられた1つの結果になります。 2 2 2 7 4 4 4 3 3 1 1 1 6 6 5 … 1行目 1 1 1 7 2 2 2 6 6 5 3 3 4 4 4 … 2行目 4 4 4 5 7 3 3 2 2 2 6 6 1 1 1 … 3行目 3 3 6 6 7 5 1 1 1 4 4 4 2 2 2 … 4行目 この結果を含めて何パターンか高速に出力するプログラムをどのように書いたらいいか 教えて頂けると非常に助かります。 宜しくお願いします。

  • エクセルのVBA初心者です。教えてください。

    エクセルVBAの勉強を始めたばかりのものです。無知を自覚しながら質問させていただきます。 宜しくお願い致します。 下のようにエクセルの表があります。 B列の中から例えば5月13日が今日だとして本日の日付のものを探し、見つけたらその隣の列の A列の通番を参照しピックアップしたら、別のシートに作ってある番号ばかりのシート表の中のその通番のセルを塗りつぶすという一連の作業のVBAを作りたいのですがどうしたらいいのでしょうか? 問題の説明不足で意味が通じるかが心配なのですが、本日の日付をB列から見つけてその通番 をピックアップするVBAを教えて頂けたらとおもい、質問しました。 ちなみに日付は5/13の形式で入力しています。 A B 1 5月13日 2 3 4 5 5月13日 6 6

  • この問題のやり方と答えを教えて下さい!

    この問題のやり方と答えを教えて下さい! A、Bの2人で10日間働くと完成する仕事がある。この仕事をA、B、Cの3人ですると5日間で終わる。AとBの能力が同じであるとするとCの能力はAの能力の何倍になるか。

  • 数学の問題(高校?レベル)

    たぶん高校レベルだとは思うのですが 数学のどの単元にあたるものかは分かりません。 私は中3レベルの学力も無いかと思います。 なので、この問題を解く為に必要な知識を、高校で習うのだとすれば 計算の仕方を教えて頂いても理解できない可能性が高いので、その点だけ回答いただくだけで構いません。 問題は あるりんご園でりんごの収穫を終えるのに、A~Dの4人が共同で行うと3日間を要し、Aだけで行うと12日間を要し、Cだけで行うと9日間を要し、Cだけで行うと18日間を要する。この収穫を、Dだけで終えるのに要する日数はどれか。 ただし、A~Dのそれぞれが行う1日当たりの仕事量は、一定であるものとする。 選択肢は4日・8日・12日・16日・20日です。 問題を見て、色々考え 解けそうだけど解けないモヤモヤ感と戦っていたのですが 結局、当てずっぽうに近い形で12日を選んだところ正解でした。 色々考えた結果、 最終的に、A~Cのそれぞれは 4人でやる時と、1人でやる時の時間を比べると 4人でやる時より、Aは4倍、Bは3倍、Cは6倍かかると気付いたのですが、 それをどう活用するかも分からず 選択肢を見ていて、3で割れるのは12だけだなと思い12を選んだという感じです。 解説では1/12,1/9,1/18と残るDを足したものに3をかけると1になるという計算をしていました。 実は分数にするのかなとかいう事も頭には浮かんだのですが、なぜ分数にするのか自分の中で説明がつかず、試してはいませんでした。(分数にする事は浮かびましたが、=1にするところは浮かばなかったので、結局解けなかったと思いますが) 数字というよりは言葉で詳しい解説等いただけると助かります。 (中3レベルもあやふやなところがある私には理解しがたいレベルであればその点だけ回答いただければ構いません)

  • Excel VBAで変動する行数から日数の計算

    ExcelのVBAを使い下記のようなことをしたいと考えています。 「問題の発生した日数を月毎に計算」(件数ではなく日数です) 前提条件として以下のようなものが手元にあります。 ・問題が発生した日、時間、内容が1行1件で出力されたCSVファイル(月毎にファイルは別れているので、1つのファイルの中に何日あるかの判定だけで良いです) sample  2018.10.5,11:05,問題A  2018.10.5,15:06,問題B  2018.10.12,16:33,問題B  2018.10.25,10.55,問題C これをExcelの関数でやるには =SUMPRODUCT(1/COUNTIF(A1:A25,A1:A25)) のようにすればいいかと思います。 (ここまで合ってますでしょうか) これをExcel VBAに入れ込みたいのですが、どうしたらよいかわからない部分があります。 このCSVは発生した件数分行数があり、月により行数が異なります。 その為、まず末尾の行数を先に調べて、変数として関数に入れ込んでやる必要があると考えています。 なので、以下のように考えましたが動作せずどこが間違っているかわからない状態です。 ご教示いただけますと幸いです。 なお、本来はこの手の計算をVBAでやるのであれば関数を埋め込むのではなくVBA上で計算すべきというご意見もあるかとは存じますが、他の部分への流用性なども考慮し、関数に埋め込むことを前提でお願いいたします。 <作ってみた式> MaxRow = Range("A1").End(xlDown).Row MsgBox Application.WorksheetFunction.SUMPRODUCT(1/Application.WorksheetFunction.COUNTIF(A1:MaxRow,A1:MaxRow)) 最近VBAの勉強を始めたばかりの初心者故、基本が出来ていない部分があるとは思います。 式を書く上で上記から抜け落ちている大原則とかもありましたらご指摘いただけますと大変助かります。 よろしくお願いいたします。

  • クリスマスケーキを1ホール。

    普段はダイエット中なので殆どケーキは食べないのですが、知り合いの方から明日クリスマスケーキを頂く事になりました。このケーキなのですが、この時だけ!の気持ちで1人で食べてしまいたいのですが2日間に分けて1ホール食べても3日目から調節して食事を戻せば急激に太る事はないでしょうか?日頃の自分へのご褒美に思いっきり食べてみたいな~♪なんて少し楽しみなのですが、やはり後で大後悔しそうな感じもしそうな?勿論ケーキの日はケーキだけ食べます。栄養バランスが悪くても2日間だけはケーキメインに幸せを感じたいな♪

  • Excel VBA コードを教えて下さい!

    お世話になっています。 今回は、次の事を実現するコードを教えて頂きたいと思います。 <データ入力ブック> A1=Book1 <----- 転記先のブック名(Excel文書名) A2="AAA" この<データ入力ブック>に入力されたデータを手掛かりにしてサブディレクトリにあるBook1のSheet2!A2に"AAA"を転記し保存。 ※2004年頃を最後にAccessのVBAにも触れていません。Excelは、一度も操作したこともなく同VBAは初めてです。 ※バージョンは、Excel2007。文書は、2003等との互換モード。 厚かましいお願いとは承知していますが、教えてもらえるととっても助かります。 非常に複雑な円の配置が自動化されたので私の仕事は明日で終わります。 月曜日からは、200文書へのデータ入力。 一々、200もある文書を検索して開いて当該のセルを探して入力していたのでは手間。 そこで、<データ入力ブック>に10項目程度の入力欄を設けて入力。 <データ入力ブック>でデータの入力・訂正も管理し、そして一括更新。 そういう仕組みを日曜日の夜の3、4時間で完成したいと思っています。 そういう事情ですので、教えてもらえるととっても助かります。

このQ&Aのポイント
  • E W-M530Fはスキャナーですが、USBに取り込みすることはできるのでしょうか?また、もしUSBに取り込むことができない場合、直接PCにスキャンしたデータを転送する方法はあるのでしょうか?
  • E W-M530Fというスキャナーで、USBに取り込むことができるのでしょうか?もしできない場合、直接PCにスキャンしたデータを転送する方法を教えてください。
  • E W-M530Fというスキャナーで、USBにデータを取り込むことは可能なのでしょうか?もし可能でない場合、スキャンしたデータを直接PCに転送する方法を教えてください。
回答を見る