• ベストアンサー

subプロシージャ

2次方程式a*x^2+bx+c=0えお解くプログラムを考える。メインプロシージャmain1がsubプロシージャread1,solve1,display1を1回ずつ呼び出す。プロシージャread1で変数a,b,cにinputboxで整数値を入力する。プロシージャsolve1では、まず判別式D=b^2-4*a*cを計算して、D>0の場合にはx1、x2に実数解x1=(-b+sqr(D)/(2*a)、x2=(-b-sqr(d)/(2*a)を求める。D<0の場合はx1に実部-b/(2*a)を、x2に虚部sqr(-D)/(2*a)を求める。プロシージャdisplay1は入力された3つの整数値とsolve1で得られた2つの変数x1.x2の値を判別式Dの符号に応じてMsgbox関数で表示する。 以上のプログラムをモジュールレベル変数を用いてつくりなさい。 Sub read1() '問10(1) Dim a As Integer, b As Integer, c As Integer a = InputBox(" aの値を入力して") b = InputBox(" bの値を入力して") Sub solve1() D = b ^ 2 - 4 * a * c If D > 0 Then x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) Else x1 = -b / (2 * a) x2 = Sqr(-D) / (2 * a) Sub display1() End Sub ここまでやったのですがこの先どうやるかわかりません。 おしえてください。 あとモジュールレベル変数ってなんですか?

  • 40one
  • お礼率45% (16/35)

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

  • ベストアンサー
回答No.4

ヘルプ確認しましたか?? もしかして、関数自体の使い方を知らないとか? でも、inputbox関数使ってるしね・・・ msgbox関数は、プログラミングの基本中の基本ですよ・・・ Sub display1() <- display1というサブプロシージャ End Sub <- display1というプロシージャの最後 ってことは、わかってるんですよね? msgbox関数は、そのプロシージャの中に書けばいいだけなんですが・・ 取り合えず、プロシージャの中に、 msgbox("メッセージです",0,me.text) って入れて、動作を確認してみたらどうですか? 動作が確認できれば、どこにどれを書けばどうなるのかわかると思いますよ。

40one
質問者

補足

回答ありがとうございます。 初心者なんでプログラミングの基礎ができてません。 でもどんどん先に進まれてしまい・・・ とにかくヒントをもとにやってみます。

その他の回答 (4)

回答No.5

あれれ? このままだとオーバーフローでエラーになるでしょ? ならなかったのかな? a,b,x1,x2がモジュールレベルで宣言してないないから、エラーになるはずだけど、どうですか? 変数というのは、ブロック内、もしくはプロシージャ内とかあらゆる場所で共有できる範囲が決まっています。ここでのモジュールレベルというのは、そのフォーム(フォームがあれば)全体で使える変数ってことでいいと思いますが・・・

40one
質問者

お礼

ありがとうございます 解決しました

回答No.3

問題にmsgbox関数で表示するって書いてるから、msgbox() <-引数は参考URLを。ヘルプで「msgbox関数」を検索するとすぐ出るのですが・・ 変数やリテラルなどは、一般的に & でくっつきます。 End Sub も抜けてるけど、End Ifも無いよ・・・

参考URL:
http://msdn2.microsoft.com/ja-jp/library/139z2azd(VS.80).aspx
40one
質問者

補足

display1() のヒントをもう少しもらえませんか? msgbox関数をどのようにいれればうまくできるのでしょうか? 教えてもらえるとありがたいです。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

こんな宿題の丸写しのような質問は、規約的見地から、ご遠慮いただくタイプの質問ではないですか。先生に聞くとか、回答の解説発表が後日あるのでしょう。 >モジュールレベル変 WEB照会(例えばGoogle)で、「モジュールレベル変数」(VBを加えるか)で照会してください。 http://www.bcap.co.jp/hanafusa/VBHLP/hensu.htm (1例) 沢山説明記事が出ます。 同時に「変数 スコープ」も照会してみたら ーー VBではコードの単位は Sub END Sub です。End Subがないのが散見される。 それを分けると変数のスコープの外にナリ、その変数を使えないので 簡単な問題では、できるだけ、単一の中にまとめては。 例 変数入力受け取りと判別式・根の公式計算計算を分けない。

40one
質問者

お礼

解決しました。 ありがとうがざいます

  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.1

そのモジュール内でのみ有効な変数です。 同じ変数(文字が同じ)でも違うモジュールでは別の変数として扱われます。 課題は、自分の力でやらないと身に付きませんよ? 出来ないのなら、出来たところまでで提出しましょう。それがあなたの実力なのですから。 なんだ、こいつは出来るんじゃないかと思われてどんどん先に進まれるよりは、立ち止まって補習などで勉強した方があなたの為になるような気がしてきました・・・

40one
質問者

お礼

自分の力でやりたいんですけど初心者なんで できないんです。 授業もどんどん進み、質問しても答えてもらえないのです。 実際に授業を受けてもらえればわかります。 答えがほしいんではありません。 ヒントがもらえればと思いしつもんしました。 理解してもらえればありがたいです。

関連するQ&A

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • 引数付のFuncitonプロシージャと引数付のSUBプロシージャの違い

    親プロシージャに数値を渡すときに、引数付のFuncitonプロシージャと引数付のSUBプロシージャは、結果を見ると同じ動きをするように思います。 このような場合、両者には、どのような違いがあるのでしょうか? Sub 親プロシージャ() Cells(1,MyNOend)=123 end Sub ・子プロシージャ Function FMyRowCnt(MyNOend As Integer) MyNOend = TMYKanriBkWs1.Range("D1").CurrentRegion.Rows.Count End Function Sub FMyRowCnt(MyNOend As Integer) MyNOend = TMYKanriBkWs1.Range("D1").CurrentRegion.Rows.Count End Sub 以上 よろしくお願い致します。

  • vbs subプロシージャーにするべきなの?し

    vbs subプロシージャーにするべきなの?しないべきなの? call a sub a() msgbox "b" end sub vbsでこのコードを実行すると問題なく動くのですが、 call a をsubとend subで囲わなくていいのでしょうか?

  • 足し算の結果のみが変!?

    ExcelVBAでinputbox()やuserformのtextboxから値を取得する場合に Sub prog() Dim a, b, c As Integer a = InputBox("値1を入力") b = InputBox("値2を入力") c = a + b MsgBox c End Sub とすると,例えば(値1)=2,(値2)=3としたときにメッセージボックスに本来であれば2+3なので5と表示されるはずですが23と表示されてしまうのはどうしてでしょうか。引き算や掛け算,割り算の場合はちゃんと表示されるのですが、、、

  • msgboxの値をシリアル値で表示するには?

    お世話になります。 エクセル2010VBA初心者です。 以下の手順で msgboxの値をシリアル値で表示するには どうすればいいのでしょうか? Sub シリアル値で表示() a = InputBox("年を入力してください") b = InputBox("月を入力してください") c = InputBox("日を入力してください") d = a & "年" & b & "月" & c & "日" MsgBox d End Sub 宜しくおねがいいたします。

  • VBA Functionプロシージャで複数の値を

    エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として 受け取る方法を考えています。 下記のようなサンプルプログラムを作りました。 --------------------------------------------------------------------------------- Option Explicit Private Sub CommandButton1_Click() Dim kekka(3) As Double Dim txt As String txt = "12.12A,34.34B,56.56C,78.78D" kekka(0) = test(txt) End Sub Public Function test(ByVal text As String) As Double Dim txt_kakou(3) As String '## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し '## 下記のように配列txt_kakou(3)に振り分ける '## 加工方法は割愛 txt_kakou(0) = 12.12 txt_kakou(1) = 34.34 txt_kakou(2) = 56.56 txt_kakou(3) = 78.78 'string型からdouble型に変換する。 txt_kakou(0) = CDbl(txt_kakou(0)) txt_kakou(1) = CDbl(txt_kakou(1)) txt_kakou(2) = CDbl(txt_kakou(2)) txt_kakou(3) = CDbl(txt_kakou(3)) test = txt_kakou() End Function ----------------------------------------------------------------------------------- まず、呼び出し側のプロシージャでkekka(3)という配列を宣言します。 次に変数txtに「"12.12A,34.34B,56.56C,78.78D"」の文字列を代入します。 そして変数txtをFunctionプロシージャに投げます。 Functionプロシージャでは、受け取った「"12.12A,34.34B,56.56C,78.78D"」 を数値のみに分解し、4つの変数に代入します。 この4つの変数も配列で用意し、txt_kakou(3)とします。 このtxt_kakou(3)を呼び出し元に返し、呼び出しもとの変数kekka(3)に入れたいのです。 また、はじめ変数txtに代入される値は文字列ですが、この文字列をFunctionプロシージャで分解し、 分解した値は、最終的には数値として扱いたいので、途中でdouble型に変換しています。 これを実行すると、Functionプロシージャの最後のtest = txt_kakou()で、型が一致しません といわれてしまいます。 どのように書き直せばいいのでしょうか。 よろしくお願いします。

  • エクセルVBAの次のコードの意味教えて下さい。

    Sub macro1() Dim a As Integer, b As Integer a = 1 b = 5 macro2 a, b MsgBox a + b End Sub Sub macro2(c As Integer, d As Integer) c = c * 10 d = d * 5 End Sub 答えは35と出ます。 よろしくお願いします。

  • VB.NETの関数プロシージャの書き方を教えてください。

    Public A As String という変数にある文字列データが入っていて、 ボタンを押すとその時に変数X,Y,Zに入っている 文字列を検索してButton1_Clickプロシージャ内に戻って来て KekkaX,KekkaY,KekkaZに数値が入るような関数プロシージャなのですが、 呼び出す部分の書き方と関数のプロシージャ名の書き方を教えて頂きたいです。 検索する部分は自分で出来ると思うので大丈夫です。 Public A As String = "何かの文字列" Button1_Click Dim X,Y,Z As String Dim KekkaX,KekkaY,KekkaZ as Integer '変数Aの中からX,Y,Zを検索したい X="*****" Y="ABCDE" Z="#####" GetKensakuKekka(????????) ←この部分の書き方を教えて下さい。 'KekkaX,KekkaY,KekkaZ 内に検索結果を取得したい Console.WriteLine(KekkaX) Console.WriteLine(KekkaY) Console.WriteLine(KekkaZ) End Sub Function GetKensakuKekka (???????????) ←この部分の書き方を教えて下さい。 ・ ・ ・ End Function よろしくお願い致します。

  • セルから呼び出したプロシージャ内でセルの塗りつぶし

    初めて質問させていただきます 宜しくお願い致します セルから呼び出したプロシージャ内からセルの塗りつぶしを 実行しても塗りつぶしが有効になりません たとえば A1のセルに10を入力 B1のセルに=TEST(A1) と入力 マクロのモジュール内に Public Function TEST(tmp_No As Integer) As Integer TEST = tmp_No * 25 '(1)ここから If TEST = 250 Then    'Msgbox "チェック用MSG"    Cells(1, 1).Interior.ColorIndex = 38 End If '(2)ここまで End Function というファンクションプロシージャがあるとします 引数で10を持って行ってるので10×25で TESTが250になりB1には計算結果として 250と問題なく表示されています しかし (1)~(2)のセルの塗りつぶしは実行されません 仮にチェック用のメッセージボックスのコメント を外すとキチンとメッセージボックスは 表示されます また、塗りつぶしダケのマクロを作成し Public Sub cell_paint()    Cells(1, 1).Interior.ColorIndex = 38 End Sub 実行すると、これも問題なく動作しますので EXCELの設定ではないと判断しています セルから呼び出したプロシージャの時 だけ、動作しないようなのですが なぜでしょうか? 他の方法で回避可能でしょうか? ※実際には塗りつぶしの判定方法が  20個あり、条件付書式では対応出来ないので  マクロで処理を試みてます 宜しくお願い致します

  • 二次関数で

    任意の二次方程式(ax^2+bx+c=0)を解くプログラムを作るのですが、以下の条件を満たした方法で作るというものです。 1、関数の引数は、3つの係数と、解の入る変数二つとする。 (計5つの引数をとる。) いずれかの引数がアドレス渡し(ポインタ)になる。 2、解は関数呼出の時に指定した2つの変数にそれぞれ代入されること。 3、解の表示は関数側ではなく呼出側で行うこと。 4、グローバル変数は使用しない。 一応作ってみたのですがコンパイルすらできません。 初心者なので全くわかりません教えてください。 #include<stdio.h> #include<math.h> void solve(double *x, double *y); int main(void) { double x,y; solve(&x,&y); return 0; printf("x=%f\n", x); printf("y=%f\n", y); } void solve(double *x, double *y) { doble a,b,c; puts("二次方程式 a*x^2+b*x+c=0 を解きます"); puts("係数a, b, cを入力してください"); printf("a="), scanf("%lf", a); printf("b="), scanf("%lf", b); printf("c="), scanf("%lf", c); putchar('\n'); double d = b * b - 4 * a * c; if(d >= 0){ x = (-b + sqrt(d)) / (2 * a); y = (-b - sqrt(d)) / (2 * a); } else puts("虚数解"); }

専門家に質問してみよう